当前位置:   article > 正文

STM32F4系列 HAL Flash 读写_hal_flash_unlock

hal_flash_unlock

前言

注意:F0F1系列和F4系列的Flash读写操作不相同

一、STM32CubeMX怎么查看芯片的Flash分布?

在这里插入图片描述
在这里插入图片描述

二、擦除F4系列Flash

本例程使用的是F411CEU6的型号芯片
在这里插入图片描述

1.擦除Flash代码

1.基本操作:

void FlashErase(void)
{
    int sect = 0;
    HAL_FLASH_Unlock();//解锁
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | 
                          FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除一些错误标志

    FLASH_Erase_Sector(1,FLASH_VOLTAGE_RANGE_3);//擦除指定的闪存扇区1(0x08004000~0x08007FFF)
    HAL_FLASH_Lock();//上锁
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.由开始地址计算出所在的扇区位置:

//F411CEU6 512k 8个扇区
uint32_t sectStartAddr[8]=
{
    0x08000000,//0
    0x08004000,//1
    0x08008000,//2
    0x0800c000,//3
    0x08010000,//4
    0x08020000,//5
    0x08040000,//6
    0x08060000 //7
};
//获取Sector的编号
int GetSectorFromAddress(uint32_t address)
{
    int sect;
    if( address < 0x08000000 || address > 0x0807FFFF )
        return -1;
    for( int i=0; i<8; i++ )
    {
        if( address >= sectStartAddr[i] && address < sectStartAddr[i+1] )
        {
            sect = i;
            break;
        }
    }
    return sect;
}

//清除扇区
//StartAddress:取值范围(0x08000000~0x0807FFFF)
void FlashErase(uint32_t StartAddress)
{
    int sect = 0;
    HAL_FLASH_Unlock();//解锁
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | 
                          FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除一些错误标志
                          
    sect = GetSectorFromAddress(StartAddress);//获取地址所在的扇区
    FLASH_Erase_Sector(sect,FLASH_VOLTAGE_RANGE_3);//擦除指定的闪存扇区(0~7)
    HAL_FLASH_Lock();//上锁
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

在这里插入图片描述

2.Flash写入数据

代码如下(32位数据写入,可以改成8/16/32/64位):

//写数据
void FlashWrite(uint32_t StartAddress,uint32_t data)
{
	//可以添加一些 StartAddress地址 是否有效的判断
    HAL_FLASH_Unlock();//解锁
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,StartAddress,data);
    HAL_FLASH_Lock();//上锁
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

3.Flash读取数据

代码如下(示例):

//读数据
uint32_t FlashRead(uint32_t StartAddress)
{
    return *(uint32_t *)StartAddress;
}
  • 1
  • 2
  • 3
  • 4
  • 5

读取数据比较简单,直接返回地址的值就可以了
在这里插入图片描述

总结

Flash的擦除和写都需要进行 解锁 操作完了别忘记 上锁

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号