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

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

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


4.png


因此,最好的办法就是在程序运行中不进行保存操作,只在断电时保存一次。掉电保存的关键是怎样检测掉电瞬间,方法有很多种:
1.通过外部电路检测电源,触发IO中断。
2.通过单片机的PVD(可编程电压检测器) 中断检测。
3.通过ADC看门狗中断检测。
不管哪种方式,一般都是通过中断来实现,主要是为了快速响应。今天主要介绍第三种方式,通过ADC看门狗实现掉电保存。

2.硬件设计
2.1掉电时间
掉电保存的前提是断电后电源电压是缓慢下降的,这样才有足够的时间去检测掉电并保存数据。因此,电源上必须有个大电容,保证电源断开后能继续给单片机供电。
具体需要维持多长时间,要看存储器的擦写周期。以STM32F030K6T6的内部存储器为例,擦除一页需要30ms,写入一个16位数据需要53.5us。根据实际需要擦除和写入的数据多少来计算至少需要多少时间。
还需要关注一个参数,编程电压。在用示波器测量掉电时的波形时,测量出从断电瞬间到电压降低到2.4V时的时间,该时间大于总的数据擦写的时间即可。当然要留有一定裕量。如果时间不够,就要加大电容了。


3.png


2.2ADC检测
       ADC检测掉电的方式有两种,一种是通过某个通道直接采集电源电压(或者分压后采集),另一种是采集内部参考电压Vrefint来判断电源电压。
第一种方式很好理解,采样值就代表电源电压,可以直接去触发ADC的看门狗中断。
第二种方式由于内部参考电压是不变的,STM32F030是1.23V,有一定误差。当电源电压变化时,ADC采集的参考电压会发生变化,因此也可以通过这个变化触发看门狗中断。这里有个前提,即单片机的VREF引脚或AVDD引脚就是要检测的电源电压。


2.png

3.软件设计
首先打开STM32CubeMx,配置一下ADC,如下。


1.png


首先需要使能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采样,如下:
  1. uint32_t adc_buf;

  2. HAL_ADCEx_Calibration_Start(&hadc);
  3. HAL_Delay(100);
  4. HAL_ADC_Start_DMA(&hadc,(uint32_t*)&adc_buf,1);
复制代码



然后再ADC的中断中添加保存数据的程序即。
  1. void ADC1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN ADC1_IRQn 0 */
  4.   /* USER CODE END ADC1_IRQn 0 */
  5.   HAL_ADC_IRQHandler(&hadc);
  6.   /* USER CODE BEGIN ADC1_IRQn 1 */
  7.   Save_Param();  //保存参数
  8.   while(1);
  9.   /* USER CODE END ADC1_IRQn 1 */
  10. }
复制代码

这里有两点需要注意:
一是在中断中先关闭功耗较大的外设,比如液晶背光、数码管等。使断电时电源电压下降不至于太快。
二是在保存数据后关闭看门狗中断,或者直接死循环(因为已经断电,也不需要执行其它程序了)。这样做主要是为了防止电压下降的太慢,多次触发看门狗中断,导致最后一次写入错误。



转载自: 嵌入式技术开发
收藏 1 评论1 发布时间:2023-2-7 22:01

举报

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

ADC1_IRQHandler 这个函数是哪里来的?

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版