HK32F103x/C/D/E是深圳市航顺芯片技术研发有限公司推出的中大容量的F103系列芯片。作为32位MCU,大多会内置flash以便应用程序的存储及更新,其可靠性及访问速度也远远优于外部flash。
01、Flash闪存主要特性
高达512 Kbyte Flash存储器
存储器结构:
◆主闪存模块:512Kbyte,该存储块划分为256(Page)×2Kbyte
◆选项字节有256个字
闪存的接口特征:
◆带预取缓冲器的读接口
◆选择字节加载器
◆闪存编程/擦除操作
◆访问/写保护
◆低功耗模式
Flash空间由32位宽的存储单元组成,既可以存代码又可以存数据。主闪存块有256页(每页2Kbyte)。模块如下表所示:
02、Flash写和擦除操作
Flash擦写模块处理Flash的编程和擦除,它包含12个32位的寄存器。在产品的整个工作电压范围内支持执行Flash编程和擦除操作。该操作由下列12个寄存器完成:
●Flash关键字寄存器(FLASH_KEYR)
●Flash选项关键字寄存器(FLASH_OPTKEYR)
●Flash控制寄存器(FLASH_CR)
●Flash状态寄存器(FLASH_SR)
●Flash地址寄存器(FLASH_AR)
●Flash选项字节寄存器(FLASH_OBR)
●Flash写保护寄存器(FLASH_WRPR)
●Flash控制寄存器2(FLASH_ECR)
●4个编程数据寄存器(PW0~PW3)
只要CPU不访问Flash空间,正在执行的Flash写操作不会妨碍CPU的运行。即,在执行写/擦除操作的同时,不能对Flash取指和访问其数据。否则,总线访问将暂停。
03、对Flash空间的解锁
复位后,Flash存储器默认处于受保护状态,以避免意外擦除。FLASH_CR寄存器的值通常不允许改写,只有对FLASH_KEYR寄存器进行解锁操作后,才具有对FLASH_ CR寄存器的访问权限。解锁操作包括以下步骤:
1.向FLASH_KEYR寄存器写入关键字KEY1=0x45670123。
2.向FLASH_KEYR寄存器写入关键字KEY2=0xCDEF89AB。
任何错误的顺序将会锁死FLASH_CR直至下次复位。当发生关键字错误时,会由总线错误引发一次硬件错误中断。
●如果KEY1出错,就会立即中断。
●如果KEY1正确但KEY2错误时,就会在KEY2错的时刻触发中断。
可以对比以下该系列芯片的主要储存器映射图:
04、标准编程
Flash 存储器接口会预读待编程地址的内容,然后判断其是否已经被擦除,如果不是,那么编程操作会自动取消,并且在FLASH_SR寄存器的PGERR位上提示编程错误告警。如果被编程的内容为全零,则会例外,这时会正确编程并且不告警。
如果待编程地址所对应的FLASH_WRPR中的写保护位有效,同样也不会有编程动作,同样也会产生编程错误告警。编程动作结束后,FLASH_SR寄存器中的EOP位会给出提示。
主Flash存储器标准模式下的编程过程如下:
●半字、字编程:
1.检查FLASH_SR中的BSY位,以确认上次操作已经结束。
2.置位FLASH_CR寄存器中的PG位或者FLASH_ECR的WPG位。
3.根据配置,以半字/字为单位向目标地址写入数据。
4.等待FLASH_SR寄存器中的 BSY 归零。
5、读取编程的值然后验证。
●双字和四字编程:
1.检查FLASH_SR中的BSY位,以确认上次操作已经结束。
2.置位FLASH_ECR寄存器中的2WPG位或者4WPG位。
3.根据配置,向PW0~PW1或者PW0~PW4写入数据。
4.向FLASH_AR写入待编程位置最低位置地址。
5.置位FLASH_CR寄存器中的STRT位为1。
6.等待FLASH_SR寄存器中的BSY归零。
7.读取编程的值然后验证。
注意:当 FLASH_SR中的BSY被置’1’时,写模式下的寄存器不能被读。
Flash存储器擦除
Flash存储器可以按页或半页为单位擦除,也可以整片擦除。
页擦除
擦除页的步骤如下:
1.检查FLASH_SR中的BSY位,以确认上次操作已经结束。
2.将FLASH_CR寄存器中的PER位置为1,以选择按页擦除。
3.写FLASH_AR寄存器的FAR位,写入待擦除页的地址。
4.将FLASH_CR寄存器中的 STRT 位置为1,以启动擦除操作。
5.等待FLASH_SR中的BSY变为0,表明擦除操作完成。
6.检查LASH_SR寄存器的EOP标志(若Flash擦除成功会置位EOP),然后软件清除该标志位。
半页擦除
Flash的半页为1Kbyte,半页擦除流程和页擦除流程类似,区别在于把FLASH_ECR中的HPER位置’1’。擦除半页的步骤如下:
1.检查FLASH_SR寄存器中的BSY位,以确认上次操作已经结束。
2.将FLASH_CR寄存器中的HPER位置为1,以选择按半页擦除。
3.写FLASH_AR寄存器的FAR位,写入待擦除半页的地址。
4.将FLASH_CR寄存器中的STRT位置为1,以启动擦除操作。
5.等待FLASH_SR中的BSY变为0,表明擦除操作完成。
6.检查LASH_SR寄存器的EOP标志(若Flash擦除成功会置位EOP),然后软件清除该标志位。
整片擦除
可以用整片擦除命令一次擦除整个Flash区,但该命令不会影响信息块,具体步骤如下:
1.检查FLASH_SR寄存器的BS位,以确认上次操作已经结束。
2.将FLASH_CR寄存器中的MER位置为1,以选择整片擦除。
3.将FLASH_CR寄存器中的STRT位置为1,以启动擦除操作。
4.等待FLASH_SR中的BSY位置0,表明整片擦除操作结束。
5.检查FLASH_SR寄存器的EOP标志位(如果Flash擦除成功会置位EOP),然后软件清除该标志位。
05、flash在写及擦除使用过程中需要注意的地方
问题描述:
CACHE打开的情况下,FLASH写及擦除操作时产生错误。
根本原因:设计原因。
解决方案:
在写了FLASH->AR寄存器后,操作FLASH->CR寄存器前执行CACHE->CTL|=0x0800指令清一下CACHE。对于HK32F103xCxDxE,我们已经在hk32f10x_flash.c 中已经修改。
来源:航顺芯片
审核编辑:汤梓红
-
mcu
+关注
关注
146文章
16977浏览量
350215 -
FlaSh
+关注
关注
10文章
1621浏览量
147735 -
航顺芯片
+关注
关注
1文章
102浏览量
22782
发布评论请先 登录
相关推荐
评论