USART: асинхронный обмен

Конфигурация прерываний

Для того, чтобы процессор знал, на что ему отвлекаться, нужно ему объяснить. То есть, зарегистрировать прерывание.

На всякий случай, добавим ‘#define SUPPORT_USART_ASYNC’ в app_config.h, чтобы можно было включать и выключать данную фичу.
Теперь нужно проинициализировать конфиг прерываний.
Добавим в usart.c рядом с ‘static USART_InitTypeDef USART_InitStruct’:

1 #ifdef SUPPORT_USART_ASYNC
2 static NVIC_InitTypeDef NVIC_InitStructure;
3 #endif

и затем саму инициализацию:

01 #ifdef SUPPORT_USART_ASYNC
02     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // "подписываем" прерывание USART по событию RXNE (когда приемный регистр не пуст)
03     
04     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; // Канал - прерывание USART
05     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // Группа приоритета
06     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // Подгруппа приоритета
07     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // Включаем прерывание
08     NVIC_Init(&NVIC_InitStructure); // Сохраняем настройки и инициализируем структуру
09     
10     NVIC_EnableIRQ(USART1_IRQn);    // Включаем "прослушку" действия с USART
11 #endif

После этого действия, если в USART будут посланы данные – сработает хэндлер USART1_IRQHandler и именно там мы будем читать данные, которые будут посланы в USART:

01 #ifdef SUPPORT_USART_ASYNC
02 void USART1_IRQHandler(void)
03 {
04     char *res;
05     USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); // Выключаем прослушку по событию заполнения буффера
06  
07     res = USART_Receive_String();
08     USART_Send_String("recv: ", 0);
09     USART_Send_String(res, 1);
10  
11     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // Включаем прослушку по событию заполнения буффера
12     USART_ClearITPendingBit(USART1, USART_IT_RXNE); // Сбрасываем флаг удержания прерывания, возвращаем контроль процессору
13 }
14 #endif

Ну и напоследок, изменим main.c:

01 #include "stm32f10x.h"
02 #include "stm32f10x_conf.h"
03  
04 #include "app_config.h"
05 #include "usart_config.h"
06 #include "usart.h"
07  
08 int main(void)
09 {
10     initUSART();
11  
12     USART_Send_String("I'm ready!", 1);
13  
14     while(1)
15     {
16     }
17 }

 

Обратная связь

Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях

пишите мне на netdm@mail.ru