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

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
收藏 2 评论16 发布时间:2019-1-16 20:42

举报

16个回答
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 19:37:44
五哥1 发表于 2019-1-17 18:57
得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715
这个文章中 ...

这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...

这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?

谢谢!
老牛洋车 回答时间: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:46:27
五哥1 发表于 2019-1-17 08:35
听说,有最新的STLINK 是用STM32G系列的芯片的

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

大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:17
楼主厉害
感谢分享

过奖了,学了点皮毛
Kevin_G 回答时间:2019-1-17 17:42:40
多谢分享
五哥1 回答时间:2019-1-17 18:57:41
得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715 108_203117_bce98ed2987bc61.jpg
这个文章中的,一位买了STLINK 主控是stm32gc102cb
12下一页

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版