完善资料让更多小伙伴认识你,还能领取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 及其工作方法。 |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2723 浏览 1 评论
3237 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1807 浏览 1 评论
3646 浏览 6 评论
6034 浏览 21 评论
1334浏览 4评论
209浏览 3评论
196浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
350浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
442浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 18:30 , Processed in 1.004583 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号