- Основи на UART комуникацията
- Хардуерни изисквания и настройка
- Електрическа схема за комуникация Nuvoton N76E003 UART
- UART щифтове на микроконтролера Nuvoton N76E003
- UART се регистрира в микроконтролера Nuvoton N76E003
- Режими на работа на UART в N76E003
- Програмиране на Nuvoton N76E003 за UART комуникация
UART означава универсален асинхронен приемник / предавател и е полезна хардуерна функция във всеки микроконтролер. Микроконтролерът трябва да получава данни, да ги обработва и изпраща до другите устройства. В микроконтролера има различни видове комуникационни протоколи, но UART е най-използваният сред останалите комуникационни протоколи като SPI и I2C. Ако някой трябва да получава или предава данни последователно, UART винаги е най-простият и често срещан вариант. Предимството на UART е, че изисква само два проводника за предаване на данни между устройствата. Продължавайки с нашия урок за микроконтролер Nuvoton, в тази статия ще научим как да извършваме последователна комуникация с помощта на микроконтролера N76E003.
Основи на UART комуникацията
Сега, тъй като знаем какво е UART, е важно да знаем свързаните параметри на UART.
Две UART устройства получават и предават данни с една и съща честота. Когато приемащото UART устройство открие стартов бит, то започва да чете входящите битове с определена честота, известна като скорост на предаване. Скоростта на предаване е важно за UART комуникацията и се използва за измерване на скоростта на трансфер на данни в битове в секунда (bps). Тази скорост на предаване за приемане и предаване трябва да бъде със същата скорост на предаване. Разликата в скоростта на предаване между приемащите и приемащите UART може да бъде само около 10%, преди времето на битовете да стане твърде далеч. Най-популярните скорости на предаване са 4800, 9600, 115200 bps и др. Преди това използвахме UART комуникация и в много други микроконтролери, които са изброени по-долу.
- UART комуникация между ATmega8 и Arduino Uno
- UART комуникация между два ATmega8 микроконтролера
- UART комуникация чрез PIC микроконтролери
- UART комуникация на STM8S микроконтролер
N76E003 има два UART - UART0 и UART1. В този урок ще използваме UART периферно устройство на микроконтролер N76E003. Без да губим много време, нека да преценим какъв вид хардуерна настройка изискваме за това приложение.
Хардуерни изисквания и настройка
Основният компонент, който се изисква за този проект, е модулът за преобразуване USB към UART или TTL, който ще направи необходимия интерфейс между компютъра или лаптопа с модула на микроконтролера. За този проект ще използваме модул USB към UART, базиран на CP2102, който е показан по-долу.
Да не говорим, освен горния компонент, ние се нуждаем от N76E003 базиран на микроконтролер борд за разработка, както и от Nu-Link Programmer. Може да се наложи допълнителен 5V захранващ блок, ако програмистът не се използва като източник на захранване.
Електрическа схема за комуникация Nuvoton N76E003 UART
Както можем да видим в схемата по-долу на платката за разработка, 2-ри и 3-ти щифт на микроконтролера се използват съответно като UART0 Tx и Rx. Най-вляво е показана връзката на интерфейса за програмиране.
UART щифтове на микроконтролера Nuvoton N76E003
N76E003 има 20 извода, от които 4 извода могат да се използват за UART комуникация. Изображението по-долу показва UART щифтовете, маркирани в червено квадратно поле (Rx) и Синьо квадратно поле (Tx).
За UART0, пин 2 и 3 се използват за UART комуникация, а за UART1, пин 8 и щифт 18 се използват за комуникация.
UART се регистрира в микроконтролера Nuvoton N76E003
N76E003 разполага с два подобрени пълнодуплексни UART с автоматично разпознаване на адреси и откриване на грешки в кадрирането - UART0 и UART1. Тези два UART се контролират с помощта на регистри, категоризирани в два различни UART. В N76E003 са налични две двойки RX и TX щифтове за UART операции. По този начин първата стъпка е да изберете желания UART порт за операции.
В този урок ще използваме UART0, като по този начин конфигурацията ще бъде показана само за UART0. UART1 ще има същата конфигурация, но регистрите ще бъдат различни.
След като изберете един UART (UART0 в случая), I / O щифтовете, които са необходими за използване за RX и TX комуникация, трябва да бъдат конфигурирани като вход и изход. RX щифтът на UART0 е щифт 3 на микроконтролера, който е порт 0.7. Тъй като това е сериен порт за получаване на щифт, порт 0.7 е необходим, за да бъде зададен като вход. От друга страна, портът 0.6, който е вторият щифт на микроконтролера, е трансферен пин или изходен щифт. Трябва да се зададе като квази двупосочен режим. Те могат да бъдат избрани с помощта на регистъра PxM1 и PxM2. Тези два регистъра задават режими на вход / изход, където x означава номера на порта (например порт P1.0 регистърът ще бъде P1M1 и P1M2, за P3.0 това ще бъде P3M1 и P3M2 и т.н.) Конфигурацията може да се види на изображението по-долу-
Режими на работа на UART в N76E003
След това следващата стъпка е да се определи режимът на UART операции. Двата UART могат да работят в 4 режима. Режимите са-
Както виждаме, SM0 и SM1 (7-ми и 6-ти бит на регистър SCON) избират режима на UART операции. Режим 0 е синхронна операция, а останалите три режима са асинхронни операции. Въпреки това, генераторът на скорост на предаване и битовете на кадрите са различни за всеки режим на сериен порт. Всеки от режимите може да бъде избран според изискванията на приложението и това е същото и за UART1. За този урок се използва 10-битова операция със скорост на препълване на таймер 3, разделена на 32 или 16.
Сега е време да получите информация и да конфигурирате регистъра SCON (SCON_1 за UART1) за UART0.
Шестият и 7-ият бит ще зададат режима на UART, както беше обсъдено по-горе. Бит 5 се използва за задаване на мултипроцесорен комуникационен режим за активиране на опции. Процесът обаче зависи от това кой режим на UART е избран. Освен тези, битът REN ще бъде настроен на 1, за да активира приемането, а флагът TI ще бъде настроен на 1, за да се използва функция printf вместо персонализирана функция за предаване на UART0.
Следващият важен регистър е регистърът за управление на мощността (PCON) (таймер 3 бита 7 и 6 за UART1). Ако не сте запознати с таймери, разгледайте урока за таймера Nuvoton N76E003, за да разберете как да използвате таймери на микроконтролера N76E003.
Битът SMOD е важен за избор на двойна скорост на предаване в режим UART0 1. Сега, тъй като използваме таймера 3, контролният регистър на таймера 3 T3CON трябва да бъде конфигуриран. Въпреки това битовете 7 и 6 са запазени за настройката за двойна скорост на предаване на данни за UART1.
И стойността на предварително скалиране на Timer 3 -
5-битовият BRCK ще настрои таймера 3 като източник на тактова честота на предаване за UART1. Сега на листа с данни на N76E003 е дадена формулата за изчисляване на желаната скорост на предаване, както и зададена стойност на извадка за високия и ниския регистър на таймера 3 (16 бита).
Примерна стойност за източник на часовник от 16 MHz -
По този начин скоростта на предаване трябва да бъде конфигурирана в регистъра на таймера 3, използвайки горната формула. В нашия случай това ще бъде Формула 4. След това, стартирането на таймера 3 чрез задаване на TR3 регистъра на 1 ще завърши UART0 таймера за инициализация 3. За получаване и изпращане на данните на UART0 да се използва по-долу регистър-
Регистърът SBUF автоматично се конфигурира за получаване и предаване. За да получите данни от UART, изчакайте флагът RI да зададе 1 и прочетете SBUF регистъра и изпратете данните до UART0, изпратете данните до SBUF и изчакайте TI флагът да получи 1, за да потвърдите успешното предаване на данни.
Програмиране на Nuvoton N76E003 за UART комуникация
Частта за кодиране е проста и пълният код, използван в този урок, може да бъде намерен в долната част на тази страница. Обяснението на кода е както следва, UART0 се инициализира при 9600 скорости на предаване, използвайки изявлението в основната функция-
InitialUART0_Timer3 (9600);
Горната функция е дефинирана във файла common.c и тя конфигурира UART0 с таймер 3 като източник на скорост на предаване в режим 1 и със скорост на предаване 9600. Определението на функцията е както следва -
void InitialUART0_Timer3 (UINT32 u32Baudrate) // използвайте timer3 като генератор на Baudrate { P06_Quasi_Mode; // Задаване на UART щифт като квази режим за предаване P07_Input_Mode; // Задаване на UART щифт като входен режим за получаване SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 Double Rate Enable T3CON & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (Prescale = 1) set_BRCK; // UART0 източник на часовник за скорост на предаване = Timer3 #ifdef FOSC_160000 RH3 = HIBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / RL3 = LOBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / #endif #ifdef FOSC_166000 RH3 = HIBYTE (65536 - (1037500 / u32Baudrate)); /*16,6 MHz * / RL3 = LOBYTE (65536 - (1037500 / u32Baudrate)); /* 16,6 MHz * / #endif set_TR3; // Таймер за задействане3 set_TI; // За функцията printf трябва да се зададе TI = 1 }
Декларирането се извършва стъпка по стъпка, както беше обсъдено по-рано, и регистрите се конфигурират съответно. Обаче в BSP библиотеката на N76E003 има грешка, която е вместо P07_Input_Mode; има P07_Quasi_Mode . Поради това функцията за получаване на UART няма да работи.
Скоростта на предаване също се конфигурира според въведената скорост на предаване и използвайки формулата, дадена в листа с данни. Сега в основната функция или цикъл while се използва функцията printf. За да използвате функцията printf , TI трябва да бъде зададен като 1. Освен това, в цикъл while се използва случай на превключвател и според получените UART данни стойността се отпечатва.
докато (1) { printf ("\ r \ nНатиснете 1 или Натиснете 2 или Натиснете 3 или Натиснете 4"); oper = Получаване_данни_от_UART0 (); превключвател (oper) { случай '1': printf ("\ r \ n1 е натиснат"); почивка; случай '2': printf ("\ r \ n2 е натиснат"); почивка; случай '3': printf ("\ r \ n3 е натиснат"); почивка; случай '4': printf ("\ r \ n4 е натиснат"); почивка; по подразбиране: printf ("\ r \ nНеправилен клавиш натиснат"); } Timer0_Delay1ms (300); } }
Е, за UART0 получавате Receive_Data_From_UART0 (); се използва функцията. Той също е дефиниран в библиотеката common.c .
UINT8 Receive_Data_From_UART0 (void) { UINT8 c; докато (! RI); c = SBUF; RI = 0; връщане (c); }
Той ще изчака флагът RI да получи 1 и да върне данните за получаване, използвайки променливата c.
Мигане на кода и изхода
Кодът връща 0 предупреждение и 0 грешки и мига, използвайки метода на мигане по подразбиране от Keil. Ако не сте сигурни как да компилирате и качите код, вижте стартирането с nuvoton. Долните редове потвърждават, че нашият код е качен успешно.
Възстановяване започна: Проект: printf_UART0 Възстановяване на целта „GPIO“, компилиране на PUTCHAR.C… компилиране на Print_UART0.C… компилиране на Delay.c… компилиране на Common.c… сглобяване STARTUP.A51… свързване… Размер на програмата: data = 54.2 xdata = 0 code = 2341 създаване на шестнадесетичен файл от ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Грешка (и), 0 Предупреждение (и). Изминало време на изграждане: 00:00:02 Заредете "G: \\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1" Изтриване на флаш готово . Flash Write Done: 2341 байта програмирани. Проверка на Flash Готово: Проверено 2341 байта. Flash Load приключи в 15:48:08
Платката за разработка е свързана към източника на захранване чрез програмиста и лаптопа с помощта на модула USB към UART. За показване или изпращане на UART данни е необходим софтуер за сериен монитор. Използвам термин tera за този процес.
Както можете да видите на изображението по-долу, успях да покажа низовете, изпратени от нашия контролер nuvoton, и да го покажа на софтуера за сериен монитор. Също така успя да чете стойности от серийния монитор.
Можете да разгледате видеото, свързано по-долу, за пълната демонстрация на този урок. Надявам се, че статията ви е харесала и сте научили нещо полезно. Ако имате някакви въпроси, можете да ги оставите в раздела за коментари по-долу или да използвате нашите форуми, за да публикувате други технически въпроси.