STM32F3??ADC??????????ADC

Similar documents
STM32Cube_FW_F4?RTC??????BUG

ST template WORD

ST template WORD

证券期货市场之主要诚信规范

Microsoft Word - 三峽鎮衛生所_3_-張家宸.李永繁.doc

Microsoft Word - 武漢大學交流營心得_黃莉云_.doc

第 一 节 认 识 自 我 的 意 义 一 个 人 只 有 认 识 自 我, 才 能 够 正 确 地 认 识 到 自 己 的 优 劣 势, 找 出 自 己 的 职 业 亮 点, 为 自 己 的 顺 利 求 职 推 波 助 澜 ; 一 个 人 只 有 认 识 自 我, 才 能 在 求 职 中 保 持

欢迎辞

日 涨 幅 偏 离 值 达 到 7% 的 前 五 只 证 券 : 温 氏 股 份 ( 代 码 ) 涨 幅 偏 离 值 :11.68% 成 交 量 :1752 万 股 成 交 金 额 : 万 元 机 构 专 用 机 构 专 用

上市公司股东大会投票信息公告( )

东 华 能 源 江 苏 苏 亚 金 诚 已 报 备 因 地 域 及 审 计 时 间 安 排 等 原 因 中 兴 华 已 报 备 客 户 重 新 选 聘 会 计 师 事 务 所 亿 帆 鑫 富 立 信 已 报 备 客

光 一 科 技 重 大 事 项, 特 停 茂 业 商 业 重 要 事 项 未 公 告, 连 续 停 牌 浙 富 控 股 重 大 事 项, 特 停 键 桥 通 讯 重 大 事 项, 特 停 黑 牛 食 品 重 大 事 项, 特 停

郑 州 煤 电 重 要 事 项 未 公 告, 连 续 停 牌 金 圆 股 份 重 大 事 项, 特 停 永 鼎 股 份 重 要 事 项 未 公 告, 连 续 停 牌 长 城 影 视 临 时 停 牌 天 兴 仪 表 临 时 停 牌

卧 龙 地 产 重 要 事 项 未 公 告, 连 续 停 牌 春 兴 精 工 临 时 停 牌 *ST 沧 大 重 要 事 项 未 公 告, 连 续 停 牌 天 地 源 重 要 事 项 未 公 告, 连 续 停 牌 汇 冠 股 份

金 圆 股 份 重 大 事 项, 特 停 长 城 影 视 临 时 停 牌 天 兴 仪 表 临 时 停 牌 商 赢 环 球 重 要 事 项 未 公 告, 连 续 停 牌 荣 安 地 产 临 时 停 牌 中 南 文 化

Untitled Document

商 业 城 大 华 标 准 70 万 70 万 驰 宏 锌 锗 瑞 华 标 准 140 万 150 万 亚 星 锚 链 江 苏 公 证 天 业 标 准 80 万 80

金 陵 饭 店 中 兴 华 已 报 备 按 照 国 资 委 要 求 定 期 轮 换 天 衡 已 报 备 按 照 国 资 委 要 求 定 期 轮 换 *ST 中 富 中 喜 已 报 备 业 务 约 定 书 到 期 普

辉 丰 股 份 重 大 事 项, 特 停 南 方 轴 承 临 时 停 牌 德 力 股 份 临 时 停 牌 瑞 丰 光 电 临 时 停 牌 联 建 光 电 临 时 停 牌 卡 奴 迪 路 临 时 停 牌

股票代码: 股票简称:*ST新梅 编号:临

昆 明 机 床 瑞 华 已 报 备 前 任 服 务 年 限 较 长 毕 马 威 华 振 已 报 备 未 与 客 户 未 就 2015 年 审 计 收 费 达 成 一 致 意 见 中 国 核 电 天 健 已 报 备 定

金 利 科 技 临 时 停 牌 凤 凰 光 学 重 要 事 项 未 公 告, 连 续 停 牌 安 源 煤 业 重 要 事 项 未 公 告, 连 续 停 牌 万 泽 股 份 临 时 停 牌 爱 康 科 技 重 大 事 项, 特 停

