电子发烧友App

硬声App

扫码添加小助手

加入工程师交流群

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>模拟数字>STM32F30X禁止 ADC 已关闭情况下再次 关闭 ADC资料下载

STM32F30X禁止 ADC 已关闭情况下再次 关闭 ADC资料下载

2021-04-21 | pdf | 476.13KB | 次下载 | 3积分

资料介绍

问题某客户在其产品的设计中,使用了 STM32F302CCT6。客户在使用过程发现 ADC 在工作情况下会有各种各样奇奇怪怪的问题。调研1.了解问题客户在开发中使用了 STM32F30x 的标准外设库 STM32F30x_DSP_StdPeriph_Lib_V1.2.3,在其程序设计中,ADC1 是在使用的时候才打开的,在不使用的时候将 ADC1关闭。通过调用 void ADC_DisableCmd(ADC_TypeDef* ADCx)子程序,执行ADC_DisableCmd(ADC1)将 ADC1 关闭。仔细察看程序,发现程序中在 ADC1 的“打开→关闭→打开→关闭→…”循环的关闭中,执行了两次ADC_DisableCmd(ADC1)。2问题分析通过学习 STM32F30x 的参考手册,可以知道 STM32F30x 在对 ADC 进行关闭的操作与其他系列是不一样的;其他系列只要将 ADON 位清零就可以停止转换并使 ADC 进入掉电模式,而 STM32F30x 则不一样,它是通过置位 ADDIS 位来关闭 ADC的。在 void ADC_DisableCmd(ADC_TypeDef* ADCx)程序中也可以看到这一点。但是,问题来了,ADDIS 位是在什么情况下都可以置位的吗?我们来看一下参考手册中对关闭 ADC 的软件流程的描述:从描述中,我们可以知道:在置位 ADDIS 之前,必须先检测 ADSTART 位和 JADSTART 位,确保他们为零,也就是说没有正在进行的 A/D 转换。在 ADC Control register - ADCx_CR 寄存器中对 ADDIS 的描述也注明了:关于这一点,大多数人都是会注意到的。但是,注意这个就够了吗?关于 ADC 的控制位,在参考手册特别使用一个小节对向控制位写访问的限制进行详细描述,此小节为“Contraints when writing the ADC control bits”,在这一小节中,有一句话值得注意:注意这里的用词 only if,它的意思是“只有在 ADC 是打开状态,而且没有正在等待的关闭 ADC 的请求的情况下,也就是在ADEN=1 且 ADDIS=0 的情况下,才允许软件对 ADCx_CR 寄存器中的 ADSTART,JADSTART 和 ADDIS 位进行操作。在底下的“Note”注意中写道:这个注意说,这些禁止的 ADC 写访问行为是没有硬件保护去禁止的,错误的操作行为将导致 ADC 进入一个未知的状态。要恢复这种状态,必须将 ADC 彻底关闭(将 ADCx_CR 中的所有位全清零)。所以,现在可以知道,ADC1 工作不正常的原因正是因为连续执行了两次 ADC_DisableCmd(ADC1)。第一次执行ADC_DisableCmd(ADC1)时,当 ADC1 已经有效关闭时,ADEN 和 ADDIS 都被硬件清零,这个时候第二次再去写 ADDIS 位就是个错误的行为了,将会导致 ADC1 进入未知状态。3. 问题解决在解决问题之前,先来看一下 STM32Cube_FW_F3_V1.2.0 库中对 ADC 进行关闭的操作。打开 stm32f3xx_hal_adc_ex.c 文件,找到 static HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef* hadc)函数,其程序内容为:在这个函数注释中有个“Note: forbidden to disable ADC (set bit ADC_CR_ADDIS) if ADC is already disabled.”,再次告诉我们“禁止在 ADC 已经被关闭的情况下再次关闭 ADC”。然后,程序在运行中先对 ADC 是否已经被关闭进行了判断,如果已经被关闭,则不进行关闭操作;未被关闭情况下才会执行关闭操作。所以,在使用标准外设库的时候,我们也可以参考 Cube 库中的这种操作来进行改善。可以考虑对 void ADC_DisableCmd(ADC_TypeDef* ADCx)程序进行修改:当然,不动 void ADC_DisableCmd(ADC_TypeDef* ADCx)程序也可以,只需在用户程序中对这些限制进行判断即可。上面的while 循环中,也可以加入超时退出机制。结论连续两次对 ADDIS 控制位进行写 1,是错误的操作行为,将会导致 ADC 进入未知状态,工作不正常。处理修改程序,避免错误的操作行为。建议在使用 STM32F30x 系列的 ADC 外设时,必须要对控制位的操作限制有明确的了解。(mbbeetchina)
运放 模拟 放大 模电
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1PD取电芯片 ECP5702规格书
  2. 0.88 MB   |  3次下载  |  免费
  3. 2氮化镓GaN FET/GaN HEMT 功率驱动电路选型表
  4. 0.10 MB   |  2次下载  |  免费
  5. 3EMC PCB设计总结
  6. 0.33 MB   |  2次下载  |  免费
  7. 41节电池用电池保护IC S-8261D系列数据手册
  8. 3.07 MB   |  1次下载  |  1 积分
  9. 5PD取电芯片,可取5/9/12/15/20V电压ECP5702数据手册
  10. 0.88 MB   |  1次下载  |  免费
  11. 6飞腾FT2000-4 COM Express核心板技术手册0603
  12. 1.22 MB  |  1次下载  |  免费
  13. 7飞腾S5000C-64双路服务器系列应用宣传册--一乘科技
  14. 945.81 KB  |  1次下载  |  免费
  15. 8IP2345支持PD3.0等多种快充协议 支持4~6节串联电池最大充电功率30W异步升降压充电IC
  16. 1.41 MB  |  次下载  |  免费

本月

  1. 1美的电磁炉电路原理图资料
  2. 4.39 MB   |  22次下载  |  10 积分
  3. 2反激式开关电源设计解析
  4. 0.89 MB   |  16次下载  |  5 积分
  5. 3耗尽型MOS FET产品目录选型表
  6. 0.14 MB   |  3次下载  |  免费
  7. 4PD取电芯片 ECP5702规格书
  8. 0.88 MB   |  3次下载  |  免费
  9. 5氮化镓GaN FET/GaN HEMT 功率驱动电路选型表
  10. 0.10 MB   |  2次下载  |  免费
  11. 6EMC PCB设计总结
  12. 0.33 MB   |  2次下载  |  免费
  13. 7PC5200 700V_10A GaN HEMT驱动器数据手册
  14. 1.63 MB   |  1次下载  |  免费
  15. 81节电池用电池保护IC S-8261D系列数据手册
  16. 3.07 MB   |  1次下载  |  1 积分

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935137次下载  |  10 积分
  3. 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
  4. 1.48MB  |  420064次下载  |  10 积分
  5. 3Altium DXP2002下载入口
  6. 未知  |  233095次下载  |  10 积分
  7. 4电路仿真软件multisim 10.0免费下载
  8. 340992  |  191457次下载  |  10 积分
  9. 5十天学会AVR单片机与C语言视频教程 下载
  10. 158M  |  183360次下载  |  10 积分
  11. 6labview8.5下载
  12. 未知  |  81605次下载  |  10 积分
  13. 7Keil工具MDK-Arm免费下载
  14. 0.02 MB  |  73831次下载  |  10 积分
  15. 8LabVIEW 8.6下载
  16. 未知  |  65991次下载  |  10 积分