新手上路 
 
	- 积分
 - 37
 
        - 金钱
 - 37 
 
       - 注册时间
 - 2020-3-1
 
      - 在线时间
 - 17 小时
 
 
 
 | 
 
20金钱 
各位大佬,我是实在没办法了,调了很久。是这样的,我用的单片机芯片是STM32F103C8T6芯片,最近想做一个掉电瞬间,通过PVD中断检测到低于掉电阈值,然后存储数据到flash里面,这样掉电以后就能够保存数据,下一次上电的时候读取flash就可以。但是经过我反复测试,当我进入PVD中断再执行flash存储的时候,我之前在main.c定义的几个数组,实时变化的数组里面的数据都复位了,站在我的角度来看就是,当我已经检测到掉电阈值附近的时候,flash要保存的数据已经被复位了,我保存的数组全部都是0了,就根本没有起到原本的作用。但这个时候我要是再对保存的数组赋值是可以存储完所有数据并再下一次上电的时候读取到的,证明我这段时间存储数据完全没有问题,但是检测到掉电的时候我所有的变量都已经复位了,有人遇到过这个么,实在是没办法了代码如下,A_Parameter是我用来掉电瞬间存入的数组,B_Parameter是上电读取的,IN_Parameter是我跑程序的时候要存储保存的数据数组,但问题就是这个IN_Parameter在掉电前是存有数据的,掉电检测了以后就直接复位了,所以再存的话我的数据也只能是0,起不到掉电保存的作用 
 
#include "memory.h" 
#include "stmflash.h" 
#include "stm32f10x_pwr.h" 
#include "delay.h" 
#include "main.h" 
u16 A_Parameter[36],B_Parameter[36];  //存储数据数组 
/************************************************************************** 
函数功能:从Flash读取指定数据 
入口参数:无 
返回  值:无 
**************************************************************************/ 
void Flash_Read(void) 
{ 
        STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)B_Parameter,36); 
}         
 
/************************************************************************** 
函数功能:向Flash写入数据 
入口参数:无 
返回  值:无 
**************************************************************************/ 
void Flash_Write(void) 
{         
  A_Parameter[0]=IN_Parameter[0]; 
        STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)A_Parameter,36);         
} 
 
 
void PVD_Init(void) 
{   
                NVIC_InitTypeDef NVIC_InitStruct; 
                EXTI_InitTypeDef EXTI_InitStructure; 
 
                NVIC_InitStruct.NVIC_IRQChannel = PVD_IRQn; 
                NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; 
                NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; 
                NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; 
                NVIC_Init(&NVIC_InitStruct);//允许中断 
 
                EXTI_ClearITPendingBit(EXTI_Line16); 
                EXTI_InitStructure.EXTI_Line                 = EXTI_Line16;  
                EXTI_InitStructure.EXTI_Mode                 = EXTI_Mode_Interrupt;  
                EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//EXTI_Trigger_Falling   ;//EXTI_Trigger_Rising;  
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
                EXTI_Init(&EXTI_InitStructure); 
 
 
} 
void PVD_Init_0(void) 
{ 
          RCC_APB1PeriphClockCmd( RCC_APB1Periph_PWR, ENABLE); //_PWR, ENABLE); // 这个是必需的         
                PWR_PVDLevelConfig(PWR_PVDLevel_2V9);  
                PWR_PVDCmd(ENABLE); 
} 
                 
 
 
 
void PVD_IRQHandler(void) 
{ 
        EXTI_ClearITPendingBit(EXTI_Line16); //必须在if外面。 
        if(PWR_GetFlagStatus(PWR_FLAG_PVDO)) // 
        { 
                Flash_Write();         
                PWR_ClearFlag(PWR_FLAG_PVDO); 
                //__set_PRIMASK(1);        //关闭总中断 
 
                //STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,11);本想在这里进行存储操作 
        }         
} 
 
 
 
 |   
 
 
最佳答案
查看完整内容[请看2#楼] 
这么做失败率太高了,先不说触发PVD中断的时候RAM会不会复位,就算不复位怎么保证在你写入Flash的这几十ms内供电可以保证MCU的工作,保证flash的供电呢?极端一点的情况就是刚触发PVD中断MCU就断电了 
 
 
 
 
 
 
 |