1、关于标准库的flash的读写擦除
主要引用江科大黄学长的即可。依次是读取、擦除、写入函数,另外读取和擦除涉及到对内存数据的修改所以区别于读取有解锁和上锁步骤,另外黄学长使用的板子是stm32f103,所以它就包含了“stm32f10x.h”,在自己使用时候记得修改成自己对应的头文件(不同系列芯片读写擦除函数的参数会有所不同,在使用时候可以去对应的型号的flash.c文件下查看)。具体函数如下
#include "stm32f10x.h" // Device header
/**
* 函 数:FLASH读取一个32位的字
* 参 数:Address 要读取数据的字地址
* 返 回 值:指定地址下的数据
*/
uint32_t MyFLASH_ReadWord(uint32_t Address)
{
return *((__IO uint32_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
/**
* 函 数:FLASH读取一个16位的半字
* 参 数:Address 要读取数据的半字地址
* 返 回 值:指定地址下的数据
*/
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{
return *((__IO uint16_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
/**
* 函 数:FLASH读取一个8位的字节
* 参 数:Address 要读取数据的字节地址
* 返 回 值:指定地址下的数据
*/
uint8_t MyFLASH_ReadByte(uint32_t Address)
{
return *((__IO uint8_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
/**
* 函 数:FLASH全擦除
* 参 数:无
* 返 回 值:无
* 说 明:调用此函数后,FLASH的所有页都会被擦除,包括程序文件本身,擦除后,程序将不复存在
*/
void MyFLASH_EraseAllPages(void)
{
FLASH_Unlock(); //解锁
FLASH_EraseAllPages(); //全擦除
FLASH_Lock(); //加锁
}
/**
* 函 数:FLASH页擦除
* 参 数:PageAddress 要擦除页的页地址
* 返 回 值:无
*/
void MyFLASH_ErasePage(uint32_t PageAddress)
{
FLASH_Unlock(); //解锁
FLASH_ErasePage(PageAddress); //页擦除
FLASH_Lock(); //加锁
}
/**
* 函 数:FLASH编程字
* 参 数:Address 要写入数据的字地址
* 参 数:Data 要写入的32位数据
* 返 回 值:无
*/
void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{
FLASH_Unlock(); //解锁
FLASH_ProgramWord(Address, Data); //编程字
FLASH_Lock(); //加锁
}
/**
* 函 数:FLASH编程半字
* 参 数:Address 要写入数据的半字地址
* 参 数:Data 要写入的16位数据
* 返 回 值:无
*/
void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{
FLASH_Unlock(); //解锁
FLASH_ProgramHalfWord(Address, Data); //编程半字
FLASH_Lock(); //加锁
}
2、关于HAL库的flash的读写擦除
这里是单个无符号32位的写入,其他的后续再补充吧!
#include "stm32f4xx_hal.h"
/* 读取flash数据 */
uint32_t ReadFlash( uint32_t faddr )
{
return *(__IO uint32_t*)faddr;
}
/* 写flash数据 */
void WriteFlash_byte(uint32_t faddr,uint32_t data)
{
HAL_FLASH_Unlock(); //解锁
FLASH_WaitForLastOperation(3000); // 等待FLASH操作完成 3000:超时时间
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,faddr,data); /* 写操作 */
FLASH_WaitForLastOperation(3000); // 等待FLASH操作完成 3000:超时时间
HAL_FLASH_Lock(); //上锁
}
/* 擦除操作 */
void easeFlash(uint8_t sector)
{
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t err;
HAL_FLASH_Unlock(); //解锁
FLASH_WaitForLastOperation(3000);
EraseInitStruct.Banks = FLASH_BANK_1; // 选择哪个Bank
EraseInitStruct.Sector = sector; // 要擦除哪个扇区
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS ; // 只是擦除操作
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3 ; // //电压范围,VCC=2.7~3.6V
EraseInitStruct.NbSectors = 1; //一次只擦除一个扇区
HAL_FLASHEx_Erase(&EraseInitStruct,&err); /* 擦除某一扇区 */
FLASH_WaitForLastOperation(3000);
HAL_FLASH_Lock(); //上锁
}
3、关于HAL库的flash的读写擦除吃的亏!!!
(1)不同系列芯片读写擦除函数的参数会有所不同,在使用时候可以去对应的型号的flash.c .h文件下查看
(2)资料阅读不仔细导致表用错了,地址也用超了(其实是STMG030K8T6的falsh根本没有内存地址分配表)