你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32通过ADC模拟看门狗实现掉电保存

[复制链接]
STMCU小助手 发布时间:2023-2-7 22:01
1.前言很多时候我们需要将程序中的一些参数、数据等存储在EEPROM或者Flash中,达到掉电保存的目的。但有些情况下,程序需要频繁的修改这些参数,如果每次修改参数都进行一次保存,那将大大降低存储器的寿命。尤其是单片机内部Flash,以STM32F030K6T6为例,擦写寿命只有1000次。当然,这是最小值,实际可能比这个多,但也是有风险。# K+ Q" e% H8 D5 a7 p  I' a
% q& g7 O. ]! d2 M/ E

+ d4 a* |4 E& r3 E  X6 R2 O6 M  x 4.png   s1 J: j, T) G1 }3 z

! l% W0 e! ?# p& X  q% n8 X4 `

. H+ ~( L0 t" A# K" ~因此,最好的办法就是在程序运行中不进行保存操作,只在断电时保存一次。掉电保存的关键是怎样检测掉电瞬间,方法有很多种:
4 d( _6 [: c4 f5 P4 H! M- }* P9 [1.通过外部电路检测电源,触发IO中断。
8 J5 N: r, J& W% U- E3 g4 w% X. a2.通过单片机的PVD(可编程电压检测器) 中断检测。
$ y( }# S3 E! I9 N, |% H( P; @/ _/ s3.通过ADC看门狗中断检测。
! n# C+ V/ u  e$ B# a- f* r不管哪种方式,一般都是通过中断来实现,主要是为了快速响应。今天主要介绍第三种方式,通过ADC看门狗实现掉电保存。
2 S/ X6 W, D: {) y) g  `
2.硬件设计
2.1掉电时间
掉电保存的前提是断电后电源电压是缓慢下降的,这样才有足够的时间去检测掉电并保存数据。因此,电源上必须有个大电容,保证电源断开后能继续给单片机供电。
1 R3 r2 ?7 c- c+ N6 _' p具体需要维持多长时间,要看存储器的擦写周期。以STM32F030K6T6的内部存储器为例,擦除一页需要30ms,写入一个16位数据需要53.5us。根据实际需要擦除和写入的数据多少来计算至少需要多少时间。
! u2 |* d( ?( ?. E* D' e还需要关注一个参数,编程电压。在用示波器测量掉电时的波形时,测量出从断电瞬间到电压降低到2.4V时的时间,该时间大于总的数据擦写的时间即可。当然要留有一定裕量。如果时间不够,就要加大电容了。
. X; Z' f/ p9 w: G1 ^/ g; }, V0 i1 c4 A

2 q3 n  k- Y# @' }0 @ 3.png ; g0 I* p- W% @1 C. C; n& o% v

! b* I# Y4 U' M6 [6 Q& ]% P

5 w- n+ W4 D8 n2.2ADC检测
2 r: H! U8 i# T5 r2 I" ^3 i       ADC检测掉电的方式有两种,一种是通过某个通道直接采集电源电压(或者分压后采集),另一种是采集内部参考电压Vrefint来判断电源电压。
0 v3 F) d4 m; Y1 b& G/ k1 W第一种方式很好理解,采样值就代表电源电压,可以直接去触发ADC的看门狗中断。# O* r' ?- i+ [5 ?! D* X; d+ s
第二种方式由于内部参考电压是不变的,STM32F030是1.23V,有一定误差。当电源电压变化时,ADC采集的参考电压会发生变化,因此也可以通过这个变化触发看门狗中断。这里有个前提,即单片机的VREF引脚或AVDD引脚就是要检测的电源电压。
# x6 ~8 N6 A  C. E* l% V0 o, z6 ?

; P. ?/ x# {: j3 | 2.png " c- X7 P, r7 [$ i, c7 p- h
6 p1 I! E$ ?2 L4 I
3.软件设计7 f2 c& B& k0 d% R/ z# d/ C# S
首先打开STM32CubeMx,配置一下ADC,如下。
$ K6 l( k, {/ X3 o
2 h) [1 |+ L% U! b% p) p

& }* L: |: X6 I" i: V: H$ v% g 1.png
5 l/ V0 X7 w. d+ I! ]" r- I' P0 i; N- L/ F. M+ w

- O! s/ X& _3 z- L/ x7 u首先需要使能Vrefint Channel,如果需要其它通道也可以使能。其次需要使能ADC的看门狗,看门狗通道选择Vrefint,设置一下高/低门限值,使能看门狗中断模式,同时ADC的中断也要打开。这里的高/低门限是指,当ADC的采样值大于高门限或小于低门限时,ADC的看门狗中断将被触发。如果是用于掉电检测,只要关心高门限就行。正常时ADC采样值=1.23*4096/3.3,大约是1526左右,由于Vrefint和电源电压都有误差,所以只是个大概。如果我们将掉电电压检测值设为3.1V,那对应的ADC看门狗的高门限值应为1.23*4096/3.1,约1625左右。生成代码后,在初始化完成启动ADC采样,如下:" k9 G; u) c( U# W" l# [" i
  1. uint32_t adc_buf;
    / \; ~! ^3 x5 o* F# [
  2. , x0 \+ B5 s- w# d& t
  3. HAL_ADCEx_Calibration_Start(&hadc);& ^) l* N- Z* [) G
  4. HAL_Delay(100);; m0 X6 d9 d: n3 H0 ~- i
  5. HAL_ADC_Start_DMA(&hadc,(uint32_t*)&adc_buf,1);
复制代码

$ a, y  j& k. v: r
# ~( m9 U5 A" q, j- p5 r/ |. Z

4 B. o, O6 i9 B' o/ q然后再ADC的中断中添加保存数据的程序即。2 \8 q" [, U" J5 B
  1. void ADC1_IRQHandler(void)6 E( u5 c5 Z: @: X
  2. {# E1 e/ N4 \6 P2 R
  3.   /* USER CODE BEGIN ADC1_IRQn 0 */
    ( V" O: o& q3 n( w6 S( a2 h
  4.   /* USER CODE END ADC1_IRQn 0 */
      N# _# W! d( }4 O9 k7 [- @# D
  5.   HAL_ADC_IRQHandler(&hadc);
    7 q+ v8 P% J' F2 O, m: C8 T) [' s
  6.   /* USER CODE BEGIN ADC1_IRQn 1 */; Y+ I: E2 `/ I
  7.   Save_Param();  //保存参数8 ], R$ m# X7 X+ {
  8.   while(1);
    $ T. m5 t/ N* e  ~
  9.   /* USER CODE END ADC1_IRQn 1 */
    ; J6 C9 L' s% W! }
  10. }
复制代码
# b6 l) V% i  C4 m5 i# A) n& p3 T. K4 t
这里有两点需要注意:2 s. w& y% u! m' ?
一是在中断中先关闭功耗较大的外设,比如液晶背光、数码管等。使断电时电源电压下降不至于太快。
' O) G: T: X& _' i: v7 p1 @2 h1 ~二是在保存数据后关闭看门狗中断,或者直接死循环(因为已经断电,也不需要执行其它程序了)。这样做主要是为了防止电压下降的太慢,多次触发看门狗中断,导致最后一次写入错误。
! _' E+ T+ d  F' m) o  y8 f3 [, P9 e. p
/ i$ s; Z# Z( t, d8 A+ d1 S# j- }" m5 z+ w2 _" t2 H, E
* r$ z/ `8 _# D6 @6 Q- b* d
转载自: 嵌入式技术开发' d% \. G& c. `# c& U
赞 收藏 1 评论1 发布时间:2023-2-7 22:01

举报

1个回答
HL_zju 回答时间:2023-2-9 11:11:27

ADC1_IRQHandler 这个函数是哪里来的?

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版