Преносим UART терминал

преносим
От дълго време, в допълнение към обмислянето на периферни устройства, има голямо желание да се правят повече устройства, но това, което изглежда интересно, отнема много време, изглежда, че не се нуждаете от нищо за себе си или за дома си, а правенето на устройства без цел е някак мързеливо 🙂 В творческите мъки на „да бъдеш или да не бъдеш“, все пак реших, че „да бъда!“, така че постепенно ще надграждам уменията си.

Овладяването на STM беше добро послание, първият шал беше тестов, много тънкости излязоха на него. Все пак, в сравнение с AVR, за да започнете да работите със STM, би било хубаво да имате поне малко опит с микроконтролери. Въпреки че има мнение, че стартирането с stm не е по-трудно, отколкото с avr.

Като цяло реших да консолидирам запознанството си с хардуера на STM, някакво устройство, без значение какво. Дълго време мислех какво да направя полезно, прегледах много различни сайтове, накрая ми хареса идеята за преносим тестов UART терминал. Тази идея може да се намери в различни сайтове, в различни варианти. Накратко, това е самостоятелно устройство, с дисплей и UART вход, можете да се свържете с него и да видите входящите байтове. Разбира се, когато има поток от данни, устройството е безполезно, но ако са данни за отстраняване на грешки, тогава ползата е очевидна, т.е. използвайте вместо компютър с терминал.

И има много място за въображение, например можете да го използвате просто като дистанционен дисплей за показване на информация или например, когато тествах радиомодулите на открито, очевидно няма да работите с лаптоп, трябваше да прикача светодиод за отстраняване на грешки, но не е много информативен, но преносим дисплей с UART вход би бил много удобен. В крайна сметка USB портовете на моя лаптоп почти винаги са задръстени и всеки път закачането на Ft232 е досадно, но хвърлете един кабел и всичко е ок.

НеобходимоТрябва да се отбележи, че преди да бъде направено устройството, се съмнявах в неговата полезност, но по времето, когато тази статия беше написана, тя вече е в разгара си и е била полезна повече от веднъж.

Като дисплей се използва дисплеят от Nokia 1202. Преди шест месеца Steep zero (Sergey) спомена този дисплей в групата на VK и Михаил предложи магазин, където могат да бъдат закупени, благодаря им за това. Можете да намерите грешка във факта, че дисплеят е така, резолюцията е 96 * 68, има малко символи и текстът е малък, НО всъщност за парите, които се продават, няма алтернатива като цяло. Трябва да кажа, че ми хареса много повече от същия wg12864.

Пример за работа с дисплей беше изпратен от същата стръмна нула 🙂 пример за кокос под stm32f4discovery В моята програма току-що преместих функциите за работа с дисплея в отделна библиотека и преправих настройките за моя микроконтролер stm32f103c8t6. Той има 2 yuarts, извадих и двете на парче желязо, дали второто е полезно или не, времето ще покаже, добавянето на парче код е по-лесно от запояването на нова платка.

Принципно схемата е проста, изведени са четири пина с UART1 и UART2, четири за програматора, конектор за дисплея и два бутона. Захранваща верига 3.3V.

uart

Платката се оказа не без задръствания, един проводник падна, трябваше да запоявам сопола, но все пак умението да овладеете фоторезиста бавно расте.

терминал

Залепих дисплея към платката с термични сополи, не е естетично, но практично 🙂

lcd_gotoxy

Трябва да се отбележи, че когато начертах диаграмата, не прочетох особено листа с данни. В резултат на това се оказа, че дисплеят се озова на един от крачетата на JTAG, който е активиран по подразбиране. В резултат на това деактивирах JTAG заедно със SWD 🙂 Оказа се, че можете да го включите отново, но за това камъкът трябва да е в състояние RESET и за това ви трябва, на кракаNRST пада ниско, но лош късмет, NRST не е изведен 🙂 Би било възможно да се използва Bootloader, но според моята схема той е здраво заземен 🙂 Трябваше да забия игла в крака на NRST през лупа. Следователно, най-малкото: не забравяйте да изведете контактната подложка под NRST и свържете крака Boot0 през джъмпер, който може да бъде разпоен, и дори по-добре, изведете ги към щифтовете.

