新手上路
- 积分
- 36
- 金钱
- 36
- 注册时间
- 2022-3-13
- 在线时间
- 12 小时
|
本帖最后由 wppaiqiqi 于 2025-8-18 22:39 编辑
最近在研究zephyr的时候,发现使用DMA串口接收数据的时候产生空闲中断,回调函数中通过原串口对数据进行回显,发现回显数据一直为乱码,但是单步调试的时候又是正常的;于是我就想着用HAL库验证一下是不是好的,因为本身逻辑比较简单又加上zephyr操作系统不是很稳定很多功能不够完善。
下面我就开始使用stm32f103zet6(精英开发板)验证。
首先我通过cubemx配置了异步串口usart3 ,并将串口配置为DMA模式,其中DMA模式都是正常模式;
下面我做了两个实验:
1、使用HAL_UART_Receive_DMA和HAL_UART_Transmit_DMA函数进行回显,HAL_UART_Receive_DMA函数接收完成触发HAL_UART_RxCpltCallback;
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_DMA_Init();
- MX_USART3_UART_Init();
- HAL_UART_Receive_DMA(&huart3,rx_buf,3);
- while (1)
- {)
- }
- //回调函数
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- if(huart == &huart3)
- {
- HAL_UART_Transmit_DMA(&huart3,rx_buf,3);
- HAL_UART_Receive_DMA(&huart3,rx_buf,3);
- }
- }
复制代码 测试结果:我通过上位机向串口发送一次,串口第一次将数据回显的第一帧数据是对的,但后续串口会一直向外发送乱码,就像下面这样:
有点想法:根据自己的推断,串口接收数据产生UART_IT_RXNE,最后在UART_Receive_IT函数中会清除该中断,所以我不发的时候他应该不会进这个中断才对;
2、使用HAL_UARTEx_ReceiveToIdle_DMA和HAL_UART_Transmit_DMA函数进行回显,HAL_UARTEx_ReceiveToIdle_DMA函数接收完成触发HAL_UARTEx_RxEventCallback:
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_DMA_Init();
- MX_USART3_UART_Init();
- HAL_UARTEx_ReceiveToIdle_DMA(&huart3,rx_buf,sizeof(rx_buf));
- while (1)
- {)
- }
- //回调函数
- void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
- {
- if(huart == &huart3)
- {
- HAL_UART_Transmit_DMA(&huart3,rx_buf,Size);
- HAL_UARTEx_ReceiveToIdle_DMA(&huart3,rx_buf,sizeof(rx_buf));
- }
- }
复制代码 这个测试结果和实验1基本一直,串口一直向外发送数据,如下:
经过两个实验,看着像是没有清什么标志,但又觉得清了,有点搞不懂了,估计zephyr和这个估计是一类问题,有没有大佬帮忙解释下为啥。
|
|