- STM32 CUBEMX系列——flash的使用
- 1、flash地址
- 2、创建flash.c和flash.h
- 3、添加代码
- 4、函数使用
- 总结
1、flash地址
查阅使用芯片的flash地址范围
2、创建flash.c和flash.h创建flash.c放于src文件夹,flash.h放于inc文件夹。然后在工程中添加。
找到flash.c后点击add,编译工程后即可。
在flash.h中添加如下代码:
#ifndef __flash_H
#define __flash_H
#ifdef __cplusplus
extern "C" {
#endif
#include "main.h"
#include "stm32f1xx_hal_flash.h"
#define start_addr 0x0803A800 //flash 开始地址
#define flash_length 150
extern uint8_t flash_write(uint8_t addr ,uint32_t *data,uint16_t length);//flash写
extern uint32_t flash_read(uint8_t addr);//flash读
static uint32_t GetPage(uint32_t addr);//flash 读
extern uint16_t FLASH_ReadHalfWord(uint8_t addr) ;
extern uint32_t FLASH_ReadWord(uint8_t addr);
extern uint32_t mix32_t(uint8_t a1, uint8_t a2,uint8_t a3,uint8_t a4);//flash写
#ifdef __cplusplus
}
#endif
#endif
在flash.c中添加如下函数
uint8_t flash_write(uint8_t addr ,uint32_t data[],uint16_t length)//flash д
{
uint32_t flash_mem[flash_length];
if((addr+length)<=length)
{
for(uint8_t i=addr;i<(addr+length);i++)
{
flash_mem[i] = data[i-addr];
}
}
FLASH_EraseInitTypeDef my_flash;
HAL_FLASH_Unlock();
my_flash.Banks = FLASH_BANK_1;
my_flash.TypeErase = FLASH_TYPEERASE_PAGES;
my_flash.PageAddress =start_addr ;
my_flash.NbPages = 1;
uint32_t PageError = 0;
while(HAL_OK!=HAL_FLASHEx_Erase(&my_flash, &PageError)){};
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
for(uint8_t i=0x00;i
uint8_t mark=3;
while((flash_mem[i]!=flash_read(i))&&mark)
{
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, start_addr+i*4, flash_mem[i]);
//My_Printf(&huart1,"%d-%d ",i,flash_read(i));
mark--;
}
}
HAL_FLASH_Lock();
return NULL;
}
以上为flash写入函数
flash读出函数如下
uint32_t flash_read(uint8_t addr)
{
return *(__IO uint32_t*)( start_addr+(addr)*4 );
}
4、函数使用
可在需要的地方调用函数即可。
总结flash的使用



