OpenEdv-开源电子网

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

HAL库的DMA中断是怎么执行的。

[复制链接]

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2018-3-14
在线时间
20 小时
发表于 2020-10-24 15:09:47 | 显示全部楼层 |阅读模式
1金钱
HAL库的DMA中断是怎么执行的呢。用CUBEMX生成USART2_TX DMA相关代码。会在stm32f4xx_it.c中生成一个中断入口函数void DMA2_Stream1_IRQHandler(void)。
这个中断就是执行这个函数:HAL_DMA_IRQHandler(&hdma_usart2_tx);这个函数里面会有一些中断相关的位处理,比如说要发送完成中断,然后执行到 hdma->XferCpltCallback(hdma);,也就是UASRT_DMA发送完成中断回调函数指针。然后就定位不到了。
就想请大神指导下,这个中断函数中的回调函数最后指向了哪个回调函数呢。是怎么过去的呢?

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

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2018-3-14
在线时间
20 小时
 楼主| 发表于 2020-10-24 15:37:12 | 显示全部楼层
我仔细研究了下这个HAL库DMA中断处理的过程。初始化相关DMA参数后,调用
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);进行DMA传输(这个函数里就指向了DMA回调函数)。在DMA回到函数里面,失能DMA,使能串口发送完成中断。当SR寄存器中的TC=1,就会发生串口发送完成中断。
大致过程就是DMA中断会调用相应DMA中断回调,然后产生相应的串口中断。
如果理解有误,请路过大神指教下。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-10-25 22:16:53 | 显示全部楼层
回调函数要你自己去实体化的,HAL不是有很多Weak的申明么?weak就是在你没有定义这个函数的时候,使用weak定义,当你定义了以后,weak就时效了,避免程序跑飞。。。
回复

使用道具 举报

1

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2019-9-12
在线时间
114 小时
发表于 2020-10-27 11:00:44 | 显示全部楼层
正点原子 发表于 2020-10-25 22:16
回调函数要你自己去实体化的,HAL不是有很多Weak的申明么?weak就是在你没有定义这个函数的时候,使用weak ...

原子哥,touchgfx的讲解教学什么时候出啊?
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2018-3-14
在线时间
20 小时
 楼主| 发表于 2020-10-27 11:46:50 | 显示全部楼层
正点原子 发表于 2020-10-25 22:16
回调函数要你自己去实体化的,HAL不是有很多Weak的申明么?weak就是在你没有定义这个函数的时候,使用weak ...

嗯嗯。这个我知道。因为单独看DMA中断的时候,不能定位到中断函数。只是给了一个函数指针指向。一开始没有看到HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);这个函数。发送DMA的中断其实是在这个函数里面的定义的。这个里面定义了响应的__weak 回调函数。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 17:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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