本帖最后由 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线路挂起位
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
回楼上:
也曾怀疑是时间不够,遂将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);
}
}
一周热门 更多>