OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4851|回复: 4

基于FRTOS的HAL库DMA中断收发程序(103C8)re

[复制链接]

32

主题

234

帖子

0

精华

高级会员

Rank: 4

积分
985
金钱
985
注册时间
2017-8-11
在线时间
136 小时
发表于 2018-7-11 16:32:57 | 显示全部楼层 |阅读模式
有几个月没上论坛逛逛了,刚好最近刚完成了一个项目,用的是HAL库,同时搭载FreeRTOS系统
本人用的是STM32CubeMX来构建工程的,如果是用HAL库,基本用这个软件去构建工程,通用性强,便捷,其实主要是代码规范化

在这里,不得不吐槽一下,STM32CubeMX里用HAL库如果是运用在串口接收这一块,用官方的demo,收发的串口中断方式函数需要填入长度
那问题来了,在接收过程中,我哪知道接收到多长的数据,毕竟长度未知,所以只能选择DMA串口收发方式了

然而,网上在基于HAL库的DMA中断收发的资料是真的少(因为HAL库的DMA串口收发,是真的鸡肋,个人感觉用以前的标准库会顺手多了.......)

我是参考这个大牛去自己修改了一个demo
https://blog.csdn.net/youmeichifan/article/details/51750435

主函数功能:把接收到的数据,打印出来。用的是串口2
[mw_shl_code=applescript,true] while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
         HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);  //闪烁运行红灯
         if(UsartType2.receive_flag)//如果产生了空闲中断  
                {  
                                UsartType2.receive_flag=0;//清零标记  
                                Usart2SendData_DMA(UsartType2.usartDMA_rxBuf,UsartType2.rx_len);//串口打印收到的数据0。  
                }
                        HAL_Delay(300);
        }[/mw_shl_code]

如果想发送的话,可以添加以下
[mw_shl_code=applescript,true]UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart1_rx;
DMA_HandleTypeDef hdma_usart1_tx;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;

//串口1 DMA发送函数
void Usart1SendData_DMA(uint8_t *pdata, uint16_t Length)  
{  
    while(UsartType1.dmaSend_flag == USART_DMA_SENDING);  
    UsartType1.dmaSend_flag = USART_DMA_SENDING;  
    HAL_UART_Transmit_DMA(&huart1, pdata, Length);  
}


//串口2 DMA发送函数
void Usart2SendData_DMA(uint8_t *pdata, uint16_t Length)  
{  
    while(UsartType2.dmaSend_flag == USART_DMA_SENDING);  
          
    UsartType2.dmaSend_flag = USART_DMA_SENDING;  
    HAL_UART_Transmit_DMA(&huart2, pdata, Length);  
          
}
[/mw_shl_code]

在串口接收中断的回调函数中,可以进行数据解析处理或者打印,看个人需求吧

usart_dma.rar

9.07 MB, 下载次数: 1470

demo

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

44

帖子

0

精华

高级会员

Rank: 4

积分
635
金钱
635
注册时间
2019-4-23
在线时间
84 小时
发表于 2019-7-23 14:37:21 | 显示全部楼层
本帖最后由 jiuhao2019 于 2019-7-23 14:38 编辑

我觉得内容与标题不符合吧. DMA中断,
但是内容里使用的是串口完成中断和串口空闲中断;而没有用DMA中断啊.
DMA不是有三种中断吗,半完成中断;完成中断;错误中断;
但是楼主demo里完全找不到对应的中断服务函数啊.
请修改标题为使用串口中断.
DMA中断要先注册回调函数.HAL_DMA_RegisterCallback();

回复 支持 反对

使用道具 举报

1

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-4-24
在线时间
53 小时
发表于 2019-7-23 14:57:29 | 显示全部楼层
支持支持
回复 支持 反对

使用道具 举报

4

主题

44

帖子

0

精华

高级会员

Rank: 4

积分
635
金钱
635
注册时间
2019-4-23
在线时间
84 小时
发表于 2019-7-23 17:00:33 | 显示全部楼层
jiuhao2019 发表于 2019-7-23 14:37
我觉得内容与标题不符合吧. DMA中断,
但是内容里使用的是串口完成中断和串口空闲中断;而没有用DMA中断啊.
...

我理解是不是有误,
因为串口的DMA中断回调函数里最终也是调用串口完成回调函数.
而注册函数,注册的回调函数需要自己去考虑各种标志了.
回复 支持 反对

使用道具 举报

4

主题

44

帖子

0

精华

高级会员

Rank: 4

积分
635
金钱
635
注册时间
2019-4-23
在线时间
84 小时
发表于 2019-7-23 17:13:07 | 显示全部楼层
jiuhao2019 发表于 2019-7-23 17:00
我理解是不是有误,
因为串口的DMA中断回调函数里最终也是调用串口完成回调函数.
而注册函数,注册的回调 ...

实验:串口接收DMA设置为5,只有接收5个字节后,才触发一次串口完成中断.
结论:串口DMA完成中断,就是最终调用串口完成中断.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 04:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表