STM32F103掉电保存数据问题

2019-07-21 06:50发布

检测电路.png
我使用的STM32F103C8T6芯片,使用PA2管脚检测电压,当断电时检测到低于阈值电压,然后flash存储一个有10个16位数据的数组。上电时这10个数据重新给到这个数组。请大神帮忙调试个程式,谢谢。
我在网上看到操作PVD寄存器的,设置通道16,我这个PA2管脚应该怎么配置?
还是请大神给个完整的程式,自己琢磨。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
rjx007
1楼-- · 2019-07-21 08:54
本帖最后由 rjx007 于 2018-1-5 11:27 编辑

这是我之前发的一个帖子的摘录:
不用ADC检测,只要用库里提供的现成的几个函数就能行。前提是电源的滤波电容要大些,以提供足够的时间来保存数据。我试过,保存十几个数据是不成问题的。
我也试过用ADC来检测电源电压,检测点必须取在电源的主滤波电容后,7805或LM1117_3.3之前,电容要大些,并且要电阻分压。没有这个方法简洁,两者效果一样。上电时只要读出eeprom就行了。
以下是之前发过的一个帖子的摘录:
终于搞定了!根本不用这么复杂,用简单的查询方式就可以了,几条语句就行了,与大家分享:思路非常务实:
1、开PWR时钟-----必须的。
2、使能PVD
3、设置监控电压的阈值,这里设为2.9V.
4、再判断到阈值后,标志位是否置位,如置位,就保存数值到EEPROM.
至于为什么用中断方式失败,原因不清。

int main()
{
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);  //打开PWR时钟
     PWR_PVDCmd(ENABLE);     //使能PVD
     PWR_PVDLevelConfig(PWR_PVDLevel_2V9);   //设置PVD的探测电压阀值为2.9V。可设置范围:2.2-2.9
   
     while(1)
        {
               if(PWR_GetFlagStatus(PWR_FLAG_PVDO)==SET)  //判断WR_FLAG_PVDO的标志位是否置位,即电压是否跌落到2.9V了。
                     {                  
                              AT24CXX_WriteOneByte(0x02,VOLUME_1); //write_eep(0x02,VOLUME_1);       //如若置位了,就保存数据。   
                              delay_ms(4);                 
                     }
        }

}

xxssl
2楼-- · 2019-07-21 12:58
本帖最后由 xxssl 于 2018-1-5 11:20 编辑

1、单片机需要一个单独的电池供电才行,要不然掉电了,单片机也没有电无法操作flash存储
2、如果没有电池供电,那可以10秒或1分钟存储一次,当重新上电时读取最近一次的存储


yanzhongqian
3楼-- · 2019-07-21 17:29
 精彩回答 2  元偷偷看……
rjx007
4楼-- · 2019-07-21 22:19
本帖最后由 rjx007 于 2018-1-5 15:30 编辑

方法是一样的,只要将数据写入flash中就可以的,我也试过。只是写flash要麻烦些,先要擦除整页,再写入数据,可看原子的例程。
灵魂的重量
5楼-- · 2019-07-21 23:23
二楼说的对,加一个超级电容用于断电时进行短暂的供电以供MCU保存相关数据。
rjx007
6楼-- · 2019-07-21 23:58
不用超级电容,容量大就可以了。

一周热门 更多>