完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
大家好!
我正在尝试编写一个简单的代码来启动基于定时器临时化的 ADC DMA。 为了在 Nucleo-STM32F401RE 板上执行此操作,我使用: tiM2,通道1,输出比较无输出,模式冻结; ADC1,通道0,定时器2触发事件,上升沿; DMA2 Stream0,循环模式。 查看调试代码工作正常,timer2 启动并触发中断(如果它们已启用),ADC 转换启用位在启动指令后更改其在寄存器中的值,但 DMA 回调和 ADC 转换从未发生,因此转换缓冲区仍然为空。 有人可以查看代码并帮助我吗? 代码下方: 定时器 2 初始化:
谢谢大家! |
|
相关推荐
1个回答
|
|
|
您的问题可能与 DMAContinuousRequests 和 ADC ContinuousMode 的配置不正确有关。
启用 ADC ContinuousMode 后,第一个 TRGO 信号将使 ADC 自由运行并尽可能快地转换。 在禁用 ADC 连续模式的情况下,每个 TRGO 脉冲将触发一次 ADC 转换。 如果启用 DMAContinuousRequests,DMA 将永远不会停止(回调将在每次半/全传输时调用),缓冲区将不断被覆盖以接收新数据。DMA 应设置为Circular 模式,以便缓冲区地址到达末尾时重新启动,否则会导致DMA 溢出错误。 如果 DMAContinuousRequests 被禁用,它只会在指定的长度传输后执行一次。 在那之后,如果你想开始一个新的 ADC 传输,你必须用 ADC_STOP_DMA 重置 ADC,然后再次调用 ACD_START_DMA,这可以在回调本身上完成。 在您的代码中,如果我正确理解您的意图,您希望 DMA 连续填充缓冲区,而不仅仅是一次。 因此,您应该启用 DMAContinuousRequests 并将 DMA 配置为循环模式。应该这样做。 请记住,ADC DMA“长度”参数是在 DMA 字中指定的,而不是以 8/16/32 位数据大小指定的。 检查 DMA 模式
不要使用 DMA_Stream IRQ,HAL 会自动处理它,还会清除 DMA 标志。 当您执行 HAL_ADC_Start_DMA 时,它将 DMA 回调设置为其自己的私有回调。 最后,当 DMA 触发回调时,HAL 会将这些回调重定向到 ADC 回调。 (是的,回调无处不在) 此外,请记住在使用 __HAL_TIM_CLEAR_FLAG(TIM_FLAG_UPDATE) 启动时基之前清除定时器标志; 否则,您会在启用代码中可能不够用的计时器后立即中断。 我知道一开始有点难以理解,但通过一些练习,您将最终理解 HAL 及其工作方法。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
stm32mp157的异核通信的rpmsg_sdb的m4固件和a7驱动该如何编写?
1453 浏览 0 评论
stm32f103用freertos对一个采样率为1kHz的传感器,进行采样,数据出差
1502 浏览 0 评论
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
3649 浏览 1 评论
3842 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
2461 浏览 1 评论
STM32H7打开DCache后,出现了串口接收信息为空的现象,是哪里出了问题?
727浏览 5评论
用NANO STM32F103RBT6的开发板烧录不了是哪里出了问题?
663浏览 5评论
710浏览 5评论
外部中断触发类型为双边沿触发,进入中断回调后有什么办法判断该边沿是上升沿还是下降沿?
941浏览 5评论
STM32L071CBT6低温环境下无法正常工作是什么原因引起的?
745浏览 5评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 07:40 , Processed in 0.593565 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
454