每当我们的单片机断电之后就无法进行上次的操作,如何让单片机在单片机在断电之后继续进行单片机断电之前的操作呢?
其实原理很简单,只需要将上次的操作存入单片机的FLASH 里面(起始地址是0x8000000),当上电之后,先将FLASH里面该段数据从新取出来继续操作即可。
首先需要两个函数,分别是读FLASH和写FLASH的函数
1、读FLASH函数
//FLASH读出数据
u16 FLASH_R(u32 add)//参数1:32位读出FLASH地址。返回值:16位数据
{
u16 a;
a = *(u16*)(add);//从指定页的addr地址开始读
return a;
}
2、写FALSH函数
//FLASH写入数据
void FLASH_W(u32 add,u16 dat)//参数1:32位FLASH地址。参数2:16位数据
{
FLASH_Unlock(); //解锁FLASH编程擦除控制器
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
FLASH_ErasePage(add); //擦除指定地址页
FLASH_ProgramHalfWord(add,dat); //从指定页的addr地址开始写
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
FLASH_Lock(); //锁定FLASH编程擦除控制器
}
拥有着两个函数过后,下面就是mian.c进行操作的程序
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "flash.h"
#define FLASH_START_ADDR 0x0801f000 //写入的起始地址
int main (void){//主程序
u16 a; //定义变量
//初始化程序
RCC_Configuration(); //时钟设置
LED_Init();//LED初始化
KEY_Init();//按键初始化
a = FLASH_R(FLASH_START_ADDR);//从指定页的地址读FLASH
GPIO_Write(GPIOC,a); //直接数值操作将变量值写入LED(LED在GPIOB组的PB0和PB1上)
while(1){
if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)){ //读按键接口的电平
delay_ms(20); //延时20ms去抖动
if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)){ //读按键接口的电平
a++; //变量加1
if(a>3){ //当变量大于3时清0
a=0;
}
GPIO_Write(GPIOC,a); //直接数值操作将变量值写入LED
FLASH_W(FLASH_START_ADDR,a); //从指定页的地址写入FLASH
while(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)); //等待按键松开
}
}
}
}