STM32读写FLASH

要点:

读写前要解锁并擦除整页才可以重新写入

 

测试代码

#include "my_flash.H"

/**
  * @brief 往内部FLASH写入数据
  * @param addr 写入地址
  * @param pdata 存储待写数据
  * @retval None
  */
void FLASH_Inside_Wr(uint32_t addr,uint32_t Pdata)
{
    //定义局部变量
    uint32_t PageError = 0;
    HAL_StatusTypeDef HAL_Status;
    //擦除配置信息结构体,包括擦除地址、方式、页数等
    FLASH_EraseInitTypeDef pEraseInit;
    pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;//按页擦除
    pEraseInit.PageAddress = addr;//擦除地址
    pEraseInit.NbPages = 1;//擦除页数量
    //step1 解锁内部FLASH,允许读写功能
    HAL_FLASH_Unlock();
    //step2 开始擦除addr对应页
    HAL_Status = HAL_FLASHEx_Erase(&pEraseInit,&PageError);//擦除
    if(HAL_Status != HAL_OK) printf("内部FlASH擦除失败!rn");
    //step3 写入数据
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr,Pdata);
    //step4 锁定FLASH
    HAL_FLASH_Lock();
}


/**
  * @brief 读取内部FLASH数据
  * @param addr 读取地址
  * @retval 读出的数据
  */
uint32_t FLASH_Inside_Rd(uint32_t addr)
{
    //定义局部变量
    uint32_t RdData = 0;
    //step1 解锁内部FLASH,允许读写功能
    HAL_FLASH_Unlock();
    RdData = *(__IO uint32_t *)addr;
    //step2 锁定FLASH
    HAL_FLASH_Lock();

    return RdData;
}

/**
  * @brief 内部FLASH读写测试
  */
void FLASH_Inside_Test(void)
{
    printf("\r\n------------------内部FLASH读写测试------------------\r\n");
    uint32_t addr = 0x0800FC00;//确保该地址内部FLASH是空余的!
    uint32_t WrData = 0x01234567;//待写入数据
    uint32_t RdData = 0;//存储读取数据

    printf("地址0x%x写入数据:0x%x\r\n",addr,WrData);
    FLASH_Inside_Wr(addr,WrData);//写入数据
    RdData = FLASH_Inside_Rd(addr);//读取数据
    printf("地址0x%x读出数据:0x%x\r\n",addr,RdData);
}
#ifndef __my_flash_H
#define __my_flash_H
#include "stm32f1xx_hal.h"
#include "bsp_debug_usart.h"

void FLASH_Inside_Wr(uint32_t addr,uint32_t Pdata);
uint32_t FLASH_Inside_Rd(uint32_t addr);
void FLASH_Inside_Test(void);





#endif
FLASH_Inside_Test();
			while(1)
			{;}

读取上电前的flash内容

uint32_t FLASH_ADDRESS = 0x0800FC00 ;//确保该地址内部FLASH是空余的!0xfc00=63kb字节
			uint32_t WrData = 0x01234588;//待写入数据
			uint32_t RdData = 0;//存储读取数据
			
			uint32_t last_flash = 0x00000000;
			HAL_FLASH_Unlock();
			last_flash = *(__IO uint32_t *)FLASH_ADDRESS;
			
			
//			FLASH_Inside_Test();
//			while(1)
//			{;}
			
			while(1){

				printf("------------------内部FLASH读写测试------------------\r\n");
//				flash 起始地址0x8000000;flash大小64k;flash结束地址0x08010000

			
				HAL_FLASH_Unlock();
				printf("last_flash 0x%x \r\n",last_flash);
				printf("write :0x%x = 0x%x \r\n",FLASH_ADDRESS,WrData);
				HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,FLASH_ADDRESS,WrData);
				RdData = *(__IO uint32_t *)FLASH_ADDRESS;
				printf("after 0x%x = 0x%x \r\n",FLASH_ADDRESS,*(__IO uint32_t *)FLASH_ADDRESS);
				HAL_FLASH_Lock();
		}

读写片上flash

keil调试查看内存

 

posted @ 2024-07-23 15:16  为鲸  阅读(131)  评论(0编辑  收藏  举报