stm32读写flash

通常情况下我们的32的flash不会被占满,这时候我们可以用32的flash存储一些我们不希望在掉电时候会丢的数据。
在这里我使用的芯片时stm32f103zet6。flash大小为512k。
由keil编译器我们可以看到该芯片的内部flash起始地址为0x08000000,大小为0x80000。内部RAM的起始地址为0x20000000,大小为0x10000。这个是在我们选择芯片型号是编译器自动帮我们加载的,一般情况下无需修改。
这里写图片描述
确定了flash的大小及地址,我们还需要知道我们该往哪里写入我们要储存的数据。一般情况下flash的起始部分会存储程序。我们存入的数据必须在程序占用不到的地方。keil编译环境下编译后会生成一个map格式文件,默认储存在Listing文件夹里。打开这个文件可以看到我们的RAM和ROM使用情况。在这里我的程序只用到了0x080039b0。可见我的代码很小,才用到了flash几十分之一,即使如此我们在一般情况下在储存数据时也要在flash的最后开始使用。这样可以方便我们的代码扩展。而且一般情况下我们也不需要存储大量的数据,如果存储大量数据还是要扩充片外flash。
这里写图片描述
在ST官方库中提供了页擦除的函数,所以我们还需要知道flash的内部分页情况。stm32系列产品根据内存大小不同,分页方式也有所不同。下图是stm32f103zet6的内部flash分页情况。
这里写图片描述
说了这么多,究竟该如何进行flash读写呢?下面上代码。

FLASH_Unlock();       //解锁flash
FLASH_ErasePage(0x08060000);    //擦除指定页
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); //清除标志位
FLASH_ProgramWord(0x08060000,0x0001);    //在指定的地址写入数据
FLASH_Lock();     //锁flash
int val=*((volatile int *)(0x08060000));       //读出指定地址的数

这是一段简单的flash读写代码,下面我们将其封装成函数。
//读取指定地址的半字(16位数据)
//faddr:读地址(此地址必须为2的倍数!!)
//返回值:对应数据.

//读取指定地址的半字(16位数据)
//faddr:读地址(此地址必须为2的倍数!!)
//返回值:对应数据.
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
    return *(vu16*)faddr; 
}

//不检查的写入
//WriteAddr:起始地址
//pBuffer:数据指针
//NumToWrite:半字(16位)数
void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)   
{                    
    u16 i;
    for(i=0;i<NumToWrite;i++)
    {
        FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
        WriteAddr+=2;//地址增加2.
    }  
} 

//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToWrite:半字(16位)数
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)     
{
    u16 i;
    for(i=0;i<NumToRead;i++)
    {
        pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
        ReadAddr+=2;//偏移2个字节.   
    }
}

注意:
1、 写flash之前一定要先解锁
2、写之前一定擦除,擦除后全为1

博客代码部分摘自正点原子,如有侵权请告知。

STM32是一款嵌入式芯片,在嵌入式系统中,Flash是一种存储器件,用来存储程序。STM32可以读写Flash,让我们能够修改程序,实现芯片控制。 STM32芯片内部Flash分为两种:一种是Main Flash,还有一种是System Flash。其中,Main Flash主要用来存放应用程序,而System Flash则保存了一些系统信息,比如Bootloader。 使用STM32读写Flash需要多个步骤。首先,需要进行初始化。初始化代码如下: HAL_FLASH_Unlock(); flash_erase_init.TypeErase = FLASH_TYPEERASE_PAGES; flash_erase_init.PageAddress = ADDRESS; flash_erase_init.NbPages = 1; HAL_FLASHEx_Erase(&flash_erase_init, &PAGE_ERROR); HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADDRESS, DATA); HAL_FLASH_Lock(); 其中,HAL_FLASH_Unlock()和HAL_FLASH_Lock()函数用来对Flash进行解锁和锁定操作。 其次,需要擦除Flash,该步骤是很重要的,因为Flash是有限制次数的,反复写入易造成擦除的次数过多,缩短Flash寿命。程序如上: flash_erase_init.TypeErase = FLASH_TYPEERASE_PAGES; flash_erase_init.PageAddress = ADDRESS; flash_erase_init.NbPages = 1; HAL_FLASHEx_Erase(&flash_erase_init, &PAGE_ERROR); 上述程序代码指定FLASH_TYPEERASE_PAGES为扇区擦除,擦除起始地址ADDRESS,并指定擦除扇区数为1。 然后,使用HAL_FLASH_Program函数向Flash写入数据,程序如下: HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADDRESS, DATA); 该函数参数分别代表 需要向Flash写入的数据Flash地址和写入操作方式等。 最后,需要做好Flash的锁定防止外部因素对Flash的更改操作,使用的函数和解锁步骤相同。程序如下: HAL_FLASH_Lock(); 总的来说,STM32读写Flash的操作需要进行初始化,擦除Flash,向Flash写入数据,并锁定防止外部更改。这些步骤需要仔细核实,但是一旦操作成功,便可以实现 STM32 上关键性的程序修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值