#include #include #include #include #include #include #include uint8_t FIFO_BUFF[128]; char temp_buff [16]; uint8_t шестнадесетичен = 0; uint8_t getcount = 0, setcount = 0, setup = 0, posY=0, ps = 0; uint32_t baudRate = 9600; vo >DR; if(getcount == 127)getcount=0; > > int main(void) < RCC_ClocksTypeDef RCC_Clocks; RCC->CR=((uint32_t)RCC_CR_HSEON); докато (!(RCC->CR & RCC_CR_HSERDY)) <>; RCC->CFGR &=

RCC_CFGR_SW; // Изчистване на битове SW0, SW1. RCC->CFGR = RCC_CFGR_SW_HSE; // Изберете HSE за тактова честота SW0=1. RCC_GetClocksFreq(&RCC_Clocks); lcd_pin_init(); lcd_init(); lcd_gotoxy(0,0); lcd_puts("uart терминал"); _закъснение_ms(1500); lcd_clear(); GPIO_InitTypeDef buttons_setup; buttons_setup.GPIO_Speed ​​​​= GPIO_Speed_2MHz; buttons_setup.GPIO_Mode = GPIO_Mode_IPU; buttons_setup.GPIO_Pin = GPIO_Pin_0 GPIO_Pin_1; GPIO_Init(GPIOB,&buttons_setup); lcd_gotoxy(1,0); lcd_puts("скорост 9600"); lcd_gotoxy(1,1); lcd_puts("скорост 19200"); lcd_gotoxy(1,2); lcd_puts("скорост 57600"); lcd_gotoxy(1,3); lcd_puts("скорост 115200"); lcd_gotoxy(0,0); lcd_puts(">"); докато (настройка != 5) < if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)== 0) < превключвател(поз.) < случай 0: скорост на предаване = 9600; прекъсване; случай 1: BaudRate = 19200; прекъсване; случай 2: скорост на предаване = 57600; прекъсване; случай 3: baudRate = 115200; прекъсване; по подразбиране: baudRate = 9600; прекъсване; >настройка=5; >if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)== 0 && (ps == 0) ) < lcd_gotoxy(0,posY); lcd_puts(" "); posY++; ако (posY >3)posY = 0; lcd_gotoxy(0,posY); lcd_puts(">"); ps = 1; > if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)== 1)ps = 0; > lcd_clear(); lcd_puts(">"); lcd_gotoxy(1,0); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef rx1_setup; rx1_setup.GPIO_Mode = GPIO_Mode_IPU; rx1_setup.GPIO_Pin = GPIO_Pin_10; rx1_setup.GPIO_Speed ​​= GPIO_Speed_2MHz; GPIO_Init(GPIOA, &rx1_setup); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); USART_InitTypeDef uart1_setup; uart1_setup.USART_BaudRate = скорост на предаване; uart1_setup.USART_HardwareFlowControl = USART_HardwareFlowControl_None; uart1_setup.USART_Mode = USART_Mode_Rx; uart1_setup.USART_Parity = USART_Parity_No; uart1_setup.USART_StopBits = USART_StopBits_1; uart1_setup.USART_WordLength = USART_WordLength_8b; USART_Init(USART1, &uart1_setup); USART_Cmd(USART1, ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitTypeDef NVIC_InitStructure; /* Активиране на прекъсването на USARTx */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); докато (1) < if(getcount != setcount) < if(hex == 1) < sprintf(temp_buff, "%x ",FIFO_BUFF[setcount++]); lcd_puts(temp_buff); >else lcd_putch(FIFO_BUFF[setcount++]); if(setcount == 127) setcount = 0; if(lcd_X >= 13 && lcd_Y == 7) lcd_clear(); > if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)== 0) < if(hex == 0)hex = 1; иначе шестнадесетичен = 0; ps = 1; >if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)== 1)ps =0; > >

Вижте как работи този позор

Устройството е много просто и като цяло няма трудности, може да се направи на AVR, но смисълът беше да се чувствате удобно със stm32f103, сега вече има минимална идея как да се сглобяват по-сложни схеми. Препоръчвам да вземете нещо подобно.