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

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

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

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

我在这里就这两天调试STM32H750的bootloader和写片内flash的经历分享下自己遇到的问题与解决办法。
9 L- w0 l" R3 B% Q# ?) G/ m, d一. bootloader地址设置和cache使能失能设置与成功跳转到app的关系( E+ R4 P5 B9 ~

$ |3 X7 [! T( ^0 {* H) f$ @
3 r. r4 A7 y1 N) w) |# u      1. 首先说明下我bootloader和app部分的flash和SRAM的分配:
+ S# b1 S+ \, V* o7 U0 S& i
$ o! K* }5 f, ?( c9 }; H" h      因为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。; x& ?! Y3 M  F6 S2 m- b1 y
      然后贴上我bootloader工程中Target的设置:
+ x7 u: R9 q" g+ }5 n. |% ~$ _
3 O' \: `3 C+ j$ N) i; ? b1.jpg b2.jpg b3.jpg
  L) p: I, x, u2 c3 ?( O! I* f; d
5 H7 H; u( N6 R/ \      下面是app中Target的设置:* N& X, |! J! V- w2 |
a1.jpg a2.jpg a3.jpg , ?. ?* U$ `& C  i  X. H  r& t
/ o& o+ G; E* a; A% m  g
      2. cache的设置与地址跳转
9 ^, D( a8 o1 ~- M, k' d+ m) P+ _& h8 E      从上面几张target中的设置可以看到我app部分的RAM是使用的是AXI SRAM,bootloader使用的是TCM SRAM, 而在bootloader中一开始我是使能的D-Cache和I-Cache的,我在写完bootloader后无法跳转到自己的app程序去,检查了自己程序里面地址设置与app中中断向量表也作了对应修改,还是无法跳转过去后,向FAE求助,他们给的办法是在bootloader中,地址跳转前将D-Cache失能,即使用HAL库下的函数:SCB_DisableDCache()。添加此函数后能够成功向app跳转。  A" w* p  s% Z2 m& s) b0 G
      所以之后有小伙伴涉及到相关问题希望这部分对你有帮助。2 a1 c& w/ x. z. I3 `/ z
7 ]; K! D  |# H# c0 {2 {5 {
二. STM32H750片内flash操作6 n, ~3 B; N1 `
      其实H7与之前的芯片在片内flash上不同的地方就是,写操作必须要按32bytes对齐。意思是即便你只想往里面写一个字节或者不到32个字节,但是flash依然会操作32个字节,只是其中只有一个字节或者你写进去的那么多个字节有效,而其他的字节被mcu自己操作填充,而要这样做就必须操作flash的force-write功能,按照我的经验的话,就是在写之前加一句FLASH->CR1 &= ~FLASH_CR_FW,然后再执行写操作,之后添加一句FLASH->CR1 |= FLASH_CR_FW,即:' ^5 f+ P8 S$ S& A4 d  Y
FLASH->CR1 &= ~FLASH_CR_FW;( U! N' q. K% Q" R- z
HAL_Flash_Program();
, c$ D0 B; y+ l% f8 |! kFLASH->CR1 |= FLASH_CR_FW
% O4 m& m2 B% W4 t9 \* E8 s0 d这样才能保证不会出错(仅我个人调试结果是这样)。
$ K" {' l; K7 @; _所以如果是有连续的数据(大于32bytes),可以先存32bytes然后执行一次写操作,不必去操作force-write功能;如果只是想单独写几个字节可以向我说的这样操作。
( r, D  ^* Q- w( c) i, Z/ M: }6 N* z. t) f
附加一点:因为我中间还有调试can通信,而HAL中CAN_TxHeader/CAN_RxHeader里面的DataLength是32bits的,而使用Classic CAN的话,发送和接收的真实数据帧长度最大只有8,会保存在DataLength的高16位,所以如果使用的是Classic CAN接收的话,获取帧长度的时候要将DataLength右移16bits,不然绝对出错。4 T" `. L; c3 k! R% U
% j" u/ W! \- F6 l- N9 d

7 l5 e* `# V! L" N8 }) ^( F
9 l% ?5 |7 B" ^" R1 o7 A+ P7 T' ~0 [" c6 e: G$ b

* o) m5 Q8 m' u* L3 E7 J9 R/ r+ Y
收藏 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
" F" J- q! u. q$ E( qH750不是只有一个sector吗?如果要擦除flash就只能整个sector擦除了,按照你的做法,boot和app都做到128k上 ...

" Z% Q: ]7 v3 u( ~' Z& I! q刚才看了一下  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 手机版