CKS32F4xx系列Flash操作

cathy的头像
cathy 发布于:周一, 01/29/2024 - 17:08 ,关键词:

CKS32F4xx系列芯片内部嵌入一个FLASH,若FLASH存储了用户的应用程序后仍留有空间,剩余空间可被当作EEPROM使用,这比访问外部FLASH速度优势更为明显。在本章节中,将会向大家简要介绍内部FLASH,并通过一个例程来演示FLASH模拟EEPROM的操作。

内部FLASH简介

FLASH结合了ROM和RAM的优点,不仅具备了EEPROM的可擦写性能,还类似于失性随机存储器(NVRAM),不会因断电而丢失数据,且能以较快的速度读取数据。对于CKS32F4xx系列的FLASH接口,它负责管理CPU通过AHB I-Code和D-Code总线对FLASH进行访问,这个接口可以执行擦除和编程操作,同时实施了一些读写保护机制,以确保数据的安全性。此外,FLASH接口还通过指令预取和缓存机制来提高代码执行的速度。下图为系统架构内的FLASH接口连接图:

1.png

针对不同型号的CKS32F4xx系列,其FLASH容量在128K至1024K字节之间。本章中以开发板上搭载的CKS32F407VGT6为例,它的FLASH容量为1024K字节,下图是CKS32F40xx/41xx的闪存模块组织图:

2.png

由上图可知,CKS32F4的存储区主要是由主存储器、系统存储器、OTP区域和选项字节构成,各存储区简述如下:

①主存储器:该部分用来存放代码和数据常数,分为12个大小不同的扇区,主存储器的起始地址是0x08000000;

②系统存储器:主要用来存放CKS32F4的bootloader代码,此代码是出厂的时候就固化在芯片内部了,例如用串口下载程序时的bootloader(ISP下载),它专门用来给主存储器下载代码;

③OTP区域:即一次性可编程区域,一次性的,写完一次,永远不能擦除;

④选项字节:用于配置读保护、BOR级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位,相当于一些寄存器位。

内部FLASH读写操作

FLASH是以字节为最小单位进行操作,每个存储单元存放一个字节。以下是对内部FLASH读写操作的概述:

---内部FLASH指定地址读出数据

例如,从地址addr读取一个字节,可通过语句data = *(vu8*)addr来实现,若是读取一个半字或一个字,只将上面的vu8改vu16或vu32即可。

---内部FLASH的写入过程

(1)解锁:CKS32F4xx系列复位后,FLASH编程操作被写保护,只有向FLASH_KEYR寄存器写入特定序列0x45670123和0xCDEF89AB,方可解除写保护,进而操作其它相关寄存器;

(2)设置闪存操作位数:CKS32F4xx系列电源电压会影响数据的最大操作位数,由于本例中使用的开发板电压为3.3V,所以根据下述配置表,必须将FLASH_CR的PSIZE字段配置为10b,即32位并行位数,这也决定后续的擦除或编程操作必须以32位为基础进行。

3.png

(3)擦除扇区:在写入数据前,必须先擦除存储区域,CKS32标准库提供了扇区擦除和批量擦除的指令,批量擦除指令仅针对主存储区。

(4)写入数据:擦除完毕后才可写入数据,CKS32F4xx系列标准库提供了字节、半字、字和双字写入函数供用户调用,封装了对寄存器FLASH_CR和FLASH_SR的操作,具体步骤可查阅CKS32F4xx的嵌入式FLASH章节。

---其它注意事项:

①CPU时钟频率(HCLK)不能低于1MHz,不能在FLASH操作期间进行器件复位;

②FLASH执行写入或擦除操作期间,不能进行读操作,否则会导致总线阻塞。因此,FLASH写操作时,有必要写FLASH_DataCacheCmd(DISABLE),来禁止数据缓存,写完后再打开;

③写入地址必须是用户代码区以外的地址,不能覆盖用户代码,否则程序会出错,可以查看map文件,选择合适的存储空间;

④由于数据是以32bit写入的,占用4个地址位,所以写入地址必须是是4的倍数。

采用内部FLASH模拟EEPROM实验

CKS32F4xx系列有关FLASH的函数分布在文件cks32f4xx_flash.c以及cks32F4xx_flash.h中,本例中通过cks_flash_test函数演示内部FLASH的读写,该函数的执行过程如下:

① 调用FLASH_Unlock 解锁;

② 调用FLASH_DataCacheCmd禁止数据缓存;

③ 调用FLASH_EraseSector擦除待写入地址所在扇区,可由上述闪存模块组织图得知,擦除时是按字为单位进行操作,并等待FLASH操作结束进入下一步;

④ 本例中是调用FLASH_ProgramWord函数向指定地址写入指定数据,并等待FLASH操作结束进入下一步,CKS32F4xx系列官方库提供FLASH_ProgramHalfWord、FLASH_ProgramByte函数,用户可根据需求选用;

⑤ 调用FLASH_DataCacheCmd开启数据缓存;

⑥ 调用FLASH_Lock 上锁。

代码如下:

int main(void)
{
    cks_flash_test();
    while (1)
    {
    }
}
void cks_flash_test(void)
{
    FLASH_Unlock();
    FLASH_DataCacheCmd(DISABLE);
    if(FLASH_EraseSector(FLASH_Sector_1, VoltageRange_3) != FLASH_COMPLETE)
    {
        return;
    }
    if(FLASH_ProgramWord(0x08004000, 0x44332211) != FLASH_COMPLETE)
    {
        return;
    }
    FLASH_DataCacheCmd(ENABLE);
    FLASH_Lock();
}

4.png

图1

5.png

图2

主函数对cks_flash_test函数调用,cks_flash_test函数实现对指定地址0x08004000进行擦除,写入操作。通过断点调试,如图1当程序运行至FLASH_EraseSector后,0x08004000起始处的四个字节先被擦除成0xFF;如图2,当程序运行运行至FLASH_ProgramWord之后,执行向0x08004000写入0x44332211后,0x08004000起始处数据变成0x11、0x22、0x33、0x44。

来源:中科芯MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 19