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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/    6 {; E3 _2 h9 V" a: w- n' Y3 G- _, z4 U! C  g
主要特征:7 X( }8 _/ p+ K$ W+ N$ ?8 j% n2 h; t
        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源
- Y1 X9 g% a# }' _- A        16级可编程优先级        //标准M3可最多拥有128级可编程优先级
) [, G& w" P( W) L7 m2 P$ ]& n        优先级又被分为抢占优先级和亚优先级两段
. x1 L9 g4 m- x( |; D
& @7 k' d( }: V, w1 Q6 L! X* ]NVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E100- C: s" E  w% ~( J! j/ [" v
        地址偏移量        寄存器        ' P" P7 L& L* o9 [" Y5 b6 m. z: T
        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)* A$ Y5 e5 W3 {* I9 i- ]' V  u0 {# x
        0x004            NVIC_ISER1' r* s# K5 F# P7 ~! x1 s
        0x008            NVIC_ISER2! k) N( |  b: {0 j0 z
        RESERVED
6 d. E0 B6 q$ {6 B  k0 A( \        0x080            NVIC_ICER0
! w+ p8 ~, s# l& Y; U        0x084            NVIC_ICER1$ n% z+ l+ U  @' Z
        0x088            NVIC_ICER2
: A" |6 D$ ~) r        RESERVED, Z- H# @/ Y# A- b: e
        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)9 P$ h  Q6 ~5 Q; P
        0x104            NVIC_ISPR1
3 I8 y9 B$ M" @        0x108            NVIC_ISPR28 }. H0 W/ J& j1 l, l
        RESERVED
1 ^" E9 P6 d9 L) M        0x180            NVIC_ICPR0: J, C: u$ s4 A/ }2 ]+ I9 h! o
        0x184            NVIC_ICPR1
1 G. J: M% Q  N$ Y        0x188            NVIC_ICPR0* R2 k2 e! }: d/ a2 M
        RESERVED, E% F3 r. w* a3 G
        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)
; T6 B  s8 L1 A' ~        0x204            NVIC_IABR1
3 p% u2 R) `$ O6 }; m! b7 z        0x208            NVIC_IABR2
  m+ B! a+ r$ d0 q        RESERVED
3 n3 u6 ]9 z/ a' K5 M/ [        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个
; r5 i: M8 t1 }0 y1个特例寄存器:
! v: n6 c% w+ }8 l- F2 O        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能# C% C/ i" K( s0 _: V0 r5 S
                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断2 b; i0 i) I5 Z! U
异常和中断优先级配置:
* d+ Z2 `7 X2 N* z% o# Z0 N; v        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常1 o. v1 J, m5 H+ P' `* O. y
        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐
% l! L7 L' E' C  l6 i            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf00 r: r) _0 G$ h" S4 T: M% i
        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM        6 e% |! a# T, v3 I) `
        4. 抢占优先级的方法即实现了中断嵌套机制
% m; |- Q0 H1 ]0 G9 i' N3 l        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占0 e; f$ \' K; N1 k# s, }/ K# T
        6. 异常和中断优先级寄存器都可按字节读写
1 v1 ^% x- u6 @5 `% I        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值$ }$ d2 l" f6 b% d2 g% W- b# l& U
        8. 不同中断源优先级可以设为相同!!!& }8 D8 o2 C, V9 o: W; [1 g3 J
$ H( h1 M6 G  v" G/ ]/ b$ G
5 m% O/ p6 f6 S3 k& @
/********************************        SCB        ***********************************/* X1 }# O2 B* G8 k
SCB模块寄存器地址列表:                            //SCB模块基址0xE000ED00
) s+ M- b$ F- [! Q* J" F        地址偏移量        寄存器
7 e9 |2 L4 }) j0 s        0x00            SCB_CPUID                ) A* Y, d4 |/ B( g& r. R) j
        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常
. }+ o( D  N# Q        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)1 |* j! r& R6 i! e+ A" X
                                                //STM32F2默认值为0x08000000,正好对在ROM基址上$ H9 e, s& e0 r+ E2 p; [  u
        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组5 [7 P( `% @9 Q: m' [3 A
        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关
" @! y$ x. r+ D4 w0 W# t; q$ c+ T        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关+ P1 {& f  K8 ]5 s
                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制
