1.前言

很多时候我们需要将程序中的一些参数、数据等存储在EEPROM或者Flash中,达到掉电保存的目的。但有些情况下,程序需要频繁的修改这些参数,如果每次修改参数都进行一次保存,那将大大降低存储器的寿命。尤其是单片机内部Flash,以STM32F030K6T6为例,擦写寿命只有1000次。当然,这是最小值,实际可能比这个多,但也是有风险。

因此,最好的办法就是在程序运行中不进行保存操作,只在断电时保存一次。

掉电保存的关键是怎样检测掉电瞬间,方法有很多种:

  1. 通过外部电路检测电源,触发IO中断。
  2. 通过单片机的PVD(可编程电压检测器) 中断检测。
  3. 通过ADC看门狗中断检测。

不管那种方式,一般都是通过中断来实现,主要是为了快速响应。

今天主要介绍第三种方式,通过ADC看门狗实现掉电保存。

2.硬件设计

2.1掉电时间

掉电保存的前提是断电后电源电压是缓慢下降的,这样才有足够的时间去检测掉电并保存数据。因此,电源上必须有个大电容,保证电源断开后能继续给单片机供电。

具体需要维持多长时间,要看存储器的擦写周期。以STM32F030K6T6的内部存储器为例,擦除一页需要30ms,写入一个16位数据需要53.5us。根据实际需要擦除和写入的数据多少来计算至少需要多少时间。

还需要关注一个参数,编程电压。在用示波器测量掉电时的波形时,测量出从断电瞬间到电压降低到2.4V时的时间,该时间大于总的数据擦写的时间即可。当然要留有一定裕量。如果时间不够,就要加大电容了。

2.2ADC检测

ADC检测掉电的方式有两种,一种是通过某个通道直接采集电源电压(或者分压后采集),另一种是采集内部参考电压Vrefint来判断电源电压。

第一种方式很好理解,采样值就代表电源电压,可以直接去触发ADC的看门狗中断。

第二种方式由于内部参考电压是不变的,STM32F030是1.23V,有一定误差。当电源电压变化时,ADC采集的参考电压会发生变化,因此也可以判断通过这个变化触发看门狗中断。这里有个前提,即单片机的VREF引脚或AVDD引脚就是要检测的电源电压。

3.软件设计

首先打开STM32CubeMx,配置一下ADC,如下。

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

uint32_t adc_buf;HAL_ADCEx_Calibration_Start(&hadc);
HAL_Delay(100);
HAL_ADC_Start_DMA(&hadc,(uint32_t*)&adc_buf,1);

然后再ADC的中断中添加保存数据的程序即。

void ADC1_IRQHandler(void)
{/* USER CODE BEGIN ADC1_IRQn 0 *//* USER CODE END ADC1_IRQn 0 */HAL_ADC_IRQHandler(&hadc);/* USER CODE BEGIN ADC1_IRQn 1 */Save_Param();  //保存参数while(1);/* USER CODE END ADC1_IRQn 1 */
}

这里有两点需要注意

一是在中断中先关闭功耗较大的外设,比如液晶背光、数码管等。使断电时电源电压下降不至于太快。

二是在保存数据后关闭看门狗中断,或者直接死循环(因为已经断电,也不需要执行其它程序了)。这样做主要是为了防止电压下降的太慢,多次触发看门狗中断,导致最后一次写入错误。

