你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G071评测:Flash

[复制链接]
stm1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑

Flash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。
先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:
2019-01-16_132545.png
1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。
2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。
3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。
4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,
5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。

再看看Flash的组织。见下图:
2.png
Flash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。
而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:
3.png
编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。

在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。

以下Flash编程测试代码:
  1. int main(void)
  2. {
  3.     uint16_t i;
  4.     HAL_Init();
  5.     SystemClock_Config();
  6.     MX_GPIO_Init();
  7.     HAL_FLASH_Unlock();   
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);
  10.     EraseInitStruct.NbPages     = 1;
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
  12.     //8*256=2KB,1 page   
  13.     for(i=0;i<0x100;i++)
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);
  15.     HAL_FLASH_Lock();
  16.     while (1)
  17.     {

  18.     }
  19. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:
4.png
不得不说,有ST Link Utility就是好,直接Dump Flash。
此外,可以看到刚好改写数据是1页:
5.png
因为0x2000-0x1800=0x800,也就是1 Page的大小。




2019-01-16_132545.png
收藏 1 评论16 发布时间:2019-1-16 20:42

举报

16个回答
hujjj 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?

谢谢!
hujjj 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑

另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。
这个问题已经解决了,编译通过了。
五哥1 回答时间:2019-1-17 08:35:58
听说,有最新的STLINK 是用STM32G系列的芯片的
STMCU 回答时间:2019-1-17 09:24:14
勤劳的楼主 啊
stm1024 回答时间:2019-1-17 11:43:59
hujjj 发表于 2019-1-16 22:38
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...

啊,这个没复制进去。
一行代码:
  1. static uint32_t GetPage(uint32_t Addr)
  2. {
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;
  4. }
复制代码
stm1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...

这个可以参考HAL库的文档,我都是调用的HAL库函数
stm1024 回答时间:2019-1-17 11:46:27
五哥1 发表于 2019-1-17 08:35
听说,有最新的STLINK 是用STM32G系列的芯片的

额,这个还没见到过,不过一般用的好像都是F103C8T6
toofree 回答时间:2019-1-17 12:17:49
楼主厉害
感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
12下一页

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版