: A! A3 I: [$ H. S7 P        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常
, v8 v; b7 y% H# O        0x1C            SCB_SHPR2                ' D# c3 e. W5 F
        0x20            SCB_SHPR36 l8 B* V' ^! P
        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn0 v7 G3 r# b4 I$ P. ^
        0x28            SCB_CFSR                //以下几个暂时不管
5 n& _+ V- n- _3 v        0x2C            SCB_HFSR
. {) g5 j5 w3 {. T/ Q! C        0x34            SCB_MMAR( |- h) f; b$ [" H
        0x38            SCB_BFAR* D: ?* w% i- A5 \* ~9 L' b

- R. \7 z: A; K; Z9 W  z6 [% Z/ J3 Z0 f: p8 O4 ^
/********************************        特殊功能寄存器组        ***********************************/
9 G5 x5 |. V5 ]* _$ a$ ^CONTROL:控制寄存器- Z8 Q$ H1 _+ C0 m; I. O; m! M
    仅当在特权级下操作时才允许写该寄存器 !!!
) N/ m  K! c( {        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级0 t! g4 H2 q+ Z# Z2 ~: Z! S9 @
                        特权级非特权级切换流程如下:, E$ r3 p* |+ l5 E
                特权级——————————>非特权级———————————————————————————————————>特权级- O; G' o& g: T0 I$ j
                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,               
5 x4 F, Q5 x, k3 `# Q  ^                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级   
  Z: B* f1 p! n) A, N5 U( V+ z. V, V( j( r
7 D% N* V7 Z( d7 Y+ {
        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针( v4 c. x2 U. ]" t0 u; e: R
                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效    " Y* d  @; s; I# e
                        MSP/PSP切换流程如下:
% d* F! f& i7 P* m                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        
! j. V* q% y/ p+ {$ B! F2 @' ?  j; Y                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]2 C% a, A' X) o  W0 A& ~# C
                                                                             /         \   
) A% ~" e# P4 Y1 O                                                            操作CONTROL[0]/                \触发中断/异常
" ^& U) A8 y+ E  C  q' W7 [                                                                         /                  \1 W- a$ I8 K2 X3 g# P% X! J9 \- f
                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)
: H: j+ |( e. [8 h5 X' `7 q                                                                         /                 \
/ J$ ~. ~1 f% @0 F# ?: i                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回
! l+ A6 R6 E3 F; F) T. S                                                                       /                       \. V* [7 M' N! j( t
        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)   9 B! h0 ~5 a/ }2 m
                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1]. D" r# w( h- z4 f/ \, a
4 G% w- C' p; w, K- G
操作模式总结:
9 |$ b; @! H2 d2 ?' b- i        1. 复位后处理器进入线程模式+特权级
% E  p7 @2 f. {% I1 ^        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)
# S  H/ C' U9 y& v2 q) I5 X- M. g8 i8 N* _% u  n4 \' r
8 Q" _, Z4 ?+ q
/********************************        Flash        ***********************************/
' Q: {: V! m8 H  f0 j主要特征:# s. x8 [% G+ {7 |0 m8 y) \
        1. 1Mbyte容量* }8 B# K8 t7 o+ b2 J9 |9 `- x5 _% a- H
        2. 128bits位宽读取
; Q' ]. I1 B3 @5 ^        3. 字节、半字、字、双字写入
$ \+ }  L' M! B, a        4. 可按扇区/块擦除3 C' {9 I. E$ d* H: o
        5. 存储区块架构:
5 x2 N* }5 H% E5 J' z                    主存储区:     扇区        基址                尺寸
$ \: V& m, }1 c. g( {                                Sector0        0x08000000        16kbytes3 h2 t1 I- k2 d. E7 h. {* g, J
                                Sector1        0x08004000        16kbytes* b1 w/ D- q" y" Z  i# Q5 K( x8 d
                                Sector2        0x08008000        16kbytes6 z) _  X7 ^& T! m/ t
                                Sector3        0x0800C000        16kbytes0 g& t( O7 |, A7 R
                                Sector4        0x08010000        64kbytes
7 w: M" m9 t1 p: q6 J. H* x                                Sector5        0x08020000        128kbytes) i6 ~& o  t  z7 T) d9 ?! i) e+ ~
                                Sector6        0x08040000        128kbytes/ Z5 v1 {1 v; W
                                Sector7        0x08060000        128kbytes1 t! W, [2 ?/ _
                                Sector8        0x08080000        128kbytes
  N( s) V4 V. M3 K0 w                                Sector9        0x080A0000        128kbytes8 V& E: |  R6 _7 M/ V
                                Sector10    0x080C0000        128kbytes/ F' w; \7 S$ H2 k( W! v
                                Sector11    0x080E0000        128kbytes        
) l, t$ L$ E5 ~3 s                    系统存储区:                0x1FFF0000        30kbytes1 F. R  O! V. w; A
                    一次性编程区:            0x1FFF7800        528bytes, N$ w3 K5 N- v' T" p4 Q
                    Flash配置字节:            0x1FFFC000        16bytes' w3 s+ O2 E5 {1 M) j" f9 ]1 f- t

+ j$ U, t! A  @- Z5 B6 jCPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。
" w* f7 b, A* V5 y; I% ^                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。
% w6 n5 M( Q$ j3 N# Q                          更改时钟频率的标准顺序:
. A/ q' S6 D/ K7 @                                          1. 增加时钟频率:% X' k% h& ~3 Z# B0 _! h7 q) }
                                                  修改FLASH_ACR寄存器中的延时位LATENCY
# X+ F3 D9 o" h. g- s8 w                                                  确认延时是否修改成功9 O/ U; t5 i. G' U. p1 n& ^- {
                                                  修改时钟源/预分频+ s( f* [3 `8 x/ \( l
                                                  确认是否修改成功(看RCC_CFGR中SWS标志位)/ q# x, O1 T1 R' p4 t
                                          2. 减小时钟频率:
1 Y0 C& r* I6 J* G: P) J% m$ b                                                  修改时钟源/预分频
$ K( S, W( K' `' T5 v* O                                                  修改延时位LATENCY
) l  P9 \( I  @0 R# A1 m+ g                                                  确认延时是否修改成功
+ E0 R9 Y1 i% E8 o% U% K% J4 e5 }) g. O5 |8 g. N/ `
FLASH寄存器:
0 B# H( b% Z3 z" W7 m        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时
$ b. d  S2 U. C8 t+ o( I2 N        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁  _7 m* r& A# f: N
        FLASH_OPTKEYR:    配置字节密钥寄存器
6 Q% U2 e  D& q1 i) l! M6 Z$ u9 `0 f        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位
+ M) C( f' J+ C. h        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置8 w8 a, G+ j2 d
        FLASH_OPTCR:    配置字节控制寄存器
# M1 K5 g% v! o$ }, Z- A! M, a9 W; p( u) |8 M$ N& E- B
FLASH操作:! G3 q7 ]) s+ a" r
        1. 解锁/上锁    5 ^, W6 \6 V# B5 o- N' i
            对FLASH进行任何编程操作前都必须先进行解锁;  _! m; R! `& F: C5 \' W+ ?6 g
            完成FLASH编程后建议上锁
0 g' ~2 m; y* v8 s# s1 b# v( w        2. 写入单位设置
; p' [, z2 \. D$ {+ l: i- g% h4 K            写入单位跟供电电压和Vpp有关,详见RM手册
2 V/ c$ k( G9 m3 h& x6 U; x            此设置必须在任何擦除/编程操作前进行4 P% \' ~' q2 l3 ?; f4 Q1 w5 B. U
        3. 擦除" k: n! M0 @% _  {
            扇擦除:
+ {  r/ r4 C, d5 y# Y( S                擦除前确认当前无FLASH操作
" g: [6 k/ N  r! T& u! ~                扇擦除位使能、选择擦除扇区$ {9 a' c8 }/ }7 o( ~, f
                开始擦除! l: T: N0 W+ t) X
                等待擦除完毕7 C8 w+ i/ y$ X3 s0 ]
            整块擦除:
4 \9 }8 V. ?- `+ K                擦除前确认当前无FLASH操作
( z# p$ j. q1 m" l, j                块擦除位使能
8 S, P# e% i6 n' m; h0 D9 F                开始擦除
0 L7 G8 B  s+ U                等待擦除完毕        2 D# Z) S3 `4 S1 J* M
        4. 写入
1 `: \( S; Y0 W9 p9 w            写入前确认当前FLASH无操作
+ ]- }. K9 q9 M6 G$ E9 W            写入位使能
/ P; O4 G' v+ h9 q6 T  @  d4 N) m            根据写入单位设置执行写入
+ N) g5 D5 U0 o            等待写入完毕# R' a# l  c# G& ?/ v9 ^( j

: E' H& O3 d% D7 Z) S4 E2 n, z# T7 Q

& F# Z% Q& z( j1 o- y/********************************        EXTI        ***********************************/% T: b, A- O7 C/ f
主要特征:) Y$ |9 v+ L! q! K1 ]* ~5 m9 \1 ?
        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断
& p4 b- p' f$ Q- K        可以检测脉冲宽度低于APB2时钟宽度的外部信号
1 f4 C3 H3 p6 R. k/ ]) X9 I# F2 g7 T6 k0 q, N
EXTI寄存器:
0 ~) n* j5 N, p  e' l        EXTI_IMR:     中断屏蔽寄存器1 K9 D9 Y7 r' I5 {) V
        EXTI_EMR:     事件屏蔽寄存器
/ j" }+ u5 K' U+ h) K' ~        EXTI_RTSR:    上升沿触发选择寄存器7 n/ E+ j9 D: a+ v' p( k% u8 P
        EXTI_FTSR:    下降沿触发选择寄存器3 R) F- ]0 t* T. ?1 G* C8 v
        EXTI_SWIER:    软件中断事件寄存器& s& Z( J/ I) G& @3 J1 |& x
        EXTI_PR:    挂起寄存器* Z& V( C! e" O
% Y- H6 _+ i* T# P/ V( }
初始化流程:6 E( f' ]" D- @: j7 U4 z0 ]
        1. 使能GPIOx端口时钟
3 q6 K8 o3 g, ]( x        2. 使能SYSCFG模块时钟
, L+ d4 o3 |* _2 S0 c        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)
% P6 e/ n/ Q  _8 j        4. 将EXTI的n号中断线跟管脚n相连0 C5 }! ~$ Z4 S$ |3 Z7 z: K
        5. 配置EXTI的n号中断线3 {- F# D* E* W& _2 V
        6. 配置EXTI的n号中断的优先级并使能中断9 H1 x4 A$ [- [9 }: o
. s2 J( q- f. I

  o; y. |1 e) g. v4 o8 W
收藏 评论0 发布时间:2021-12-3 16:00

举报

0个回答

所属标签

相似技术帖

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