OpenEdv-开源电子网

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

关于HAL库串口DMA发送的问题 代码什么时候在哪里调用到了HAL_UART_TxCpltCallback

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-8-1
在线时间
25 小时
发表于 2021-1-30 11:23:24 | 显示全部楼层 |阅读模式
10金钱
在使用HAL_UART_Transmit_DMA(&huart1, DAT, sizeof(DAT))函数后在发送完成后应该会进入下边中断
void DMA1_Channel4_IRQHandler(void)
{
      printf("DDFF");//////////////////////////////////////////////////没打印

  HAL_DMA_IRQHandler(&hdma_usart1_tx);

}

但是在中断里面打印没东西。。。
更加疑惑的是DMA发送完成后会执行下边的回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
   printf("ZZZZ");///打印了
}
但是 !!!!!!!!!什么时候执行的回调函数 ??????哪里触发的???代码里面没找到过从哪里跳转过来的不知道




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

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-8-1
在线时间
25 小时
 楼主| 发表于 2021-1-30 12:18:34 | 显示全部楼层
接收函数能够打印出DMA中断里面的东西 然后执行回调函数这个好解释 但是发送没有进入DMA中断
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-1-30 16:19:18 | 显示全部楼层
不是在DMA中断里注册的回调函数。是在串口接收中断里,仔细看一下就明白了。
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-8-1
在线时间
25 小时
 楼主| 发表于 2021-1-30 16:43:44 | 显示全部楼层
c2007s 发表于 2021-1-30 16:19
不是在DMA中断里注册的回调函数。是在串口接收中断里,仔细看一下就明白了。

我用的DMA传输 串口中断void USART1_IRQHandler(void) 也没进区 没打印出来东西的
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2021-2-1 07:57:52 | 显示全部楼层
你要使能串口中断,使能串口发送完成中断才行
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
发表于 2021-2-2 09:42:31 | 显示全部楼层
HAL_DMA_IRQHandler ----> hdma->XferCpltCallback(hdma);

hdma->XferCpltCallback(hdma); 谁来初始化的? 在HAL_UART_Receive_DMA /HAL_UART_Transmit_DMA 函数中来初始化这个函数指针
huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt;

UART_DMAReceiveCplt----->HAL_UART_RxCpltCallback;
我帮你分析RX ,TX一样的
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-8-1
在线时间
25 小时
 楼主| 发表于 2021-2-2 13:48:27 | 显示全部楼层
烈日灼心 发表于 2021-2-2 09:42
HAL_DMA_IRQHandler ----> hdma->XferCpltCallback(hdma);

hdma->XferCpltCallback(hdma); 谁来初始化 ...

huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt; 这句话在发送里面有但是在Normol模式下有个判断语句没有执行HAL_UART_TxCpltCallback(huart); 而且这只是给huart->hdmatx->XferCpltCallback赋值了传输函数哪里触发的  感觉TX和RX函数有点不一样
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-8-1
在线时间
25 小时
 楼主| 发表于 2021-2-2 16:47:10 | 显示全部楼层
a5820736 发表于 2021-2-1 07:57
你要使能串口中断,使能串口发送完成中断才行

我直接用的那个发送函数HAL_UART_Transmit_DMA   但是最后进入了回调函数的
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-8-1
在线时间
25 小时
 楼主| 发表于 2021-2-2 16:47:38 | 显示全部楼层
友善君 发表于 2021-2-2 16:47
我直接用的那个发送函数HAL_UART_Transmit_DMA   但是最后进入了回调函数的

问题是什么时候 哪里调用的
回复

使用道具 举报

90

主题

534

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1059
金钱
1059
注册时间
2017-4-12
在线时间
280 小时
发表于 2021-2-3 09:21:39 | 显示全部楼层
友善君 发表于 2021-2-2 13:48
huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt; 这句话在发送里面有但是在Normol模式下有个判 ...

传输函数是你调用的啊,你不是要通讯? 那你就得调用底层的传输函数,我看了TX,RX一样的啊,这个十分容易理解,不知道你卡在哪里了,要么debug一下什么都出来了
穷不可怕,可怕的是穷的是我~~~
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-8-1
在线时间
25 小时
 楼主| 发表于 2021-2-9 19:49:49 | 显示全部楼层
解决了  。。。不能在里面打印。。。。有个优先级关系
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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