0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32中使用快速编程时有哪些需要注意的地方?

Q4MP_gh_c472c21 来源:STM32 作者:STM32 2021-02-02 10:26 次阅读

在一些新的 STM32 系列中,比如 STM32L4、STM32G0、STM32G4 等,除了 Flash 标准编程之外,还可以支持 Flash 的快速编程。那么对于 STM32G0 来说,在使用快速编程时,有哪些需要注意之处?

难点

某STM32用户在其产品设计中,采用了 STM32G070RBT6,开发工程师希望在进行代码升级的时候使用快速编程来提高编程速度,但是写代码时遇到很多问题。而在目前的 STM32G0 的 Cube 库中并没有 FLASH_FastProgram 例程,所以客户希望得到一个参考例程来快速实现设计。

调研

1

了解问题

检查最新版本的STM32Cube_FW_G0_V1.3.0/Projects/STM32CubeProjectsList.html 文件,确实可以看到现有的 STM32G0Cube 库中并没有 FLASH_FastProgram 例程,根据参考手册,参考STM32Cube_FW_L4_V1.16.0ProjectsNUCLEO-L452REExamplesFLASHFLASH_FastProgram 例程,对 STM32Cube_FW_G0_V1.2.0ProjectsNUCLEO-G070RBExamplesFLASHFLASH_EraseProgram 进行修改以移植代码。以下就撰写例程代码时,需要注意的问题简单地介绍一下。

2

分析问题

首先,先来看一下 STM32L4 中 FLASH_FastProgram 例程中 readme.txt 对本示例的解释,可以看到这是一个演示如何配置和使用 API 函数对内部 Flash 存储器进行擦除和快速编程的示例。

先来看一下 FastProgram 最核心的函数 FLASH_Program_Fast()。

在 STM32L4Cube 中的 stm32l4xx_hal_flash,它是这么定义的:

static void FLASH_Program_Fast(uint32_t Address, uint32_t DataAddress)

而在 STM32G0Cube 中的 stm32g0xx_hal_flash,其定义是:

static __RAM_FUNC void FLASH_Program_Fast(uint32_t Address, uint32_t DataAddress)

这两者有什么区别呢?就是在 STM32G0Cube 库中使用了__RAM_FUNC 指明了这个函数是位于 RAM 区域的。为什么呢?

第一个要点:对 Flash 进行快速编程的时候不允许对 Flash 进行读取,所以需要将这个快速编程的代码放置于 RAM 中运行,以避免对 Flash 进行命令读取。

那么,大家可能又有疑问了,那为什么 STM32L4Cube 中并没有使用__RAM_FUNC 关键字,STM32L452 的 Flash 是 single bank,难道它就不需要放到RAM 里?如果大家细心的话,可以看到STM32L4这个例程中的链接文件是 stm32l452xx_sram.icf,在icf 文件中定义了ROM的地址为 0x20000000~0x20015FFF,也就是说这个示例代码是跑在 RAM的,所以就不需要在这边使用__RAM_FUNC 关键字了。还可以在 STM32L4 示例代码中看到对整片 Flash 进行擦除而猜到这一点。从 STM32G0Cube 库中 FLASH_Program_Fast() 这个函数的定义,可以看出它是可以直接使用 stm32l452xx_flash.icf 将快速编程核心代码以外的其他代码都放在 Flash 上面跑的,这个可能更符合用户做 IAP 升级的习惯,当然,在这个情况下,我们就可能需要在程序中使用页擦除而不是整片擦除了。

第二个要点:因为 Flash 进行快速编程的时候不允许对 Flash 进行读取,所以还需要注意快速编程的源数据应该位于 RAM 而非 Flash,以避免对 Flash 进行数据读取。

因为在 Flash 快速编程的时候,需要将 64 个 word 一个行 (256 Bytes) 的数据写到目标地址中,所以也就是说快速编程时,还会去访问源数据,如果源数据放在Flash就会导致问题产生。下面,我们解答一个移植中常见问题。

在从 STM32L4 到 STM32G0 的移植中,直接将 STM32L4 示例代码中定义的源数据的数组代码:

/* Table used for fast programming */ static const uint64_t Data64_To_Prog[FLASH_ROW_SIZE] = {0x0000000000000000, 0x1111111111111111, 0x2222222222222222, 0x3333333333333333, 0x4444444444444444, 0x5555555555555555, 0x6666666666666666, 0x7777777777777777, 0x8888888888888888,0x9999999999999999, 0xAAAAAAAAAAAAAAAA,0xBBBBBBBBBBBBBBBB,0xCCCCCCCCCCCCCCCC,0xDDDDDDDDDDDDDDDD, 0xEEEEEEEEEEEEEEEE, 0xFFFFFFFFFFFFFFFF, 0x0011001100110011, 0x2233223322332233, 0x4455445544554455, 0x6677667766776677, 0x8899889988998899,0xAABBAABBAABBAABB, 0xCCDDCCDDCCDDCCDD,0xEEFFEEFFEEFFEEFF, 0x2200220022002200, 0x3311331133113311, 0x6644664466446644, 0x7755775577557755, 0xAA88AA88AA88AA88,0xBB99BB99BB99BB99, 0xEECCEECCEECCEECC, 0xFFDDFFDDFFDDFFDD};

