Я реализую простой протокол приема-передачи UART на STM32F103, библиотечный / шаблонный код, который я использую здесь, - это LL, а не HAL (поскольку HAL включает в себя безумные накладные расходы)
Моя проблема в том, что после успешного ввода обработчика прерывания «USART1_IRQHandler» он продолжает работать вечно. Мой код здесь:
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
int ii = 0;
for(ii=0; ii<4; ii++){
LL_mDelay(40);
LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5);
LL_mDelay(40);
LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5);
}
uint8_t cc = LL_USART_ReceiveData8(USART1);
LL_USART_TransmitData8(USART1, cc);
LL_mDelay(130);
//LL_USART_ClearFlag_RXNE(USART1);
//NVIC_ClearPendingIRQ( USART1_IRQn );
/* USER CODE END USART1_IRQn 0 */
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
и в main.c у меня есть:
LL_USART_EnableIT_RXNE(USART1);
while (1)
{
LL_mDelay(300);
LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5);
LL_mDelay(300);
LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5);
//LL_USART_EnableIT_TC(USART1);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
Команды GPIO_Toggle нужны только для того, чтобы мигать светодиодом, чтобы я знал, что происходит. Вот что происходит: когда я включаю MC, он входит в основной цикл и медленно мигает. Когда я отправляю что-то (~ 10 байт) через UART, светодиод начинает быстро мигать, указывая на то, что он вошел в обработчик прерывания. Проблема в том, что он никогда не останавливается и продолжает вращаться в обработчике прерывания.
Я пробовал использовать прокомментированные функции
LL_USART_ClearFlag_RXNE(USART1);
NVIC_ClearPendingIRQ( USART1_IRQn );
либо по отдельности, либо в комбинации, но они абсолютно ни на что не влияют. Что я делаю неправильно? Как мне выйти из обработчика?
LL_mDelay(130);
в обработчике прерывания? Хм, сомнительный подход. Задержки в сумме составляют 450. Если это 450 мс, этого хватит только на очень медленную скорость передачи. - person chux - Reinstate Monica   schedule 13.09.2018LL_mDelay()
, код все равно никогда не останавливается и продолжает крутиться в обработчике прерываний? - person chux - Reinstate Monica   schedule 13.09.2018LL_USART_IsActiveFlag_RXNE()
и проверить, действительно ли данные доступны, прежде чем вызыватьLL_USART_ReceiveData8(USART1); LL_USART_TransmitData8
. Я подозреваю, что код застрял, потому что вялый обработчик с задержками вызывал ошибку для установки (Overrun), и обработчик никогда не очищает ошибки. - person chux - Reinstate Monica   schedule 13.09.2018//LL_USART_ClearFlag_RXNE(USART1)
//NVIC_ClearPendingIRQ( USART1_IRQn );
Неправильны или, по крайней мере, по какой-то причине ведут себя не так, как ожидалось. - person bigwillydos   schedule 13.09.2018