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

STM32H750启动代码与片内flash操作小经验分享

[复制链接]
思行一 发布时间:2019-2-22 12:02

首先感谢STM32 FAE的支持,迅速有效,非常感谢!然后也非常感谢论坛里的大佬们的帮助回答!

我在这里就这两天调试STM32H750的bootloader和写片内flash的经历分享下自己遇到的问题与解决办法。
) S1 O* N) H5 X6 `8 z一. bootloader地址设置和cache使能失能设置与成功跳转到app的关系
0 W: W, B: \- j! p3 P
8 ?8 f7 }5 {2 c- c# ?$ e$ n; h7 n6 [
: O" m# z1 }2 h* `4 q4 K      1. 首先说明下我bootloader和app部分的flash和SRAM的分配:
( q  r9 A: y8 D* z7 j
. y% z3 _6 y$ i! M9 Z1 {      因为STM32H750的片内flash只有128K,地址是从0x0800 0000 ~ 0x0801 FFFF,我的bootloader大小有12k左右,所以我将bootloader存放到flash的前16k,即地址0x0800 0000 ~ 0x0800 5FFF,在SRAM里使用的起始地址0x2000 0000,大小0x20000;剩下的116K用于存放我的app程序,即地址0x0800 6000 ~ 0x0801 FFFF, 在SRAM里使用的起始地址0x2400 0000,大小0x80000。
2 r- o2 Q) z/ R- ?      然后贴上我bootloader工程中Target的设置:
+ y- ^( a+ s7 \( R: s$ B% L, g: J
2 f/ O0 J) e* P% O% _0 F b1.jpg b2.jpg b3.jpg
7 I+ S, K) F# F. z# K" R) J: I$ ?6 s5 L% U; E0 b* w% ?1 E
      下面是app中Target的设置:
  u& ^0 i7 F, ?+ M a1.jpg a2.jpg a3.jpg 5 s7 h9 z6 f( m! W  C5 L/ N
$ m4 w$ w/ M; p, h4 M
      2. cache的设置与地址跳转
4 W' Y1 K3 F" k$ Q9 w6 F( C      从上面几张target中的设置可以看到我app部分的RAM是使用的是AXI SRAM,bootloader使用的是TCM SRAM, 而在bootloader中一开始我是使能的D-Cache和I-Cache的,我在写完bootloader后无法跳转到自己的app程序去,检查了自己程序里面地址设置与app中中断向量表也作了对应修改,还是无法跳转过去后,向FAE求助,他们给的办法是在bootloader中,地址跳转前将D-Cache失能,即使用HAL库下的函数:SCB_DisableDCache()。添加此函数后能够成功向app跳转。7 v0 ], ^2 c' c6 h
      所以之后有小伙伴涉及到相关问题希望这部分对你有帮助。  X" C1 x2 s3 [5 Z! {) t
. D) h* H0 I; U+ o3 }1 e
二. STM32H750片内flash操作* B* c/ y+ t6 P/ t6 M" H
      其实H7与之前的芯片在片内flash上不同的地方就是,写操作必须要按32bytes对齐。意思是即便你只想往里面写一个字节或者不到32个字节,但是flash依然会操作32个字节,只是其中只有一个字节或者你写进去的那么多个字节有效,而其他的字节被mcu自己操作填充,而要这样做就必须操作flash的force-write功能,按照我的经验的话,就是在写之前加一句FLASH->CR1 &= ~FLASH_CR_FW,然后再执行写操作,之后添加一句FLASH->CR1 |= FLASH_CR_FW,即:2 `2 l! k/ N  M; V) k5 j( F' f4 V
FLASH->CR1 &= ~FLASH_CR_FW;
9 `& E. z) B. P! Z* q! NHAL_Flash_Program();
5 k7 q' F: X: F' U) q8 iFLASH->CR1 |= FLASH_CR_FW9 g6 k4 Z2 @7 W  z% g
这样才能保证不会出错(仅我个人调试结果是这样)。
: p) F% L; U; G* I+ V所以如果是有连续的数据(大于32bytes),可以先存32bytes然后执行一次写操作,不必去操作force-write功能;如果只是想单独写几个字节可以向我说的这样操作。# A6 n- s/ a% H5 S  e* j$ b/ r
2 C2 u0 G$ @8 {5 D
附加一点:因为我中间还有调试can通信,而HAL中CAN_TxHeader/CAN_RxHeader里面的DataLength是32bits的,而使用Classic CAN的话,发送和接收的真实数据帧长度最大只有8,会保存在DataLength的高16位,所以如果使用的是Classic CAN接收的话,获取帧长度的时候要将DataLength右移16bits,不然绝对出错。
) Y( D$ T8 w2 [3 @6 }
" E7 p  }3 A% p: s. j& N- e% {( W8 C- P6 n& [! ^) `
4 p# E- K/ o- T3 V9 B# y
- ~: \8 q$ V5 L6 B

* H- D; {7 P  N9 Z% u" V4 ?. Y3 T7 U
赞 收藏 2 评论4 发布时间:2019-2-22 12:02

举报

4个回答
-- 回答时间:2019-4-14 19:11:32
H750不是只有一个sector吗?如果要擦除flash就只能整个sector擦除了,按照你的做法,boot和app都做到128k上,boot根本无法升级app,没有意义啊
wofei1314 回答时间:2019-5-9 13:19:14
gzbkey 发表于 2019-4-14 19:11
" ]8 h9 G. F, {4 q4 Y7 ?: @+ @" b/ x  R; Y9 aH750不是只有一个sector吗?如果要擦除flash就只能整个sector擦除了,按照你的做法,boot和app都做到128k上 ...

* e7 d( q# d0 G( h3 @& u! `5 s/ X, d刚才看了一下  RM0433.pdf  ,确实只有1个Sector ....  如果是这样的话,每次IAP 擦除的时候就会把BootLoader 也一并擦除 ....
woods1 回答时间:2019-10-14 16:12:56
外挂FLASH程序怎么操作?
woods1 回答时间:2019-11-4 16:57:34
还以为是QSPI

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版