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