- Основи спілкування 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 біт / с та ін. Раніше ми використовували 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. Якщо програміст не використовується як джерело живлення, може знадобитися додатковий блок живлення на 5 В.
Принципова схема для зв'язку Nuvoton N76E003 UART
Як ми можемо побачити на схемі плати розвитку нижче, 2-й та 3-й висновки блоку мікроконтролера використовуються як UART0 Tx і Rx відповідно. У крайньому лівому куті показано підключення інтерфейсу програмування.
Шпильки UART на мікроконтролері Nuvoton N76E003
N76E003 має 20 висновків, з яких 4 висновки можуть бути використані для зв'язку UART. На зображенні нижче показані шпильки UART, виділені червоним квадратним полем (Rx) та Синім квадратним полем (Tx).
Для UART0 для зв'язку UART використовуються виводи 2 і 3, а для UART1 - виводи 8 і 18.
Реєстрація UART у мікроконтролері Nuvoton N76E003
N76E003 має два вдосконалених повнодуплексних UART з автоматичним розпізнаванням адрес та виявленням помилок кадрування - UART0 та UART1. Ці два UART управляються за допомогою регістрів, класифікованих за двома різними UART. Для операцій UART у N76E003 доступні дві пари штифтів RX і TX. Таким чином, першим кроком є вибір бажаного порту UART для роботи.
У цьому посібнику ми використовуватимемо UART0, тому конфігурація буде показана лише для UART0. UART1 матиме однакову конфігурацію, але регістри будуть різними.
Після вибору одного UART (в даному випадку UART0), виводи вводу-виводу, які потрібно використовувати для зв'язку 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.
6-й та 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.
І значення таймера 3 попереднього масштабування -
5-розрядний BRCK встановить таймер 3 як джерело тактової частоти в боді для UART1. Тепер у таблицю даних N76E003 подано формулу для розрахунку бажаної швидкості передачі даних, а також значення встановленої вибірки для таймера 3 (16-бітовий) високий і низький регістри.
Значення вибірки для джерела тактової частоти 16 МГц -
Таким чином, швидкість передачі даних повинна бути налаштована в реєстрі таймера 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 як генератор швидкості передачі даних { P06_Quasi_Mode; // Встановлення виводу UART як квазірежиму для передачі P07_Input_Mode; // Встановлення виводу UART як режиму введення для отримання SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 Увімкнути подвійну швидкість T3CON & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (попередній масштаб = 1) set_BRCK; // Тактова частота швидкості передачі даних UART0 = Timer3 #ifdef FOSC_160000 RH3 = HIBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 МГц * / RL3 = LOBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 МГц * / #endif #ifdef FOSC_166000 RH3 = HIBYTE (65536 - (1037500 / u32Baudrate)); /*16,6 МГц * / RL3 = LOBYTE (65536 - (1037500 / u32Baudrate)); /*16,6 МГц * / #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Неправильна клавіша натиснута"); } Таймер0_Затримка1мс (300); } }
Ну а для UART0 отримайте Receive_Data_From_UART0 (); використовується функція. Це також визначено в бібліотеці common.c .
UINT8 Receive_Data_From_UART0 (void) { UINT8 c; в той час як (! RI); c = SBUF; RI = 0; повернення (в); }
Він буде чекати, поки прапор 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 Erase Done. Flash Write Done: запрограмовано 2341 байт. Перевірка Flash виконана: перевірено 2341 байт. Flash завантаження закінчено о 15:48:08
Плата розробки підключена до джерела живлення через програміст та ноутбук за допомогою модуля USB до UART. Для відображення або надсилання даних UART потрібне програмне забезпечення послідовного монітора. Я використовую термін тера для цього процесу.
Як ви можете бачити на зображенні нижче, я зміг відобразити рядки, надіслані від нашого контролера nuvoton, і відобразити їх на програмному забезпеченні послідовного монітора. Також зміг зчитувати значення з послідовного монітора.
Ви можете переглянути відео, наведене нижче, для повної демонстрації цього підручника. Сподіваюся, вам сподобалась стаття і ви дізналися щось корисне. Якщо у вас виникли запитання, ви можете залишити їх у розділі коментарів нижче або використати наші форуми, щоб опублікувати інші технічні питання.