stm32F4電源管理PVD掉電數據存儲

很多時候,我們希望我們的單片機在掉電後,可以對一些數據進行保存,下次上電可以讀取這些數據,繼續工作。現在我項目用到的是STM32F4單片機,利用STM32F4自帶的PVD電源管理配置如下:

初始化PVD:

void PWR_PVD_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR時鐘

NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;           //使能PVD所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//搶佔優先級1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //子優先級0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);

EXTI_StructInit(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line16;             //PVD連接到中斷線16上
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     //使用中斷模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //電壓低於閥值時產生中斷
EXTI_InitStructure.EXTI_LineCmd = ENABLE;               //使能中斷線
EXTI_Init(&EXTI_InitStructure);                         //初始

PWR_PVDLevelConfig(PWR_PVDLevel_7);//設定監控閥值   注意和F1的區別  F1的電壓等級就更直觀   PWR_PVDLevel_2V8 
PWR_PVDCmd(ENABLE);//使能PVD     

}

中斷服務函數:
void PVD_IRQHandler(void)
{
static u16 MOTOR_absolute[4];

if(EXTI_GetITStatus(EXTI_Line16) != RESET)
{
    MOTOR_absolute[0]=Xabsolute;
    MOTOR_absolute[1]=Yabsolute;
    MOTOR_absolute[2]=Zabsolute;
    MOTOR_absolute[3]=Oabsolute;
    //掉電了緊急情況處理

    //寫入座標值到FLASH
    STMFLASH_Write(FLASH_SAVE_ADDR,(u32*)MOTOR_absolute,4);
    printf("%d %d %d %d\n",Xabsolute,Yabsolute,Zabsolute,Oabsolute);

//不能寫入外部FLASH  可能是電壓原因,所以只能寫入內部FLASH        
//  res=f_open (&fil,"1:/MOTOR_absolute.txt", FA_CREATE_ALWAYS|FA_WRITE);     //機械手的一些配置信息管理文件
//      
//  for(i=0;i<4;i++)
//  {
//      f_printf(&fil,"%x\n",MOTOR_absolute[i]);
//      printf("%d\n",MOTOR_absolute[i]);
//  }           

    /* Clear the Key Button EXTI line pending bit */
    EXTI_ClearITPendingBit(EXTI_Line16);
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章