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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/   
4 O9 f6 t/ E8 z- Q主要特征:" M# E; E/ _0 q& O3 {
        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源* q3 ?( }8 ?6 \  ?
        16级可编程优先级        //标准M3可最多拥有128级可编程优先级* p3 N9 M/ S1 |* P. U
        优先级又被分为抢占优先级和亚优先级两段
& d' U2 F+ Y+ q8 G# J7 _
# q! P2 I  _  V- {NVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E1002 |. d! K/ \! g
        地址偏移量        寄存器        : A  I$ J& V1 r: h% U, m1 T
        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)
' V( L/ V! l8 _        0x004            NVIC_ISER15 u' A; y$ \, ^5 k5 k6 Z
        0x008            NVIC_ISER23 U: l6 \2 f: _3 v8 X& Z# ]
        RESERVED" L. w8 G: d7 S6 x& I' B) X; v
        0x080            NVIC_ICER0, S$ y! K: U+ x  f( H
        0x084            NVIC_ICER18 E9 p* U4 y; w5 ~* t/ k: C2 {  e$ a+ c
        0x088            NVIC_ICER2
% S- v+ x9 H; ^; B" h' Q( ~        RESERVED/ V8 v, [4 ]- B# I# ?* o4 ^
        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)
# I6 u7 a0 z. M" f$ D        0x104            NVIC_ISPR1+ M2 I* t) H& q8 ^" L) n
        0x108            NVIC_ISPR2
' t3 n6 d( |* _1 B2 o0 s        RESERVED
( r$ E% G$ s$ B9 |" C2 [        0x180            NVIC_ICPR0- n8 n- n% K; ?  F$ Q/ _. X) r
        0x184            NVIC_ICPR1! ?% j* k( B" p4 W: f
        0x188            NVIC_ICPR0
$ n2 b$ a4 {7 ^9 L" [, {" V6 d        RESERVED
- F8 p% Y0 ^0 ~6 V( D# G5 i0 C9 |        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)
- _7 I( l- \3 `4 X$ u. z        0x204            NVIC_IABR19 p5 A6 D0 N% e6 n! b; R1 q% P
        0x208            NVIC_IABR2+ j/ I0 h0 O4 f
        RESERVED) P. z, ~' y% u  F" \% L8 ]6 v
        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个; M2 @4 d, @: b1 r( Q% q
1个特例寄存器:
. ^: j4 ^5 P7 ?/ n# t' r3 S        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能+ n9 t2 D& _0 Y9 A  q0 q) Y
                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断
$ C& f6 x1 q/ P# z' m4 W/ c异常和中断优先级配置:
' @* Z+ r) G- e) k% D& u        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常
4 E0 y: u4 A- B1 N/ ~" K        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐8 Y; l' ~% c1 F2 k- P! e% C
            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0
) n% N& g- v! A        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM        
6 l* \1 t, z- [7 l: H9 T0 u4 l        4. 抢占优先级的方法即实现了中断嵌套机制
9 H( n' G) K; M        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占
# j: X1 p1 c/ g2 ?6 {        6. 异常和中断优先级寄存器都可按字节读写8 x3 W. p7 Q; A1 W
        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值' c, ]7 T/ F' b  }+ k8 ?
        8. 不同中断源优先级可以设为相同!!!' n& H2 \: ^7 d7 N" t2 O; @% I7 `
& N/ Q% G  Z. N4 h6 j* w

" |2 g2 S8 ?4 ]7 n$ u" M: r/********************************        SCB        ***********************************/
# o, \, B8 N# G/ TSCB模块寄存器地址列表:                            //SCB模块基址0xE000ED007 M3 M) X% r) ~) U
        地址偏移量        寄存器; U1 M/ U& o8 t
        0x00            SCB_CPUID                5 @8 k. Z. |- i# I5 S
        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常
* p. t1 y0 e& `- r        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数). l0 i! n" O  U! ~3 L2 u1 J) l
                                                //STM32F2默认值为0x08000000,正好对在ROM基址上' J# N# c% Z% t" ?3 e
        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组4 c; o9 s3 P' [; i& x8 {. h* O+ q
        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关
+ S( M. ^0 O2 h- }$ x* l  f4 t9 g        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关4 v& y; J( J) @  Z, w# w1 F- W
                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制1 i7 N+ B* D, m* Z
        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常
6 r* L. K/ E1 |$ R. N        0x1C            SCB_SHPR2                6 U. @+ v/ g# |+ E
        0x20            SCB_SHPR3
& M% \0 v8 l% n% v! g$ a3 m        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn
8 w  _' u' f$ |3 N) p! X( f        0x28            SCB_CFSR                //以下几个暂时不管8 V- t' @- k# O+ S% Q6 M
        0x2C            SCB_HFSR
% ~- X& r1 i  [; m+ H        0x34            SCB_MMAR
% r7 h  x* f" L7 {9 i' Z        0x38            SCB_BFAR0 S+ A& t! ~% j! Q) d
, O# Y  r1 Q4 ^* Q# e; H

. Q( w6 G- [* U: S' R" |/********************************        特殊功能寄存器组        ***********************************/
1 {5 w/ y- O* d$ [1 }" s3 A" RCONTROL:控制寄存器8 ~1 Q) S6 J, q- H6 p
    仅当在特权级下操作时才允许写该寄存器 !!!
) @0 }* {6 {$ U1 Q4 a+ P  g6 F) \        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级* e" R8 c/ o; {% q' S: _& Z) E
                        特权级非特权级切换流程如下:) w0 D" }6 j# x; O. R( z
                特权级——————————>非特权级———————————————————————————————————>特权级
# k( i% m0 A8 I# z3 [                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,                ; X- B9 q  X. A1 ^* A4 _- X7 k  k. P
                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级    ) A/ r6 l+ J4 a6 T  ?+ _+ C

$ T: c4 c3 w+ X! ?+ l( U4 V9 f) p% ?
        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针( d8 k4 s7 T1 ?( e" C$ V
                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效   
5 g6 h% |5 @: d7 z                        MSP/PSP切换流程如下:0 I# m% [1 z3 h, {
                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        
$ L! p1 n: |& H$ Y                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]5 `( ~# O  Z- _9 O$ k: }! q; Q
                                                                             /         \   
& ]# S$ u4 ]8 n; W( M5 x7 E                                                            操作CONTROL[0]/                \触发中断/异常
+ I. B6 v) s1 v. a5 r8 R                                                                         /                  \9 H9 l2 O" x7 ?7 b! }& \
                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)
- k4 T$ ~' i! g( q7 q* L! Z                                                                         /                 \
; A% t, G0 S6 }/ z6 Z                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回
( r, D  ^: V" H6 e                                                                       /                       \% J2 r: h2 @) D! k
        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)   
% K1 a' x: m( O4 k* D                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1]
1 i, i! K- P, r
# @! F& B  H6 r+ K/ A操作模式总结:
2 X) {2 ^8 b2 ^  d5 ^$ |# X        1. 复位后处理器进入线程模式+特权级
; X1 \/ r9 f" h; I& f) @        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)
' S; f% H- c0 ^+ k$ Z, Q- j4 \5 d5 [9 j5 g& R! y7 {

  d) ^( D5 f( X. `. o; ^0 Q+ D/********************************        Flash        ***********************************/- S& F8 z5 \  {) l5 l! w; C' e
主要特征:
9 p% @1 T. O% O) {+ m        1. 1Mbyte容量# I, O% h' `9 G* n0 F" v
        2. 128bits位宽读取" j' e3 q4 \- }
        3. 字节、半字、字、双字写入
% {6 M# U8 g2 r3 `        4. 可按扇区/块擦除- D! _, |# j' k# G
        5. 存储区块架构:3 {% t2 B6 G/ F, V! _, y$ u4 S
                    主存储区:     扇区        基址                尺寸7 r$ l  l% ~! Y$ }- z  `1 Q$ C0 R0 z; b
                                Sector0        0x08000000        16kbytes4 ~* A; h6 `  g$ s9 c
                                Sector1        0x08004000        16kbytes8 B8 _* Y; S" J1 A7 b
                                Sector2        0x08008000        16kbytes; g. @, D; h' @. C/ N8 Z
                                Sector3        0x0800C000        16kbytes
& ]& O  t1 z  T* u                                Sector4        0x08010000        64kbytes+ q+ x& [$ x3 h6 \9 f
                                Sector5        0x08020000        128kbytes
- F# U2 H, ]# O& G                                Sector6        0x08040000        128kbytes
) ?* U( s5 m, S. |7 I% v: U                                Sector7        0x08060000        128kbytes, T( j" o3 o) M' Q5 m
                                Sector8        0x08080000        128kbytes
8 j5 _! v5 E# Q) t* z6 J" ~                                Sector9        0x080A0000        128kbytes
2 U' `5 w) Z* `8 w0 F                                Sector10    0x080C0000        128kbytes% D" h+ N: E, K" J
                                Sector11    0x080E0000        128kbytes        
& P: K; P7 X# o& W8 ?( U: F                    系统存储区:                0x1FFF0000        30kbytes
9 \, J* r% \' S7 N" _6 I                    一次性编程区:            0x1FFF7800        528bytes
" q5 l+ Z$ C( C                    Flash配置字节:            0x1FFFC000        16bytes5 K4 `$ I- z1 }9 P! v! {2 ?5 b7 V

7 ]2 S) `0 e1 vCPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。
4 F- x9 i1 m- \3 m. G: O  B4 C                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。
4 A& b* q& e4 ~( l                          更改时钟频率的标准顺序:/ n- z& d' P& ?5 v
                                          1. 增加时钟频率:
/ ~2 V: I. B( r, \7 y( [                                                  修改FLASH_ACR寄存器中的延时位LATENCY
) F  o+ S+ i. L; L! B5 T& `                                                  确认延时是否修改成功+ p, R! o2 Z/ j  Q3 K
                                                  修改时钟源/预分频
+ g/ R. @; W* X                                                  确认是否修改成功(看RCC_CFGR中SWS标志位)
8 V! g) n* H  I2 r& k                                          2. 减小时钟频率:& G6 f8 B( x4 [& V& j
                                                  修改时钟源/预分频
% S' [+ }# [, R5 X& d                                                  修改延时位LATENCY
. j1 [. ~! Y) s* n8 ^6 }; L- n; ~) V                                                  确认延时是否修改成功3 e4 j! ?2 U3 ~2 D

* g4 A% `* }1 m* t1 s+ ^* O; W9 {3 KFLASH寄存器:3 h# F1 p) A& V6 m$ @
        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时  G4 P6 r5 k3 r% m3 B
        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁
$ K! z0 e; t' V8 Q1 K        FLASH_OPTKEYR:    配置字节密钥寄存器: j, X/ P# G! a/ V. @; X8 X, j
        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位! i! t/ [5 ^7 j( u$ F
        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置
9 E2 o& N, U: H9 k1 u3 G! a        FLASH_OPTCR:    配置字节控制寄存器
! ~  m+ D5 d( ]3 ?! }, M& B; m# J! |- f- |) J4 s  R" k& A
FLASH操作:0 o/ ~$ Y4 \7 W, H. [. N4 `* n
        1. 解锁/上锁    % t9 z! j4 r: g: W! l: r& P+ W
            对FLASH进行任何编程操作前都必须先进行解锁;
5 J6 B! p7 c! G: v            完成FLASH编程后建议上锁
' L) p1 l' Z' K, w, @  h- h        2. 写入单位设置' C, a1 y, G$ m  w$ m# U
            写入单位跟供电电压和Vpp有关,详见RM手册% f& l0 w# y6 F) @
            此设置必须在任何擦除/编程操作前进行% k$ t! Z* V4 @( {: y
        3. 擦除; c9 D$ a: ?6 W# T9 u  V+ N8 f0 J
            扇擦除:$ d3 t  @3 n' w! Z
                擦除前确认当前无FLASH操作" J& K$ g9 w# \8 p1 e9 N+ N
                扇擦除位使能、选择擦除扇区1 m5 _2 b  Z5 B( q
                开始擦除
- M9 V4 J( X0 K                等待擦除完毕
! t0 s9 {7 [8 \3 c$ `% Y7 r            整块擦除:6 A0 H4 q, f  W+ ]  {" o
                擦除前确认当前无FLASH操作8 h, \- |& u* S! ]: U) D* r! m9 M
                块擦除位使能
% Z. Z& C9 R8 {. s  w  m. y                开始擦除  @+ D3 U* l* b$ J% l9 F) i, w' v5 G) B
                等待擦除完毕        
& D+ ~# Z( @  |' I+ j; \        4. 写入7 I/ S- u/ Q2 x" }) y. L/ H
            写入前确认当前FLASH无操作; S, {0 B% `7 u$ e0 q3 d' X
            写入位使能
6 z; E/ N, J* \9 E4 J( _; q- e% n- p            根据写入单位设置执行写入+ ]: w) t4 R% u' k6 U1 S
            等待写入完毕( w" r- d5 U( u

6 P7 b9 V+ G! ^( n
  E. j# v4 O9 {2 O1 _' ]
- r3 y/ C0 Q0 D; {" `0 h/********************************        EXTI        ***********************************/
) Q) {3 h* w- ]! I2 p主要特征:
: |0 P4 _+ z  l) O& D$ b        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断# C# P, H+ Z1 D/ g  T
        可以检测脉冲宽度低于APB2时钟宽度的外部信号: @7 N$ g7 {$ z, U. R
; q: W; C; x0 z
EXTI寄存器:& F# y1 d, h9 Q' [  N$ y4 l
        EXTI_IMR:     中断屏蔽寄存器
2 `* ~9 w" O: A) _  P        EXTI_EMR:     事件屏蔽寄存器
9 s: ?% W; U( B        EXTI_RTSR:    上升沿触发选择寄存器
) `& `. \1 G. j- B0 `) Z8 O; \        EXTI_FTSR:    下降沿触发选择寄存器
5 H; m7 O  Q  f% `/ g* K        EXTI_SWIER:    软件中断事件寄存器- Y, L- L: P/ Q4 ^  ~; ]
        EXTI_PR:    挂起寄存器" t0 |+ q. N, E& w
4 n: p8 b0 F; y& D+ m8 w2 O; D
初始化流程:
- F0 H9 h; ?1 U6 q        1. 使能GPIOx端口时钟, g% @9 I4 R% L+ F; U4 E
        2. 使能SYSCFG模块时钟
/ B6 f9 K) g) S5 G7 i/ i7 s* @        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)/ l. c7 a1 t3 ^& k4 [( n
        4. 将EXTI的n号中断线跟管脚n相连9 |% g- a& f) R$ _+ U% C& A5 L8 Z& ~
        5. 配置EXTI的n号中断线
! N( ]5 q6 R% X  M3 z, J/ M        6. 配置EXTI的n号中断的优先级并使能中断  ]& S% a1 I+ b
' X: K8 @$ X/ z$ @

. Q* b8 e# M0 R3 U% E! C; C% C3 ^
赞 收藏 评论0 发布时间:2021-12-3 16:00

举报

0个回答

所属标签

相似技术帖

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