佛山用户网站建设,个人怎样申请网站,阜阳室内设计学校,免费发布产品信息网站STM32 FLASH简介
不同型号的STM32#xff0c;其Flash容量也不同。 MiniSTM32开发板选择的STM32F103RCT6的FLASH容量为256K字节#xff0c;属于大容量产品。 STM32的闪存模块由#xff1a;主存储器、信息块和闪存存储器接口寄存器等3部分组成。
主存储器#xff0c;该部分…STM32 FLASH简介
不同型号的STM32其Flash容量也不同。 MiniSTM32开发板选择的STM32F103RCT6的FLASH容量为256K字节属于大容量产品。 STM32的闪存模块由主存储器、信息块和闪存存储器接口寄存器等3部分组成。
主存储器该部分用来存放代码和数据常量如const类型的数据。 对于大容量产品其被划分为 256 页每页 2K 字节。注意小容量和中容量产品则每页只有 1K 字节。
主存储器的起始地址就是 0X08000000B0和B1都接GND的时候就是从 0X08000000开始运行代码的。
信息块该部分分为2个小部分其中启动程序代码是用来存储ST自带的启动程序用于串口下载代码当B0接V3.3B1接GND的时候运行的就是这部分代码。用户选择字节一般用于配置写保护、读保护等功能。
闪存存储器接口寄存器该部分用于控制闪存读写等是整个闪存模块的控制机构。
对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器FPEC管理编程与擦除的高电压由内部产生。
在执行闪存写操作时任何对闪存的读操作都会锁住总线在写操作完成后读操作才能正确地进行
闪存的读取
内置闪存模块可以在通用地址空间直接寻址任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。 读接口在闪存端包含一个读控制器还包含一个AHB接口与CPU衔接。
注意闪存等待时间因为CPU运行速度比FLASH快得多STM32F103的FLASH最快访问速度≤24MHz如果CPU频率超过这个速度那么必须加入等待时间。 比如我们一般使用72MHz的主频那么FLASH等待周期就必须设置为2该设置通过FLASH_ACR寄存器设置。
要从地址addr读取一个半字半字为16位字为32位可以通过如下的语句读取
data *(vu16*)addr;将addr强制转换为vu16指针然后取该指针所指向的地址的值即得到了addr地址的值。 将上面的vu16改为vu8即可读取指定地址的一个字节。
闪存的编程和擦除
STM32的闪存编程是由FPEC(闪存编程和擦除控制器)模块处理的这个模块包含7个32位寄存器它们分别是
FPEC键寄存器FLASH_KEYR选择字节键寄存器FLASH_OPTKEYR闪存控制寄存器FLASH_CR闪存状态寄存器FLASH_SR闪存地址寄存器FLASH_AR选择字节寄存器FLASH_OBR写保护寄存器FLASH_WRPR
其中FPEC键寄存器总共有3个键值 RDPRT键0x000000A5 KEY10X45670123 KEY20XCDEF89AB
STM32复位后FPEC模块是被保护的不能写入FLASH_CR寄存器 通过写入特定的序列到FLASH_KEYR寄存器可以打开FPEC模块即写入KEY1和KEY2只有在写保护被解除后我们才能操作相关寄存器。
STM32闪存的编程每次必须写入16位 当FLASH_CR寄存器的PG位为1时在一个闪存地址写入一个半字将启动一次编程 写入任何非半字的数据FPEC都会产生总线错误。 在编程过程中BSY位为1任何读写闪存的操作都会使CPU暂停直到此次闪存编程结束。
同样STM32的FLASH在编程的时候也必须要求其写入地址的FLASH是被擦除了的其值必须是0xffff否则无法写入在FLASH_SR寄存器的PGERR位将得到一个警告。 检查FLASH_CR的LOCK是否解锁如果没有则先解锁。检查FLASH_SR寄存器的BSY位以确认没有其它正在进行的编程操作。设置FLASH_CR寄存器的PG位为1.在指定的地址写入要编程的半字。等待BSY位变为0。读出写入的地址并验证数据。
在STM32的FLASH编程的时候首先判断缩写地址是否被擦除。 STM32的闪存擦除分为两种页擦除和整片擦除。 检查FLASH_CR的LOCK是否解锁如果没有则先解锁。检查FLASH_SR寄存器的BSY位以确认没有其它正在进行的闪存操作。设置FLASH_CR寄存器的PER位为1。用FLASH_AR寄存器选择要擦除的页。设置FLASH_CR寄存器的STRT位为1.等待BSY位变为0.读出被擦除的页并做验证。
读写相关寄存器
FPEC键寄存器FLASH_KEYR。 所有这些位都是只写的读出时返回0。 位31~0FKEYRFPEC键这些位用于属于FPEC的解锁键。 该寄存器主要用来解锁FPEC必须在该寄存器写入特定的序列KEY1和KEY2解锁后才能对FLASH_CR寄存器进行写操作。
闪存控制寄存器FLASH_CR。
LOCK位该位用于指示FLASH_CR寄存器是否被锁住该位在检测到正确的解锁序列后硬件将其清零。在一次不成功的解锁操作后在下次系统复位之前该位将不再改变。STRT位该位用于开始一次擦除操作。在该位写入1将执行一次擦除操作。PER位该位用于选择页擦除操作在页擦除的时候需要将该位置1.PG位该位用于选择编程操作往往FLASH写数据的时候该位需要置1。
闪存状态寄存器FLASH_SR。
EOP操作结束每当闪存操作编程/擦除完成时硬件设置为1写1清除。WRPRERR写保护错误当对写保护的闪存地址编程时硬件设置这位为1写入1可以清除。PDERR编程错误试图对内容不是0xffff的地址编程时硬件设置为1写入1时可以清除。在进行编程操作之前先清除FLASH_CR寄存器的STRT位。BSY忙指示闪存操作正在进行。闪存操作开始时该位置1操作结束或发生错误时清0。
闪存地址寄存器FLASH_AR
这些位由硬件修改为当前/最后使用的地址。在页擦除时软件必须修改这个寄存器以指定要擦除的页。
位31~0FAR闪存地址当进行编程时选择要编程的地址当进行页擦除时选择要擦除的页当FLASH_SR的BSY位为1时不能写这个寄存器。