概述
FLASH数据读写
需要掉电存储少量数据,存储到内部Flash是比较好的选择。
硬件STM32f030K6T6。
固件:HAL
对于内部分flash操作大同小异。
写数据基本流程为解锁-》写入-》上锁,库函数都有对应的函数。
关于写数据,HAL只提供了三种数据类型的写入,HALFWORD、WORD、DOUBLEWORD,分别对应16bit、32bit、64bit。
写数据函数为HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);第一个形参就是数据类型的定义。查看函数定义发现,多字节数据都会被分解以HALFWORD形式进行写入,所以HAL库向flash写入数据的最小单位是HALFWORD。
最终对flash写操作的函数:
static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data)
{
/* Clean the error context */
pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
/* Proceed to program the new data */
SET_BIT(FLASH->CR, FLASH_CR_PG);
/* Write data in the address */
*(__IO uint16_t*)Address = Data;
}
3.5标准库读写flash
uint32_t address = 0x08003000;
uint32_t already_times = 0;
FLASH_Unlock(); //解锁
already_times = *((__IO uint32_t*)address); //读取
already_times++;
FLASH_ErasePage(address); //擦除
FLASH_ProgramWord(address, already_times); //写入
FLASH_Lock(); //上锁
FLASH读保护与写保护
写保护的解除与保护:stm32f030使用hal固件库
//宏定义设置要操作的flash页
#define FLASH_PAGE_TO_BE_PROTECTED ( OB_WRP_PAGES8TO11
|OB_WRP_PAGES12TO15
|OB_WRP_PAGES16TO19
|OB_WRP_PAGES20TO23
|OB_WRP_PAGES24TO27
|OB_WRP_PAGES28TO31)
void FLASH_WriteProtect();
{
FLASH_OBProgramInitTypeDef OptionsBytesStruct;
retr = HAL_FLASH_Unlock();
retr |= HAL_FLASH_OB_Unlock();
//获取写保护状态(有写保护时WRPPage低8位中对应的位为0)
HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
if((OptionsBytesStruct.WRPPage&FLASH_PAGE_TO_BE_PROTECTED)!=FLASH_PAGE_TO_BE_PROTECTED)
{
//设置结构体参数,
OptionsBytesStruct.OptionType = OPTIONBYTE_WRP;
//此项参数设置写保护或解除写保护。OB_WRPSTATE_ENABLE
OptionsBytesStruct.WRPState = OB_WRPSTATE_DISABLE;
OptionsBytesStruct.WRPPage = FLASH_PAGE_TO_BE_PROTECTED;
if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
{
print(flash WRP error);
return ;
}
HAL_FLASH_OB_Launch();
}
HAL_FLASH_Lock();
HAL_FLASH_OB_Lock();
}
读保护:注意读保护等级设置1级即可。
void FLASH_ReadOutProtection(FunctionalState State)
{
static HAL_StatusTypeDef retr;
static FLASH_OBProgramInitTypeDef OptionsBytesStruct;
retr = HAL_FLASH_Unlock();
retr |= HAL_FLASH_OB_Unlock();
//获取保护状态
HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
if((OptionsBytesStruct.RDPLevel) != OB_RDP_LEVEL_0)
{
OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
if(State == ENABLE)
OptionsBytesStruct.WRPState = OB_WRPSTATE_ENABLE;
else
OptionsBytesStruct.WRPState = OB_WRPSTATE_DISABLE;
OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_1;
if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
{
/* Error occurred while options bytes programming. **********************/
return;
}
HAL_FLASH_OB_Launch();
}
HAL_FLASH_Lock();
HAL_FLASH_OB_Lock();
return ;
}
最后
以上就是清脆手套为你收集整理的HAL库实践记录之读写内部FLASH的全部内容,希望文章能够帮你解决HAL库实践记录之读写内部FLASH所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复