如何利用单片机的FLASH进行上次断电操作

        每当我们的单片机断电之后就无法进行上次的操作,如何让单片机在单片机在断电之后继续进行单片机断电之前的操作呢?

        其实原理很简单,只需要将上次的操作存入单片机的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)); //等待按键松开 
			}
		}
	}
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啵啵520520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值