Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stm32 挂断UART和DMA_Stm32_Usart - Fatal编程技术网

Stm32 挂断UART和DMA

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

我正在尝试使用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_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您的代码与链接的代码没有任何共同之处