原封不动地拷贝到 STM32G0 的项目中,在测试的时候,总是会发现程序会死在快速编程的过程中。最后检查才发现问题出现在这个数组的定义上。STM32L4 使用 stm32l452xx_sram.icf 定义了 ROM 的地址为 0x20000000~0x20015FFF,因此这个 const 关键字的数据实际上也是位于 RAM 中的。但是将这个数组搬到 STM32G0 的项目时,因为使用的是stm32l452xx_flash.icf,导致这个数组位于 Flash 中,在快速编程的时候程序就会去访问 Flash 读取源数据,就导致程序死在快速编程过程。所以,需要将数组修改为:

/* Table used for fast programming */ uint64_t Data64_To_Prog[FLASH_ROW_SIZE] = { 0x0000000000000000, 0x1111111111111111, 0x2222222222222222, 0x3333333333333333, 0x4444444444444444, 0x5555555555555555, 0x6666666666666666, 0x7777777777777777, 0x8888888888888888,0x9999999999999999, 0xAAAAAAAAAAAAAAAA,0xBBBBBBBBBBBBBBBB, 0xCCCCCCCCCCCCCCCC,0xDDDDDDDDDDDDDDDD, 0xEEEEEEEEEEEEEEEE,0xFFFFFFFFFFFFFFFF,0x0011001100110011,0x2233223322332233, 0x4455445544554455, 0x6677667766776677, 0x8899889988998899,0xAABBAABBAABBAABB, 0xCCDDCCDDCCDDCCDD,0xEEFFEEFFEEFFEEFF, 0x2200220022002200, 0x3311331133113311, 0x6644664466446644, 0x7755775577557755, 0xAA88AA88AA88AA88,0xBB99BB99BB99BB99, 0xEECCEECCEECCEECC, 0xFFDDFFDDFFDDFFDD};

这样程序就可以正常运行。

第三个要点:使用在 Flash 上跑 IAP 代码进行快速编程的话,建议看一下参考手册里快速编程的步骤,在步骤中的第一步时使用 Page Erase 对当前页进行擦除后对当前页进行快速编程,每次一页,也就是“擦除当前页→快速编程当前页→擦除下一页→快速编程下一页→……”。

下面来仔细阅读参考手册,关注一下另外几个要点。

第四要点:关于时钟,在快速编程的过程中,CPU 的时钟频率(HCLK)不得低于 8MHz。这个在大家的应用中一般都是满足的,所以还好。另外,在“注”里边说明,FSTPG 位置 1 时,内部振荡器 HSI16 会自动使能,在 FSTPG 位清零时自动禁止,但 HSI16 之前已经通过 HSION 使能的情况除外。

第五要点:这一行 32 个双字必须连续写入,两个双字写入请求的最大时间间隔大约为 20us。如果后面的写入请求时间超出了这个范围,那么将导致 MISSERR 错误产生。一般来说,只要您使用的是库文件的函数,不用担心这个问题。

第六要点:在两次擦除之间,每一行的写入,高压持续时间不能大于8ms。一般来说,只要HCLK 的时钟保证在8MHz以上,对32个双字的连续写序列,时间上还是没问题的。如果真的程序没写好,导致存在这种情况,那么在芯片内部有个7ms 的检测机制,超时就会自动停止编程,并置位 FASTERR。

第七要点:关中断。至于为什么?大家都知道,就不多说了。如果大家使用 Cube 库,也可以看到在 FLASH_Program_Fast() 在进行关中断,但是示例中并没有恢复打开中断,所以大家在实际应用中根据情况看是否需要将中断打开。

3

问题解决

上面几个要点,如果软件工程师使用的是 STM32Cube 库,那么在撰写代码上最主要是检查一下前面三个要点的情况。后面几个要点稍微了解就可以了。

结论

Flash的快速编程可以节省编程的时间,但是在使用上因为有不少限制因素,使得它的软件设计比标准编程复杂,需要工程师细心调试。

建议

软件工程师在撰写Flash快速编程时,仔细阅读下参考手册,并参考本文中的各个要点,然后根据自己的实际应用情况,理清逻辑,来撰写完整的 Flash 编程代码。

原文标题:被STM32G0快速编程难倒的,看这里

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2274

    文章

    10929

    浏览量

    358014
  • 编程
    +关注

    关注

    88

    文章

    3642

    浏览量

    94095

