HAL库实践记录之读写内部FLASH

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 ;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值