用STM32的PVD功能实现掉电保存,不成功,求帮助

2019-08-14 19:30发布

本帖最后由 rjx007 于 2017-8-2 14:17 编辑

想用STM32的PVD功能来实现掉电保存数据,但不成功,请帮我看看是什么原因。当达到设定的阈值时产生中断,此时将数据写入AT24C02,24C02的写入是没有问题的,已用其他方式试过。

void pvd_init(void)           //
{        

        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;        

        /* 开启PVD时钟 */
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);        //开启PVD时钟  

        /* 设置中断的模式 */         
        EXTI_InitStructure.EXTI_Line=EXTI_Line16;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;   //表示电压从高电压下降到低于设定的电压阀值产生中断  
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        
        /* 设置NVIC参数 */        
        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                 
        NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;         //打开PVD中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                  //响应优先级为3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                   //使能
        NVIC_Init(&NVIC_InitStructure);
        
       PWR_PVDCmd(ENABLE);
       PWR_PVDLevelConfig(PWR_PVDLevel_2V9);       // 设定监控阀值            
}


void PVD_IRQHandler()           //PVD中断函数
{
        
        if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
            {
                  
                  AT24CXX_WriteOneByte(0x02,VOLUME_1); //write_eep(0x02,VOLUME_1);         
                  delay_ms(10);                 
           }
        EXTI_ClearITPendingBit(EXTI_Line16);//清除EXTI线路挂起位        
}





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
rjx007
1楼-- · 2019-08-14 23:26
沉得好快,继续求解。
rjx007
2楼-- · 2019-08-15 04:01
本帖最后由 rjx007 于 2017-8-2 09:57 编辑

回楼上:
也曾怀疑是时间不够,遂将3.3V的滤波电容加大到1500U,仍不行,实在想不出原因了。
我曾试过用ADC来检测电源电压,设定电压跌落至2.9V时,将数据写入EEPROM,此时滤波电容仅用220U,且从ADC得到数据到写EEPROM,使用的是还是查询方式,做了上百次试验,都能非常可靠的保存数据。
按理讲PVD用得的是中断,要比ADC快得多吧?
再说两者都是写相同的EEPROM,更何况才仅仅写一个数据呢?
用ADC保存数据:

//掉电记忆
void pwr_down(void)
{     
   if(ad<=3360)
      {                  
         AT24CXX_WriteOneByte(0x02,VOLUME_1);                 //write_eep(0x02,VOLUME_1);         
         delay_ms(10);        
      }
}


rjx007
3楼-- · 2019-08-15 09:08
 精彩回答 2  元偷偷看……
mygod
4楼-- · 2019-08-15 11:13
用中断写吧,曾经在中断中 写进一页的数据,就是64byte
39035605
5楼-- · 2019-08-15 16:50
没用过,,,来看看。。

一周热门 更多>