Stm32 挂断UART和DMA
我正在尝试使用UART和DMA。当我在USART3_IRQHandler中插入对HAL_Delay的调用时,程序挂起在HAL_Delay中。不再调用SysTick中断。我不明白Stm32 挂断UART和DMA,stm32,usart,Stm32,Usart,我正在尝试使用UART和DMA。当我在USART3_IRQHandler中插入对HAL_Delay的调用时,程序挂起在HAL_Delay中。不再调用SysTick中断。我不明白 int main(void) { ... MX_DMA_Init(); MX_USART3_UART_Init(); uint32_t nextCall = uwTick; while (1) { if (nextCall < uwTick) { __HAL_U
int main(void)
{
...
MX_DMA_Init();
MX_USART3_UART_Init();
uint32_t nextCall = uwTick;
while (1)
{
if (nextCall < uwTick) {
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
HAL_UART_Transmit_DMA( &huart3, dataTx, sizeof( dataTx ) );
nextCall = uwTick + 1000;
}
}
}
void USART3_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart3);
if (( USART3->SR & UART_IT_IDLE) != 0 )
{
__HAL_UART_CLEAR_IDLEFLAG( &huart3 );
HAL_UART_DMAStop(&huart3);
uint8_t data_length = sizeof( dataRx ) - __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);
memset( dataRx,0,sizeof( dataRx ));
HAL_UART_Receive_DMA(&huart3, (uint8_t*)dataRx, sizeof( dataRx ));
HAL_Delay( 1 );
// Delay() does not return
}
}
从完全错误的不可能修复的UART代码中抽象出来,在中断上下文中工作的HAL_延迟要求SYSTICK中断优先级高于UART中断。否则它不会被调用,内部计数器也不会增加,函数在死循环中结束。那里一切都是错误的。您必须选择中断或DMA。您不能在UART中断中启动DMA接收。@P____________)谢谢。为什么我可以在中断中开始中断。这个想法来自[。中断例程中的HAL_延迟只是为了在代码中插入一个中断以进行调试。现在,我知道,这是个坏主意。@YvonBlais您的代码与链接的代码没有任何共同之处