Здравствуйте. вот сижу полдня не могу понять почему не работают прерывания в uart. микросхема stm32f103rbt6.
хочу сделать прерывания на получение данных. при получении и возникновении прерывания светодиод должен гаснуть.
прерывание не срабатывает когда отправляю данные с компьютера
хочу сделать прерывания на получение данных. при получении и возникновении прерывания светодиод должен гаснуть.
Код: Выделить всё
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
//Структуры для инициализации GPIOA и USART1
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
void Init(void); //Объявление функции инициализации периферии
unsigned char tmp;
void USART1_IRQHandler(void)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_9); //выключаем светодиод но это событие не наступает
//если причина прерывания окончание приема
if(USART_GetITStatus(USART1, USART_IT_RXNE))//(USART1->SR & USART_SR_RXNE)!=0)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
tmp = USART1->DR; //прочитать принятый байт
//что-то делаем
}
//если причина прерывания окончание передачи
if( USART_GetITStatus(USART1, USART_IT_TXE))//(USART1->SR & USART_SR_TC)!=0)
{
USART_ClearITPendingBit(USART1, USART_IT_TXE);
//что-то делаем
}
}
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
Init(); //Вызов функции инициализации периферии
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// прерывание на пришедшие данные в буфер;
// USART_ITConfig(USART1, USART_IT_TXE, ENABLE); вот здесь стимулятор спотыкается из-за assert
NVIC_EnableIRQ (USART1_IRQn); //разрешить прерывания от USART1
GPIO_SetBits(GPIOC,GPIO_Pin_9); //включаем светодиод
while(1)
{
;
}
}
//Функция инициализации периферии
void Init()
{
//Включаем тактирование GPIOA, USART1 и альтернативных функций AFIO
RCC_APB2PeriphClockCmd((RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO), ENABLE);
//Инициализация вывода PA9 - USART1_Tx
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //Настройки вывода PA9
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //Скорость порта максимальная
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //Режим альтернативной функции, выход Push-Pull
GPIO_Init(GPIOA, &GPIO_InitStruct); //Заданные настройки сохраняем в регистрах GPIOА
//Инициализация вывода PA10 - USART1_Rx
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; //Настройки вывода PA10
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //Input floating
GPIO_Init(GPIOA, &GPIO_InitStruct); //Заданные настройки сохраняем в регистрах GPIOА
//Инициализация USART1
USART_InitStruct.USART_BaudRate = 9600; //Скорость обмена 9600 бод
USART_InitStruct.USART_WordLength = USART_WordLength_8b; //Длина слова 8 бит
USART_InitStruct.USART_StopBits = USART_StopBits_1; //1 стоп-бит
USART_InitStruct.USART_Parity = USART_Parity_No ; //Без проверки четности
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //Без аппаратного контроля
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //Включен передатчик и приемник USART1
USART_Init(USART1, &USART_InitStruct); //Заданные настройки сохраняем в регистрах USART1
USART_Cmd(USART1, ENABLE); //Включаем USART1
}
