Advertisement

【STM32】FLASH擦写+FLASH相关操作+注意事项

阅读量:

有关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)); //等待按键松开 
    
 			}
    
 		}
    
 	}
    
 }
    
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/IYchHUf8kvOMbzwo72PlXgrLWpN6.png)

Tips:FLASH操作注意事项:

操作必须先擦除后进行书写。
每页包含1024个地址块,在起始地址为[bank account]的位置进行擦拭操作时,默认是以页为单位完成的;而书写操作则需以十六位宽度为单位完成,并且允许跨页完成。 当使用STM32内置FLASH存储器进行擦除或重写操作时,默认情况下会开启外部高速振荡器以保证操作的稳定性。 该存储器支持最多[bank account]次的擦拭与重写循环;但需注意避免死循环状态。 在执行擦拭操作时,请务必避免触及用户数据存储区域;否则可能导致系统功能异常。 完成一次页数据的清除需要至少[bank account]$毫秒的时间,并且不能逐字节进行清除。

Tips:F103C8T6页对应地址:


拓展:

1、写保护功能(禁止写入):

2、读保护功能(禁止读出):

全部评论 (0)

还没有任何评论哟~