[STM32F4] 关于UART的DMA和IDLE中断接收不定长数据的应用

[复制链接]
 楼主| shipeng1989 发表于 2018-11-21 19:54 | 显示全部楼层 |阅读模式
今天花了1天时间调试不定长数据接收功能期间参考了很多例程,但总是问题不断。费了九牛二虎之力最后总算是调通了。整个过程下来发现坑还是非常多的,在此分享下我的经验之谈:
1.打开IDLE中断后此中断并不会调用中断回调函数,因此中断处理函数绝对不能放在回调函数当中,必须直接放到stm32f4xx_it.c文件的void UART8_IRQHandler(void)函数中:
void UART8_IRQHandler(void)
{
  /* USER CODE BEGIN UART8_IRQn 0 */

  /* USER CODE END UART8_IRQn 0 */
  HAL_UART_IRQHandler(&huart8);
  /* USER CODE BEGIN UART8_IRQn 1 */
        if(__HAL_UART_GET_FLAG(&huart8,UART_FLAG_IDLE) != RESET)
        {
                if (rxd_uart8[0] == 0xCC && rxd_uart8[1]<18  && u8rxd_end == 0x33)
                {
                        if (u8rxd_end == 0x33 && CalcBlockCrc(rxd_uart8+1,rxd_uart8[1]-1) == u8rxd_crc8)
                        {
                                U8Analyze_Package();
                        }
                }
                __HAL_UART_CLEAR_IDLEFLAG(&huart8);
                HAL_UART_AbortReceive(&huart8);
                HAL_UART_Receive_DMA(&huart8,rxd_uart8,19);
        }
  /* USER CODE END UART8_IRQn 1 */
}
幸福小强 发表于 2018-11-21 22:35 | 显示全部楼层
如果把回调函数添加到中断处理函数内,会不会就可以用回调了?
观海 发表于 2018-11-27 12:51 | 显示全部楼层
感觉二楼的想法是正确的
小灵通2018 发表于 2018-11-27 14:57 | 显示全部楼层
用中断接收不行吗
wowu 发表于 2018-12-3 14:43 | 显示全部楼层
太感谢分享了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

140

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部