直接上代码
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "rtc.h"
#include "stm32f10x.h"
int main(void)
{
u8 t=0;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
LED_Init(); //LED端口初始化
//使能PWR和BKP外设时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 //RTC初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 使能 PVD 中断 */
NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 配置 EXTI16 线(PVD 输出) 来产生上升下降沿中断*/
EXTI_ClearITPendingBit(EXTI_Line16);
EXTI_InitStructure.EXTI_Line = EXTI_Line16;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/*具体级别根据自己的实际应用要求配置*/
PWR_PVDLevelConfig(PWR_PVDLevel_2V2);
/* 使能 PVD 输出 */
PWR_PVDCmd(ENABLE);
while(1)
{
if(BKP_ReadBackupRegister(BKP_DR2) == 0x5030)
{
t = t+1;
if(t==50)BKP_WriteBackupRegister(BKP_DR2, 0X5020);
LED0=!LED0;
}
delay_ms(100);
}
}
void PVD_IRQHandler(void)
{
if (PWR_GetFlagStatus (PWR_FLAG_PVDO)==SET)
{
BKP_WriteBackupRegister(BKP_DR2, 0X5030); //向指定的后备寄存器中写入用户程序数据
}
EXTI_ClearITPendingBit(EXTI_Line16);
}
用的正点原子F103战舰的开发板,可以直接烧录。有十个寄存器可以用,我这用的第二个,基本上不乱动PC13的话数据是不会丢的。断电检测的电压是2.2V可以自行设置的。
有大佬看见的话希望也可以指点几句,将不胜感激。