有关FLASH读写的函数:
有关库函数:
实现掉电不丢失的主函数(Flash一定要先擦后写):
#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(LEDPORT,a); //直接数值操作将变量值写入LED(LED在GPIOB组的PB0和PB1上)
//主循环
while(1){
//示例4:有锁存
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
delay_ms(20); //延时20ms去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读按键接口的电平
//在2个LED上显示二进制加法
a++; //变量加1
if(a>3){ //当变量大于3时清0
a=0;
}
GPIO_Write(LEDPORT,a); //直接数值操作将变量值写入LED(LED在GPIOB组的PB0和PB1上)
FLASH_W(FLASH_START_ADDR,a); //从指定页的地址写入FLASH
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开
}
}
}
}
Tips:FLASH操作注意事项:
- 操作一定要先擦后写。
- 每页是1024个地址,起始地址0x08000000 擦除操作以页为单位,写操作则必须以16位宽度为单位,允许跨页写入。
- STM32内置FLASH擦或写时,必须打开外部/内部高速振荡器。
- FLASH可多次擦写10万次,不可死循环擦写。
- 擦写时要避开用户程序存储区的区域,否则会擦掉用户程序导致错误。
- 擦除一页要10ms(对于1k大小的一页),比较慢。而且不能单个字节的擦写。
Tips:F103C8T6页对应地址:
拓展:
1、写保护功能(禁止写入):
2、读保护功能(禁止读出):