Продолжая изучать возможности библиотеки CMSIS, на данном уроке мы попытаемся поработать с помощью данной библиотеки с аппаратной реализацией шины USART (Universal synchronous asynchronous receiver transmitter) в контроллере STM32F1.
В уроке 161, работая с модулем UASART с использованием библиотеки LL, мы плотно познакомились с его аппаратной организацией в нашем контроллере, поэтому сегодня нам будет намного легче работать и с библиотекой CMSIS. Хоть при работе с библиотекой LL и не нужно писать инициализацию вручную, тем не менее мы данный процесс просмотрели и хорошенько изучили.
Также на протяжении всего курса занятий по контроллерам STM32 мы постоянно используем шину USART для реализации наших различных целей и, думаю, нам будет нет так сложно достичь и сегодняшней нашей цели.
Как видно из названия урока, работать с шиной USART мы будем только на передачу без использования прерываний и DMA.
Схема для нашего урока будет та же самая, что и в уроке 161 с единственной разницей — мы подключим и переходник и анализатор без макетной платы, так как у меня есть отладочная плата с двухсторонними штырьевыми линейками. Ножки для USART остаются те же. Также для лучшего контроля происходящего в программе процесса мы подключим светодиодный индикатор по шине SPI.
Вот так выглядит наша схема после подключения её к компьютеру
Теперь можно приступить и к проекту, который был сделан из проекта урока 175 с именем CMSIS_SPI_MASTER, а имя ему мы теперь дадим CMSIS_USART_TX.
Откроем наш проект в Keil и для начала удалим из файла main.c функцию SPI1_Init вместе с телом. Удалим также вот эти макросы
#define CS1_RESET() SET_BIT(GPIOA->ODR,GPIO_ODR_ODR4)
#define CS1_SET() CLEAR_BIT(GPIOA->ODR,GPIO_ODR_ODR4)
…
#define SPI1_ENABLE() SET_BIT(SPI1->CR1, SPI_CR1_SPE);
Подключим вот эту стандартную библиотеку
1 2 |
#include "max7219.h" #include <stdio.h> |
Объявим строковый массив
1 2 |
__IO uint32_t SysTick_CNT = 0; char str1[30]; |
Из функции main() удалим вот эту переменную
uint16_t i, r;
А переменную i обнулим
uint16_t i=0;
Удалим вызов функции инициализации модуля SPI1
SPI1_Init();
Удалим его выбор
CS1_RESET();
Удалим также его старт
SPI1_ENABLE();
Из бесконечного цикла также пока всё удалим.
Выше функции main() добавим функцию инициализации модуля USART1
1 2 3 4 5 |
//---------------------------------------------------------- static void USART1_Init(void) { } //---------------------------------------------------------- |
Теперь напишем тело данной функции.
Для начала мы включим тактирование модуля USART1
1 2 3 4 5 |
static void USART1_Init(void) { //USART Clock SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN); tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN); |
Затем настроим ножки для USART, не забыв первым делом также про тактирование порта
1 2 3 4 5 6 |
tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN); //Set GPIO_TX_RX SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN); tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN); MODIFY_REG(GPIOA->CRH, GPIO_CRH_MODE10 | GPIO_CRH_CNF10_1 | GPIO_CRH_CNF9_0, GPIO_CRH_CNF10_0 | GPIO_CRH_MODE9 | GPIO_CRH_CNF9_1); |
Проверив, не запущен ли модуль, произведём настройки нужных битов (а какие из них нужные, мы знаем из урока 161)
1 2 3 4 5 6 7 |
GPIO_CRH_CNF10_1 |GPIO_CRH_CNF9_1 | GPIO_CRH_MODE10| GPIO_CRH_MODE9); ////USART needs to be in disabled state, in order to be able to configure some bits in CRx registers if(READ_BIT(USART1->CR1, USART_CR1_UE) != (USART_CR1_UE)) { MODIFY_REG(USART1->CR1, USART_CR1_M | USART_CR1_PCE | USART_CR1_PS ,USART_CR1_TE |USART_CR1_RE); } |
Настроим асинхронный режим
1 2 3 4 5 |
USART_CR1_TE | USART_CR1_RE),USART_CR1_TE |USART_CR1_RE); } //Async Mode CLEAR_BIT(USART1->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USART1->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); |
Настроим скорость 115200. Как настраивается скорость передачи данных по USART, мы также знаем
1 2 3 |
CLEAR_BIT(USART1->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); //115200 WRITE_REG(USART1->BRR, ((0x27)<<4)|0x01); |
Включим модуль
1 2 3 |
WRITE_REG(USART1->BRR, ((0x27)<<4)|0x01); //Enable SET_BIT(USART1->CR1, USART_CR1_UE); |
Вызовем эту функцию в main()
1 2 |
SPI2_Init(); USART1_Init(); |
Очистим показания индикатора
1 2 |
delay_ms(2000); Clear_7219(); |
Выше функции USART1_Init добавим функцию передачи данных по USART с указанием адреса их расположения и количества
1 2 3 4 5 6 7 8 9 10 11 12 |
//---------------------------------------------------------- void USART_TX (uint8_t* dt, uint16_t sz) { uint16_t ind = 0; while (ind<sz) { while (READ_BIT(USART1->SR, USART_SR_TXE) != (USART_SR_TXE)) {} USART1->DR = (uint16_t)dt[ind]; ind++; } } //---------------------------------------------------------- |
В данной функции мы отправляем очередной байт в регистр DR, дожидаясь перед этим того момента, когда буфер передачи будет пустым.
В бесконечном цикле мы будем передавать те же строки, что и в уроке 161, оканчивающиеся инкрементирующимся числом, также отображаемом на светодиодном индикаторе
1 2 3 4 5 6 7 8 |
while(1) { if(i>1023) i=0; sprintf(str1,"String %04d\r\n",i); USART_TX((uint8_t*)str1,13); NumberR_7219(i); delay_ms(100); i++; |
Вот и весь код.
Соберём проект, прошьём контроллер.
Индикатор начнёт осчёт
Синхронно с индикатором в терминальной программе побегут строчки
Также посмотрим, как они выглядят в программе логического анализа. Как настроить данную программу для распознавания данных при передаче по шине USART, мы также знаем
Итак, данный урок нас научил пользоваться возможностями библиотеки CMSIS при программировании модуля USART микроконтроллера STM32F1. Пока мы использовали данный модуль только для передачи данных из контроллера, также мы не использовали механизм прерываний, периферию DMA, но главное начало. Всё остальное будет в следующих уроках.
Всем спасибо за внимание!
Предыдущий урок Программирование МК STM32 Следующий урок
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Программатор недорогой можно купить здесь ST-Link V2
Переходник USB to TTL можно приобрести здесь ftdi ft232rl
Индикатор светодиодный семиразрядный с драйвером MAX7219
Логический анализатор 16 каналов можно приобрести здесь
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добавить комментарий