原文标题:被STM32G0快速编程难倒的,看这里

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问在使用ADS1262采集数据的时候有什么需要注意地方吗?

    START1命令之后将CS引脚置高,在发送读数命令之前再将CS引脚置低,但是实际采集出来的数据完全不对。请问在使用ADS1262采集数据的时候有什么需要注意地方吗?
    发表于 12-27 06:30

    测试光伏逆变器需要注意哪些地方呢?

    在进行光伏逆变器测试时,需要注意以下几个关键方面:1.电气安全测试:包括输入端口绝缘电阻测试、漏电测试、接地连接测试等,以确保逆变器在电气方面的安全性。2.性能参数测试:测试包括额定功率、极大
    的头像 发表于 11-13 17:17 527次阅读
    测试光伏逆变器<b class='flag-5'>需要注意</b>哪些<b class='flag-5'>地方</b>呢?

    LMX2595EVM在使用时应该如何确保其进入锁定状态,以及操作时有什么需要注意的吗?

    在使用lmx2595evm时有时很难进入锁定状态,如果已锁定,插拔线时锁定指示灯也会闪烁,请问在使用时应该如何确保其进入锁定状态,以及操作时有什么需要注意的吗
    发表于 11-08 06:42

    TLV320aic33进行ADC的使用时,为什么没有输出?ADC使用时有什么要注意地方吗?

    您好!在使用贵司TLV320aic33 进行ADC的使用时,LINE1LP接输入信号,LINE1LM接地,根据用户指南上进行ADC的配置,测量PGA输出正常,BCLK,WCLK正常,但ADC始终无输出,请问ADC使用时有什么要注意
    发表于 10-22 08:10

    请问启用AIC3104本身降噪功能,有什么需要注意地方

    希望能够验证下AIC3104本身自带的降噪功能,自己根据芯片文档改了0x1c,0x1f寄存器的值,发现效果很不好。 请问启用AIC3104本身降噪功能,有什么需要注意地方
    发表于 10-15 08:28

    THS4001在设计电路上有什么特别需要注意地方吗?

    为了放大DDS出来的信号(f=1MHz,Vpp=1V),前段时间买了THS4001这个芯片。可是按照手册简单地搭了一个闭环增益为6的同相比例放大器,却发现输出的波形Vpp连1V都不到。请教这款运放在设计电路上有什么特别需要注意地方
    发表于 08-27 06:49

    bnc公头注塑需要注意什么

    德索工程师说道在BNC公头注塑过程需要注意多个方面以确保产品的质量和生产效率。以下是对这一过程关键注意事项的详细阐述:   材料选择:根据BNC公头的使用环境和性能要求,选
    的头像 发表于 08-22 08:53 318次阅读
    bnc公头注塑<b class='flag-5'>需要注意</b>什么

    使用THS3091有什么要注意地方吗?

    THS3091好像烧了。引脚3和4或6和7是通的,不知道怎么回事。用的正负15V的电源。没有放大,没有输入的输入时,输出就有一个直流,大概7到8V。测引脚,引脚6、7是通的,芯片还特烫。THS3091使用有什么要注意地方吗?
    发表于 08-16 06:26

    请问下LM239N替代LM339N, 在应用时有什么需要注意的吗?

    你好,请问下LM239N 替代LM339N, 在应用时有什么需要注意的吗?周边器件是否需要做些调整?谢谢!
    发表于 08-07 07:31

    在用运算放大器做比较器使用时有什么需要注意哪些参数呢?

    在用运算放大器做比较器使用时有什么需要注意哪些参数呢?我测试和仿真了LM358做滞回比较器,设计电路如下图,当反相输入端比较信号是50Hz时是可以的,当反相输入端比较信号是20k时输出跟不上了,感觉应该是压摆率的问题,所以想问一下在用运算放大器设计做为比较器
    发表于 08-06 08:01

    应用PLC需要注意哪些问题

    PLC(可编程逻辑控制器)作为现代工业控制的核心设备,其应用的广泛性和重要性不言而喻。然而,在应用PLC的过程,也需要注意一系列问题,以确保PLC系统的稳定运行和高效控制。本文将结合实际应用经验,详细探讨应用PLC时
    的头像 发表于 06-17 11:29 658次阅读

    FPGA的sata接口设计时需要注意哪些问题

    在FPGA的SATA接口设计时,需要注意以下几个方面的问题,以确保设计的稳定性和性能: 接口版本和速度 : SATA有三代标准,分别为SATA I(1.5 Gb/s)、SATA II(3.0 Gb
    发表于 05-27 16:20

    pcb电路板元件布局需要注意什么

    pcb电路板元件布局需要注意什么
    的头像 发表于 03-14 15:24 974次阅读

    TLE9853QX能不能使用fastlin进行烧写程序,有没有需要注意地方

    TLE9853QX芯片能不能使用fastlin进行烧写程序,有没有需要注意地方
    发表于 03-05 06:38

    激光焊接技术在焊接铝合金时需要注意什么

    需要填充材料,减少了材料成本和加工时间。下面来看看激光焊接技术在焊接铝合金时需要注意什么。 在激光焊接铝合金时需要注意以下几点: 1.清理焊缝表面:在焊接前,需要将焊缝表面的油污、氧
    的头像 发表于 02-29 13:43 960次阅读
    激光焊接技术在焊接铝合金时<b class='flag-5'>需要注意</b>什么