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

基于STM32F1系列启动过程经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-14 16:42
STM32启动过程简单讲解
: Y7 h1 f) I* \- Q0 v/ J( ~STM32F1采用ARM-Cortex-M3内核,对于他的启动以及复位,时钟系统,都是紧密联系的。以下内容对你对模块的操作帮助可能不太大,但对于你理解其工作模式是有帮助的,对于只想要简单使用单一模块的建议可以不看, D$ ?6 j* k' @& M1 J- c

$ d( p; G8 q1 \" J但是如果要深入了解,那你就要听我哔哔了。我对于时钟系统也是说一下自己知道的,毕竟官方手册中文版讲的很明白了,只需要稍稍解释一下即可。
& B  K( l3 H. U3 _5 l) x2 D# t7 I( w" A* M# Y
) \4 Y% G# Q4 e; B) |0 i8 d
1.如何启动: ?9 k1 B/ ?* T! F" v
ARM-CM3处理器结构为哈佛结构,哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。 哈佛结构是一种并行体系结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问。
4 h! b; e# M, F. n  W$ V/ e% t4 f* p# i- K$ C+ d, c6 @. j) h
8211f5d2bdb7407b82aeffd5bc25e534.png
1 e5 b, ^; o9 Q
; M- a( D% K9 I  M/ A' N5 T( C
数据和程序指令的存储是分开的,芯片主要获取指令来执行,指令是由ARM公司固定好的可以被芯片识别的指令,同时这个指令在我们单片机编译时由编译工具链(ToolChains)来生成。8 {# g5 y/ q3 V& o- j" E% q0 N: }+ U" [4 ~
7 T* Z2 M" r) ?  k0 c* l' [
3b696189d08b4a7cbc1ae166ebaec8f8.png
* C2 V( x& M3 G% x, B& H/ P, q8 j" {; U2 p
: w2 D/ m) t5 V' d
上图为各种内核支持的指令集$ u' B3 u6 D, B! n% I
* i+ ~0 T* y8 p/ S0 s6 C
在我们上电的一刹那,单片机就已经触发了复位异常,芯片接着在中断向量表中查找我们的异常指令(如下图的复位异常),进行偏移位置,获取其中内容执行。& z9 Q* d0 ]# ]8 D/ v
1 |8 Z# Y2 |2 P* Z4 E
9b4a00ffdb024f358ace20458b53a9b1.png
$ W8 [% Z( }# S

/ K( m/ E- u( Z$ a也就是说,我们可以修改复位异常内的内容,让处理器执行我们的程序。
  ^; i# q" K! R  j) l5 Q
' f9 W( o$ l+ d, {  C6 V
%]$VFYOL2ZAOB{LOSMU)HHT.png - b% T# l( _9 X' @, t% [6 L  H

6 p, G+ S) `0 n2.启动配置, G7 ~* V4 ^/ o% X
通过阅读STM32中文参考手册2.4启动配置,我们可以看到有三种启动方式,
" z: X% I: B1 S2 ^) k# h
; k# b/ [* c+ {3 l
3697c0c9ea1c4e68b44a51efd82ad4bd.png
! m! ?& J- F( ]: b

7 {8 ^  z" }6 n  g1 g) }  Z我们通过改BOOT引脚高低电平状态来使我们的实际的物理存储地址映射到不同存储器的零地址中,BOOT引脚我们是可以在开发板上看到的,下面拿手头的开发板拍一下
1 C( ?1 y2 O: i! r' Z, Z* @3 l; w) [% s; N% x3 u2 m/ k: N' w
865c578918c741628c28f795aa56d273.jpg
8 e) J2 ~4 j! E cf4c274e6c744eae81c624594bad68da.jpg ( b; W* o& q+ T1 _, F& S
! R4 y8 U9 n  v/ K/ s  }
原理图如下:这里也说明了其启动方式, U( I* _, A$ n7 m7 t
( w( w3 w, S: p1 w( j5 Y
776db5c413014837b2ee6d2e05283a6e.png % `2 S( ?, l' ^5 i# s9 p

  n6 d- x* U! E. I, }6 N: r6 p再继续阅读,我们发现后续是映射到不同存储器的启动空间(实际上是起始的地址)。
7 b7 H( ~3 ^) v; w) a. ^; w# a) Y! j" y( L. ~( Z4 R
D0J422SP%3KVWA5@Q[L1D_T.png & u" S5 A* A% I% Y
/ O6 v) x9 `$ k& ~/ ~" s
我们当然首选主闪存存储器,因为他是可以长期保持数据器件,拿SRAM静态随机存储器做个对比,SRAM断电后就数据就不存在了,而FLASH烧录之后就会固化到我们的存储器里,可以保持很长时间,就相当于手机上的ROM,保存我们的文件图;而SRAM就是手机的RAM,手机上能运行多少程序主要看他有多大。  _8 W5 h8 G0 T1 A: l8 Z4 @
在生成好的任一工程文件的启动文件(startup_stm32f103xb.s)里你都可以看到我之前提及的中断向量表配置,
4 A  ?' W* M3 ]0 r0 g6 u
( N: N9 C5 J$ W( y  ]  F
c7f50fce581541a9a3ccaafbd4658162.png   ^. z! N  }" w& A- B, D

1 |% t, K/ `( b7 `! \% d启动文件开头就介绍了他的用途
; a3 `/ G4 q5 ]# J! A1.初始化堆栈指针
  N+ h3 u" e7 W+ I. V2.设置PC指针值  k# z1 n" X! Y7 E1 K3 b1 X5 x
3.设置中断向量表
( \! f6 T- b; s9 t) _2 P4.配置系统时钟- H9 J# f0 L& b' o0 d# v
5.调用C库函数__main,最终会跳到我们自己的main函数& m3 Y( x4 N* p% Y, E$ U6 v
) w2 n  ^: \6 z, U
之后的DCD就是分配以字节为单位的空间,我们可以看到第一个就是TOP of Stack(堆栈的指针头),第二个就复位异常中断处理,之后便是一系列分配空间,用来准备空间执行我们的程序。' c" P; `$ [( ?) E
) y* S0 d: g; c7 ^, v* ?5 U9 y& ?
c6ad5acaa605457a9420e7bfee14785f.png , o  ^, p  N, i

6 P4 @& _' ?' }这里还有很多需要我们查看的地方,有很大部分还使用了汇编语言,大家可以参考手册,并用KEIL的Help–> uVision Help进行索引查找。(不过是全英文): P6 a8 T, r8 ]3 q, ^+ u4 z0 S- T' {

, ^: j4 J% c1 J& H% \9 X7 @0 a
3de881bc0535437a95bd5e7b0d95b711.png 3 m' c! k2 u7 G2 \. G/ @( N0 n0 s% o
————————————————" U4 @& p  S% X3 Q0 q( G
版权声明:南山笑
, d$ k  @6 h) e/ I如有侵权请联系删除
: k2 g0 D5 ^- M! J5 [
  C; d* I* i4 F0 P  ~% R3 x3 o( H8 S6 T# [
赞 收藏 评论0 发布时间:2023-5-14 16:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

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