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

一个与System Bootloader相关的话题

[复制链接]
STMCU小助手 发布时间:2021-2-25 14:53
一个与SystemBootloader相关的话题
' u+ U. d: n! x; x  W9 V! n
5.1.jpg
4 J- w. u4 x/ X' ~7 F
近日,有位STM32用户在使用STM32芯片内置的BOOTLOADER对芯片进行MCU芯片的信息读取及编程。他发现通过UART接口使用相关BOOTLAODER指令对STM32F1系列芯片的各项功能进行读写时都正常。当改到STM32F4系列时发现有些命令运行就不正常,比如通过READ MEMORY指令获取UID或FLASHSIZE时就会出错。
( V4 Q3 m: a6 p5 |
从STM32F4参考手册中可以得知:Flashsize  Base address: 0x1FFF 7A22;
3 n# L& I4 C7 b+ }) Y$ Z2 L$ g
读取FLASH SIZE操作步骤及现象如下:
1、启动读内存指令 11EE            反馈79
2、读内存地址  1F FF 7A 22 B8 反馈791F
3、读内存字节数 01 FE                 反馈 7931 00 00 79
1 i  U* @% `6 v7 k
上面的现象除了第一步,另外两步都不是用户所期待的数据或反馈。其中第三步的01 FE正好跟获取自举程序版本和读保护状态的命令相同,用户怀疑是否发生了命令冲突。
2 }7 z1 Q, t/ v* {! e
在谈这个问题之前,我们有必要大致了解一些背景知识。
! q5 L" B5 U4 A$ h1 @2 p
STM32芯片的片上FLASH往往由几部分组成。以STM32F40X/STM32F41X为例,主要由以下几部分组成:【mainmemory/system memory/OTP/option bytes】
5.2.jpg
4 e2 t: }3 w) w+ Z; @5 H7 y
其中SYSTEM MEMORY[系统存储区]用来存放系统启动程序和部分其它芯片特征信息,当芯片配置为从SYSTEM MEMORY启动时,芯片复位后就会从这里开始执行程序。

( M% K- y6 C: c( k6 ]
当MCU进入系统启动模式后,用户可以通过多种串行接口与MCU通信。自然,这里就定义了一些相关协议的操作命令。
5.3.jpg
. x& D  O! o7 U7 r
上表是针对UART接口的BOOTLOADER命令集及说明,比方GO/Get ID/Read Memory/Write memory等。其实不管你用哪种接口,这些BOOTLOADER协议命令都是一样的。

3 E$ b5 G0 v+ D. L9 O) J. @
当主机【比如PC】给MCU发正确命令包时 BOOTLOADER会反馈一个ACK, 即0X79。
当主机给MCU发出错误指令或指令运行异常时它会反馈NACK,即0X1F。
% x- _$ F% M0 u9 |& s
5.4.png
% @) A  f! m$ y' m& _; S
尽管说不论哪种接口或芯片的BOOTLOADER的协议命令是一样的,但这些命令所操作的对象或参数可能会因芯片型号或bootloader版本的的不同而呈现差异。

/ `# b) W; P4 H0 P
5.5.jpg
7 P* ^6 A4 V' n9 Z$ q' a3 l! H5 s
也就是说,不同STM32系列的PID数据、bootloader命令可访问的RAM和systemmemory的存储空间范围可能不同。
; ^; l, O! e. N, e
好,该回到开篇客户反映的问题了。客户想通过READ MEMORY指令读取片内FLASH SIZE.

5 w- N  j/ M' v# @8 F( y! O2 J2 G
我们查看STM32F1参考手册得知有关FLASHSIZE寄存器的地址是:0x1fff f7e0;
查看STM32F4参考手册得知有关FLASHSIZE寄存器的地址是:0x1fff 7a22;
' ^* `0 M+ T. H
现在现象是命令一样,接口一样,唯一差别就是二者地址不一样。结合前面的介绍,难道是二者SYSTEMMEMORY地址空间不一样导致?我们可以查看二者的参考手册或者ST官方的应用笔记AN2606查看二者的信息。

( t* _4 n$ M2 |
我们可以得知STM32F1的SYSTEMMEMORY地址空间为0x1ffff 000--0x1fff f7ff或0x1fff b000--0x1fff f7ff。STM32F4的SYSTEM MEMORY地址空间为0x1ffff000--0x1fff77ff。【在本文的第一个表格里就可看到】

& Z" V3 I  k9 E7 N6 _. z# H
5.6.jpg
" _; V) O* M' O# R  v1 c. I
到此,不难看出F4的flashsize寄存器地址没有落在自身的SYSTEM MEMORY区,而F1的就落在它自身的SYSTEM MEMORY之内。也就是说,在用READMEMORY命令对STM32F4芯片发送的那个地址是非法的,从而导致错误。当然对于读STM32F4的UID也有同样的问题。所以在应用中我们要注意这些诸如Read /Write/Go命令是有地址范围访问限制的。

& V4 Q0 _9 Q! `  v/ {( b& n- ^
5.7.jpg

6 b) j+ Z. |2 Z, _6 M! c8 F% I/ o* T
下面对客户反馈过来的结果做个简单解读:

- y/ L% d( @% z9 W9 y
从STM32F4参考手册中可以得知:Flashsize  Base address: 0x1FFF 7A22;

4 ]' ?2 y; E5 H) Q
读取FLASH SIZE操作步骤及现象如下:
1、读内存指令启动 11 EE 反馈79
2、读内存地址  1F FF 7A22 B8 反馈79 1F
3、读内存字节数 01 FE 反馈 79 31 00 00 79
/ Q2 x: J! }' m2 G
第一步,主机发出read memory 指令,MCU反馈ACK,即0X79,这步正确的。

2 F) a( E; f% U
紧跟第二步,主机发出地址及地址数据的异或码【蓝色数据】。命令本身是没问题的,MCU反馈ACK,0X79,但地址数据非法,随即反馈NACK即0X1F;此次命令以失败而结束。

- x7 f: E# t1 M
当进行到第三步时,01 FE被重新识别为获取自举程序版本和读保护状态的命令。命令正确并给予ACK确认,并给出版本号3.1及相关选项数据,最后以ACK 0x79结束。

/ A4 p1 A' y* i0 @; Z
经过三步下来,最后并没有出现客户所期待的结果。原因很简单,命令地址非法。

, ^. \7 k* v/ F2 [- I+ Y3 w% `# ^
关于使用systembootloader的调试编程,ST官方有篇应用笔记AN2606首先需要阅读,再就是结合你的通信接口选择下面罗列出的相应笔记进行阅读。

# ^$ B2 K7 s' k7 g" v
5.8.jpg

% t$ Q4 {3 `$ n  T. R( R* T
文章出处: 茶话MCU

: U4 D. ~3 c" F2 K8 V
赞 收藏 1 评论0 发布时间:2021-2-25 14:53

举报

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