完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在使用 NUCLEO-64 STM32L476RG,我知道启动 ADC 以在模拟端口中获取读数非常简单。然而,应该等待转换完成,并且 HAL 库具有可以使用超时值调用的 HAL_ADC_PollForConversion() 函数。
但是HAL_ADC_PollForConversion()会进入循环,直到ADC完成转换;我想在转换发生时释放 CPU 以执行其他任务(在 FreeRTOS 中)。 因此,我正在考虑使用 0 超时值调用 HAL_ADC_PollForConversion() 并在返回为 HAL_tiMEOUT 时调用 osDelay(1)。(这将重复直到返回 HAL_OK。) 但是,我在 HAL_ADC_PollForConversion 代码中注意到超时导致调用以下两行: /* 更新 ADC 状态机超时 */ SET_BIT(hadc->状态,HAL_ADC_STATE_TIMEOUT); /* 进程解锁 */ __HAL_UNLOCK(hadc); 这会阻止 ADC 完成转换过程吗? 调用 HAL_ADC_PollForConversion 2 次或更多次(最有可能 2 次)会导致任何不可预见的问题吗? (注意:我可以使用中断来接收转换结束的通知;但是,模拟值的读取不是时间关键的。) |
|
相关推荐
1个回答
|
|
它会起作用。如果 ADC 数据不可用,函数将返回 HAL_TIMEOUT(数字 3)。如果数据存在 HAL_OK(数字 0)。
但是用 0 超时一个一个地调用这个函数将花费你的应用程序相当多的时间。 我建议在中断模式下读取 ADC 转换。它会将整个过程保留在后台,并且对您的操作系统计时影响很小。 在这种情况下,重要的一点是决定哪个中断优先级应该有 ADC。 这里有两个选项: - 高于操作系统。在这种情况下,ADC 可以中断操作系统操作,您不能从 ADC 中断过程中执行任何操作系统功能 - 在操作系统组内(数值等于或高于 FreeRTOSConfig.h 中指定的 configMAX_SYSCALL_INTERRUPT_PRIORITY 值)。在这种情况下,您可以使用此中断过程中的操作系统功能,但从另一方面来看,它会被操作系统关键部分阻塞,这些部分用于任何操作系统组件(任务、信号量、队列、软件计时器、互斥锁)状态修改 在这两种情况下,您都会为您的任务赢得更多时间,如果您需要这些 ADC 数据来完成某些任务,您可以使用信号量来阻止它,直到 ADC 数据可用。 |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2644 浏览 1 评论
3209 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1784 浏览 1 评论
3613 浏览 6 评论
5990 浏览 21 评论
940浏览 4评论
1317浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
585浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1304浏览 3评论
1362浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 16:07 , Processed in 1.164859 second(s), Total 48, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号