<4D F736F F D20D0C5CFA2BBAFB7A2D5B9D6D8B5E3D7A8CFEEB9E6BBAE2E646F63>

关于建立境内违法互联网站黑名单管理制度的通知

? 這 全 都 是 市 政 府 提 供 給 我 的 資 料 低 底 盤 公 車 計 畫 96 年 預 算 新 台 幣 4,500 萬 元 97 年 預 算 新 台 幣 1 億 6,500 萬 元 98 年 預 算 新 台 幣 3 億 2,300 萬 元, 共 有 307 台 低 底 盤 公 車,99

《捕捉儿童敏感期》

2 國 文 考 科 試 題 解 析 命 題 出 處 與 南 一 版 第 五 冊 第 二 課 幽 夢 影 選 課 程 內 涵 同 試 題 解 析 某 君 講 信 用, 重 然 諾, 行 事 穩 健, 工 作 負 責 較 符 合 謹 飭 友 謹 飭 友 指 的 是 言 行 謹 慎 而 有 節 制 的 朋

untitled

29 碳 酸 钙 D3 片 ( 别 名 维 生 素 D3 碳 酸 钙 ) 吉 林 省 第 一 批 低 价 药 30 炔 诺 酮 滴 丸 吉 林 省 第 一 批 低 价 药 31 去 氯 羟 嗪 片 吉 林 省 第 一 批 低 价 药 32 茶 苯 海 明 片 吉 林 省 第 一 批 低 价 药 33

穨飲食與養老_決定版_.PDF

untitled

untitled

ST template WORD

RTC

bingdian001.com

< Essential LEDtube > | < Philips >

CC213

DR2010.doc

Moto Z

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

CE UL LLHA5 / 7 ( LLGT22 ) ( LLHA9 ) ( LLGT22 ) ( LLHA9 ) 3 ( LLHA5 / 7 ) ( LLGT22 ) ( LLHA5 / 6 )

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

untitled

Leica IC90 E Leica IC90 E: USB 20 HDMI 22 SD () CLR ( ) 30 CLR ( ) 31 EXPSURE () 32 RESLUTIN ( ) 33 SETUP CAMER

IP Encoder 1 channel.book

_殷宝华-内部高级会员教材.doc

Microsoft PowerPoint - ch6 [相容模式]

各位法師各位居士大德阿彌陀佛

untitled

BlueNRG-1

ICD ICD ICD ICD ICD

标题

untitled

INTRODUCTION TO COM.DOC

STM32Cube V1

STM32 for sensorless vector control

专业主干课程与主要专业课程教学大纲(2009年、2011年).doc

Microsoft Word - MSP430 Launchpad 指导书.docx

川 仪 股 份 重 要 事 项 未 公 告, 连 续 停 牌 *ST 江 化 临 时 停 牌 珠 海 中 富 盘 中 停 牌 广 东 甘 化 重 大 事 项, 特 停 大 豪 科 技 拟 筹 划 重 大 资 产 重 组, 连 续

世 纪 游 轮 重 大 事 项, 特 停 全 信 股 份 临 时 停 牌 金 利 科 技 临 时 停 牌 凤 凰 光 学 重 要 事 项 未 公 告, 连 续 停 牌 安 源 煤 业 重 要 事 项 未 公 告, 连 续 停 牌

世 纪 游 轮 重 大 事 项, 特 停 全 信 股 份 临 时 停 牌 金 利 科 技 临 时 停 牌 凤 凰 光 学 重 要 事 项 未 公 告, 连 续 停 牌 安 源 煤 业 重 要 事 项 未 公 告, 连 续 停 牌

得 润 电 子 重 大 事 项, 特 停 三 垒 股 份 重 大 事 项, 特 停 天 源 迪 科 重 大 事 项, 特 停 全 通 教 育 临 时 停 牌 天 目 药 业 重 要 事 项 未 公 告, 连 续 停 牌 00215

