- Основы связи 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, и она используется для измерения скорости передачи данных в битах в секунду (бит / с). Эта скорость передачи для передачи и приема должна быть одинаковой. Разница в скорости передачи между передающим и принимающим 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 контакты 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) контакты ввода / вывода, которые необходимо использовать для связи 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) // использовать таймер 3 как генератор скорости передачи { 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 (Prescale = 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; // Триггер Timer3 set_TI; // Для функции printf необходимо установить TI = 1 }
Объявление выполняется шаг за шагом, как обсуждалось ранее, и регистры настраиваются соответствующим образом. Однако в библиотеке BSP N76E003 есть ошибка вместо P07_Input_Mode; есть P07_Quasi_Mode . Из-за этого функция приема UART работать не будет.
Скорость передачи также настраивается в соответствии с вводом скорости передачи и с использованием формулы, приведенной в таблице данных. Теперь в основной функции или в цикле while используется функция printf. Чтобы использовать функцию printf , TI должен быть установлен как 1. Кроме этого, в цикле while используется случай переключателя, и, согласно полученным данным UART, значение печатается.
while (1) { printf ("\ r \ nНажмите 1, или нажмите 2, или нажмите 3, или нажмите 4"); oper = Receive_Data_From_UART0 (); switch (oper) { case '1': printf ("\ r \ n1 нажата"); сломать; case '2': printf ("\ r \ n2 нажат"); сломать; case '3': printf ("\ r \ n3 нажат"); сломать; case '4': printf ("\ r \ n4 нажат"); сломать; по умолчанию: printf ("\ r \ nНажата неправильная клавиша"); } Timer0_Delay1ms (300); } }
Что ж, для UART0 получите Receive_Data_From_UART0 (); функция используется. Он также определен в библиотеке common.c .
UINT8 Receive_Data_From_UART0 (недействительно) { UINT8 c; пока (! RI); c = SBUF; RI = 0; return (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 Erase Done. Выполнена флэш-запись: запрограммировано 2341 байт. Flash Verify Done: проверено 2341 байт. Флэш-загрузка завершилась в 15:48:08
Плата разработки подключается к источнику питания через программатор и ноутбук с помощью модуля USB-UART. Для отображения или отправки данных UART требуется программное обеспечение монитора последовательного порта. Я использую тератермин для этого процесса.
Как вы можете видеть на изображении ниже, я смог отобразить строки, отправленные с нашего контроллера nuvoton, и отобразить их в программном обеспечении последовательного монитора. Также смог прочитать значения с последовательного монитора.
Вы можете посмотреть видео по ссылке ниже для полной демонстрации этого урока. Надеюсь, вам понравилась статья и вы узнали что-то полезное. Если у вас есть какие-либо вопросы, вы можете оставить их в разделе комментариев ниже или использовать наши форумы, чтобы задать другие технические вопросы.