【干货】STM32通过ADC模拟看门狗实现掉电保存相关推荐

  1. STM8单片机 ADC模拟看门狗中文资料错误

      在调试stm8单片机的adc模拟看门狗功能时,不管怎么设置ADC_HTR和ADC_LTR寄存器的值,然后通过IAR软件单步调试时观察这两个寄存器的值都不对.   根据中文手册上看,高位寄存器存储的 ...

  2. STM8单片机ADC模拟看门狗功能实现

      看门狗的功能大家都知道,而这个模拟看门狗又是什么东西呢?   简单的说就是这个模拟看门狗可以实时监控ADC采样的数据,当采样的数据值小于设置的最小值或者大于设置的最大值时,单片机就会触发ADC中断 ...

  3. 模拟看门狗如何实现?

    关注.星标公众号,不错过精彩内容 作者:逸珺 转自:STM32 对于看门狗大家或许不陌生,但对于模拟看门狗有的朋友可能就不甚了解了.本文来聊聊模拟看门狗,旨在梳理相应的概念,理解模拟看门狗原理.与常规 ...

  4. [STM32F1官方例程讲解2] 模拟看门狗Analog Watchdog

    [STM32F1官方例程讲解2] 模拟看门狗 第一章 模拟看门狗简介 第二章 STM32F1模拟看门狗相关配置函数介绍 第三章 电路原理图与库函数配置 3.1 程序逻辑 3.2 硬件原理(LED灯) ...

  5. c语言中什么叫喂狗,STM32是怎么初始化看门狗和喂狗的

    STM32是怎么初始化看门狗和喂狗的 看门狗初始化步骤: 1.IWDG_PR和IWDG_RLR寄存器具有写保护功能.要修改这两个寄存器的值,必须先向 IWDG_KR寄存器中写入0x5555. 2.设置 ...

  6. STM32 HAL库窗口看门狗

    STM32 HAL库窗口看门狗 1.窗口看门狗基本原理 2.独立看门狗与串口看门狗区别 3.应用场合 4.窗口看门狗的时钟 5.窗口看门狗寄存器: ①.看门狗控制寄存器(WWDG_CR) 2.配置寄存 ...

  7. STM32外部中断与看门狗

    STM32外部中断与看门狗 前面说过中断的概念了,但是没有细究,中断除了内部中断(比如运行错误),还能受到外部中断 文章目录 STM32外部中断与看门狗 一 外部中断描述 1.1 外部中断描述 1.2 ...

  8. STM32 (五)看门狗

    看门狗简介: 顾名思义就是看门的dog,不过这可不是用来看家的,而是用来看单片机的, 在由单片机构成的微型计算机系统中单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环:或者因为 ...

  9. STM32中的独立看门狗和窗口看门狗

    STM32中的独立看门狗和窗口看门狗 在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况.为了避免这种情况的出现,后期的MCU都集成了看门狗的功能.但是,目前看门狗发展到今天 ...

最新文章

  1. CEPH集群更换ip(更换ip前的防范和更换ip后的恢复)
  2. 64位程序怎么判断指针是否有效_C 语言指针怎么理解?
  3. 人生苦短,我要换Go!
  4. CSS的几个属性display,float,clear,overflow,visibility
  5. linux中/etc/passwd文件与/etc/shadow文件解析
  6. openvc学习笔记(4)——两种方法在没有环境下运行程序
  7. linux之睡眠函数(my_sleep)
  8. 教职工使用计算机管理制度,教师配置笔记本电脑管理办法
  9. Gambit 4.运行时选项
  10. cisco2811 路由器修改密码
  11. Vscode怎么进行文件对比-Vscode文件对比的方法介绍
  12. 大数据和人工智能未来发展趋势
  13. 基础实验 7-2.1 魔法优惠券(25 分)
  14. 前端与美工职能上的区别
  15. 低代码,虽然有点毒瘤,但管用就好
  16. 高频交易(一)应用于高频交易中的对冲策略分析
  17. UIDatePicker得到的时间中怎么去掉时分秒(字符串操作知识拓展)--iOS开发
  18. 使用tensorboard时http://localhost:6006打不开或desktop-2a1fhsu 已拒绝连接
  19. IDEA使用Tomcat
  20. qt 绘制消息框_Qt显示带文本输入的消息框

热门文章

  1. 深入理解sql分组查询(group by)
  2. EZView如何与NVR语音对讲?
  3. JS实现页面跳转并对新页面进行操作
  4. Java经典实例(第二版)
  5. retrofit+rxjava京东订单
  6. Comparator比较器
  7. 计算机毕业设计之大数据机器学习Python+SpringBoot考研分数分析与预测系统 大数据毕业设计 考研大数据分析 考研大数据预测 考研数据分析 KNN算法 人工智能
  8. 包装是品牌设计中最直接最有效的广告载体
  9. vue项目webpack打包配置
  10. Linux安装及基础命令了解