26 头 孢 他 啶 注 射 剂 27 头 孢 他 美 酯 口 服 常 释 剂 型 28 头 孢 吡 肟 注 射 剂 29 头 孢 硫 脒 注 射 剂 30 头 孢 唑 肟 注 射 剂 31 头 孢 替 安 注 射 剂 32 头 孢 哌 酮 注 射 剂 33 头 孢 哌 酮 舒 巴 坦 注 射 剂

宁 波 联 合 天 健 标 准 无 诺 德 股 份 立 信 标 准 无 振 华 重 工 普 华 永 道 中 天 标 准 无 百 隆 东 方 201

着 力 推 进 提 高 项 目 总 包 能 力 ; 加 快 优 势 产 品 进 入 海 外 市 场 ; 努 力 盘 活 资 产, 提 高 经 营 收 现 能 力 ; 开 源 节 流, 做 好 资 金 收 支 平 衡, 确 保 资 金 链 安 全 但 由 于 当 前 重 机 行 业 形 势 仍 未 明

zt

FM1935X智能非接触读写器芯片

2012年新闻出版产业分析报告

2012年报.xls

19 19

untitled

标题

ST template WORD

一、

?????????????(2008~2020?)

0 1!, 10,,,,,, ( 1) 1 ( ) ( ) ( ) ( ) , , 7 10, 600,

C语言的应用.PDF

申万 二级大纲

Microsoft Word - MAN2011A_CH_RTT.doc

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

上市公司股东大会投票信息公告( )

untitled

Edge-Triggered Rising Edge-Triggered ( Falling Edge-Triggered ( Unit 11 Latches and Flip-Flops 3 Timing for D Flip-Flop (Falling-Edge Trigger) Unit 11

ChinaBI企业会员服务- BI企业

/ / (FC 3)...

Chapter #


C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

其 他 陸 龜 ( 象 龜 ) 科 其 他 活 龜 其 他 爬 蟲 類 沙 氏 變 色 蜥 其 他 爬 蟲 類 猛 禽 鸚 鵡 目 包 括 鸚 鵡

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

1 重 要 提 示 基 金 管 理 人 的 董 事 会 及 董 事 保 证 本 报 告 所 载 资 料 不 存 在 虚 假 记 载 误 导 性 陈 述 或 重 大 遗 漏, 并 对 其 内 容 的 真 实 性 准 确 性 和 完 整 性 承 担 个 别 及 连 带 责 任 基 金 托 管 人 招 商

1

中文朗科AirTrackTM T600 迷你无线路由器用户手册.doc

untitled

ARK-14013/14017/14018

<4D F736F F D20B8BDBCFE34A3BACCECBAEBD6DCC6DA C4EAB5DA34BCBEB6C8B1A8B8E62E646F63>

D2 17/10 食 完 早 餐 去 中 山 陵 和 明 孝 陵, 灵 谷 寺 到 景 区 的 巴 士 : 游 1 游 2 游 路 ( 票 价 在 1-2 元 间 ) 三 个 地 点 中 间 凭 门 票 免 费 乘 坐 景 区 小 火 车 往 来 晚 上 有 力 气 的 话 去 夫 子

AL-M200 Series

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

e bug 0 x=0 y=5/x 0 Return 4 2

Transcription:

STM32F30x 禁止 ADC 已关闭情况下再次关闭 ADC 前言 STM32F30x 系列的 12 位 SAR ADC 有很多鲜明的特色性能, 比如采样率可以达到 5 MSPS, 可支持差分输入, 等等 但是, 由于设计的不同, 在使用上也有不少不太一样的地方, 我们在使用 STM32F30x 的 ADC 外设的时候, 还是要仔细了解一些使用的细节 问题 某客户在其产品的设计中, 使用了 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) 程序中也可以看到这一点 void ADC_DisableCmd(ADC_TypeDef* ADCx) /* Check the parameters */ assert_param(is_adc_all_periph(adcx)); /* Set the ADDIS bit */ ADCx->CR = ADC_CR_ADDIS; 但是, 问题来了,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) 函数, 其程序内容为 :

static HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef* hadc) uint32_t tickstart = 0; /* Verification if ADC is not already disabled: */ /* Note: forbidden to disable ADC (set bit ADC_CR_ADDIS) if ADC is already */ /* disabled. */ if ( HAL_ADC_IS_ENABLED(hadc)!= RESET ) /* Check if conditions to disable the ADC are fulfilled */ if ( HAL_ADC_DISABLING_CONDITIONS(hadc)!= RESET) /* Disable the ADC peripheral */ HAL_ADC_DISABLE(hadc); else /* Update ADC state machine to error */ hadc->state = HAL_ADC_STATE_ERROR; /* Set ADC error code to ADC IP internal error */ hadc->errorcode = HAL_ADC_ERROR_INTERNAL; return HAL_ERROR; /* Wait for ADC effectively disabled */ tickstart = HAL_GetTick(); while(hal_is_bit_set(hadc->instance->cr, ADC_CR_ADEN)) if((hal_gettick()-tickstart) > ADC_DISABLE_TIMEOUT) /* Update ADC state machine to error */ hadc->state = HAL_ADC_STATE_ERROR; /* Set ADC error code to ADC IP internal error */ hadc->errorcode = HAL_ADC_ERROR_INTERNAL; return HAL_ERROR; /* Return HAL status */ return HAL_OK;

在这个函数注释中有个 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) /* Check the parameters */ assert_param(is_adc_all_periph(adcx)); if (((ADCx->CR & (ADC_CR_ADEN ADC_CR_ADDIS)) == ADC_CR_ADEN) && ((ADCx->ISR & ADC_FLAG_RDY) == ADC_FLAG_RDY)) if (( ADCx->CR & (ADC_CR_JADSTART ADC_CR_ADSTART ADC_CR_ADEN)) == ADC_CR_ADEN) /* Set the ADDIS bit */ ADCx->CR = ADC_CR_ADDIS; /* Clear ADC_FLAG_EOSMP and ADC_FLAG_RDY flags */ ADCx->ISR = (uint32_t)adc_flag_eosmp; ADCx->ISR = (uint32_t)adc_flag_rdy; /* Wait for ADC effectively disabled */ while ((ADCx->CR & ADC_CR_ADEN) == ADC_CR_ADEN) 当然, 不动 void ADC_DisableCmd(ADC_TypeDef* ADCx) 程序也可以, 只需在用户程序中对这些限制进行判断即可 上面的 while 循环中, 也可以加入超时退出机制 结论 连续两次对 ADDIS 控制位进行写 1, 是错误的操作行为, 将会导致 ADC 进入未知状态, 工作不正常 处理 修改程序, 避免错误的操作行为 建议 在使用 STM32F30x 系列的 ADC 外设时, 必须要对控制位的操作限制有明确的了解 在 STM32F30x 的 快速 ADC 模块 培训资料中, 也有对此进行描述, 如下 :

最重要还是要看参考手册, 多注意一些小细节

重要通知 - 请仔细阅读 意法半导体公司及其子公司 ( ST ) 保留随时对 ST 产品和 / 或本文档进行变更 更正 增强 修改和改进的权利, 恕不另行通知 买方在订货之前应获取关于 ST 产品的最新信息 ST 产品的销售依照订单确认时的相关 ST 销售条款 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任 ST 不对任何知识产权进行任何明示或默示的授权或许可 转售的 ST 产品如有不同于此处提供的信息的规定, 将导致 ST 针对该产品授予的任何保证失效 ST 和 ST 徽标是 ST 的商标 所有其他产品或服务名称均为其各自所有者的财产 本文档中的信息取代本文档所有早期版本中提供的信息 2015 STMicroelectronics - 保留所有权利