搜索
查看: 7280|回复: 16

[原创] STM32G071评测:Flash

[复制链接]
  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
    发表于 2019-1-16 20:42:04 | 显示全部楼层 |阅读模式
    本帖最后由 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
    回复

    使用道具 举报

    该用户从未签到

    26

    主题

    1127

    帖子

    59

    蝴蝶豆

    论坛元老

    最后登录
    2021-7-29
    发表于 2019-1-16 22:25:17 | 显示全部楼层
    感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?

    谢谢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26

    主题

    1127

    帖子

    59

    蝴蝶豆

    论坛元老

    最后登录
    2021-7-29
    发表于 2019-1-16 22:38:48 | 显示全部楼层
    本帖最后由 hujjj 于 2019-1-17 17:24 编辑

    另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。
    这个问题已经解决了,编译通过了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19

    主题

    1734

    帖子

    7

    蝴蝶豆

    论坛元老

    最后登录
    2021-5-10
    发表于 2019-1-17 08:35:58 | 显示全部楼层
    听说,有最新的STLINK 是用STM32G系列的芯片的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1492

    主题

    2703

    帖子

    0

    蝴蝶豆

    管理员

    最后登录
    2021-5-11
    发表于 2019-1-17 09:24:14 | 显示全部楼层
    勤劳的楼主 啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
     楼主| 发表于 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. }
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
     楼主| 发表于 2019-1-17 11:45:40 | 显示全部楼层
    hujjj 发表于 2019-1-16 22:25
    感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...

    这个可以参考HAL库的文档,我都是调用的HAL库函数
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
     楼主| 发表于 2019-1-17 11:46:27 | 显示全部楼层
    五哥1 发表于 2019-1-17 08:35
    听说,有最新的STLINK 是用STM32G系列的芯片的

    额,这个还没见到过,不过一般用的好像都是F103C8T6
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-12-6 11:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    49

    主题

    3724

    帖子

    429

    蝴蝶豆

    论坛元老

    最后登录
    2021-8-7
    发表于 2019-1-17 12:17:49 | 显示全部楼层
    楼主厉害
    感谢分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    1002

    帖子

    363

    蝴蝶豆

    版主

    最后登录
    2021-4-15
    发表于 2019-1-17 14:01:57 | 显示全部楼层
    这个分析的仔细啊!!!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-26 04:07 , Processed in 0.175278 second(s), 42 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表