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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/   
4 u4 D1 z, I) w0 v主要特征:( Y- u! X" R( h8 a
        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源
! y$ [. c. K# B3 f6 H4 x        16级可编程优先级        //标准M3可最多拥有128级可编程优先级
" W3 k# }9 B0 ^/ u        优先级又被分为抢占优先级和亚优先级两段
: m! u6 c- v7 p6 W
6 y2 Y; l, R, v- Z! \NVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E100
8 {. ~5 |3 M1 G3 Y8 u, P        地址偏移量        寄存器        
, I, o: Y& I) a0 s( s4 ?2 c        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)/ i) b% `6 F+ b0 Q$ _6 K! U' P5 P
        0x004            NVIC_ISER1
% N5 r6 A6 u: r! ~5 x) S! i  A, {& }        0x008            NVIC_ISER25 ~% A1 t7 ^- _# s1 n; y
        RESERVED
1 |! r1 u0 n3 a- [( B        0x080            NVIC_ICER0$ d. R& @" p4 x& F' `
        0x084            NVIC_ICER1
1 n# P  A& @* r( J3 p        0x088            NVIC_ICER2  o; z0 @7 I; i# p- Y
        RESERVED
4 @. r8 |2 d4 Z% b2 A# s        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)
3 C+ F: b# S' u( k4 h" p* C+ [5 I        0x104            NVIC_ISPR1
* P; B) g: w& N9 F        0x108            NVIC_ISPR2
3 `6 z# q# x  z& G        RESERVED& M" G  U& G  P
        0x180            NVIC_ICPR07 @; s& Y& W: l$ y' K& C) Z
        0x184            NVIC_ICPR1
0 N" Y) c6 `/ a0 F" c, E/ R        0x188            NVIC_ICPR0
. Y8 {  |5 U* h3 Z( ?' \        RESERVED
4 u/ H* B* n8 s* W* \        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)
1 _' z. T2 X: W6 }+ J        0x204            NVIC_IABR1
- J8 i. p( d: U# }        0x208            NVIC_IABR2
2 o% O* r& I" p3 y% K; B        RESERVED8 \9 {" q. }; j  I
        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个2 C8 l) s! n: r* M. u
1个特例寄存器:1 y& V1 B" t+ U# P% o
        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能1 G) c$ n3 `, H$ p6 }" O+ ~9 L
                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断
/ x; E3 N9 W: h5 b异常和中断优先级配置:
& I$ l0 E1 R  b1 }# E        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常# E9 T- }% s8 t# E) E$ I
        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐
: T  l& Q5 c3 p- d            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0& K7 F- k! u6 H; R& W6 M6 E9 k
        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM        
( R. Q; C6 U! X  I$ O  F        4. 抢占优先级的方法即实现了中断嵌套机制- ?5 r8 O# ?5 d# ^1 n
        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占
9 s# E& L; |( w9 [$ e        6. 异常和中断优先级寄存器都可按字节读写
- F# D; L) b8 ]' D* Y# v        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值" }3 d4 ]3 A& d* o  k
        8. 不同中断源优先级可以设为相同!!!
* Q2 N: F" Z1 [
3 @! C9 w' T2 ]  I# M) T8 Z) |; ~+ C- h+ K6 m% N, @* G
/********************************        SCB        ***********************************/
5 \2 P) v2 b( [- s" L5 ASCB模块寄存器地址列表:                            //SCB模块基址0xE000ED00
0 z; w' U( z1 i0 {2 Y9 h4 g' w4 A        地址偏移量        寄存器" Y' Q7 p4 H/ a/ [  Z2 Z: g
        0x00            SCB_CPUID               
& g" R. n2 u/ Z" y        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常8 N, _' {/ R" ?
        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)
, l" i& l1 x5 i0 X1 g$ P1 n                                                //STM32F2默认值为0x08000000,正好对在ROM基址上2 o9 J3 c7 }3 _$ z. f
        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组; H# V0 z5 e7 v! J8 `8 j
        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关0 X% b& h* R6 V2 i
        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关
! e' @) A: l* r: d5 n                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制
+ {5 t5 Z7 G6 ~$ T  i9 x& u/ `# K        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常- o5 S7 H, L. s$ y% i
        0x1C            SCB_SHPR2                - U& p% p" N1 ?0 M, N7 `
        0x20            SCB_SHPR3
8 D, \; k, {% v+ V. x3 w        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn
6 j+ m* r' U  |3 b        0x28            SCB_CFSR                //以下几个暂时不管4 {" F  d/ H, D" y
        0x2C            SCB_HFSR: c/ c3 \5 S! k- ~
        0x34            SCB_MMAR+ U' ~! }* g# N$ }
        0x38            SCB_BFAR" Y  N# y2 D( J7 p  f$ Y/ Q, T
! i6 ]: d+ W" I$ u4 S1 O; i2 J/ v
1 J- \* {$ x- |0 x: v/ j+ H: h
/********************************        特殊功能寄存器组        ***********************************/7 f! A- e  n, Y3 D* _; ~
CONTROL:控制寄存器$ B; z  l' k: A; {# i( q
    仅当在特权级下操作时才允许写该寄存器 !!!
8 X( c, J3 [: j9 ~0 V- ]! P# Q; ^        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级
( D3 `1 ~" {, A: Z                        特权级非特权级切换流程如下:
4 ]9 V0 e1 ^9 \6 k                特权级——————————>非特权级———————————————————————————————————>特权级
' v) R8 p& u, B                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,               
: t* F3 X& L. P" F5 E1 y                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级   
$ C! t/ Y7 Q2 [/ I5 G' Z' K! ~- S3 N/ T9 i/ d$ x2 U! ^  ^! ]

5 ^' ?& o2 \* ]" Y3 r' P        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针
" b, A- i$ x( h! O5 D                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效   
# W0 [  [5 @8 H3 O, W5 c$ q                        MSP/PSP切换流程如下:
- p' A/ j% q; |" U0 Z" ]8 C                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        
& J2 V0 X4 ^, t) J                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]2 P7 W7 K0 N9 q+ F, W
                                                                             /         \   
$ o" R& S3 F: i: L. t' m: D* s                                                            操作CONTROL[0]/                \触发中断/异常& s8 c4 @2 d7 y. K$ I
                                                                         /                  \
% I" ?. j; t; o                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)2 E; ^3 i% h* N) y0 g% [) l. ~
                                                                         /                 \
" q6 f( I$ g& U# C8 F                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回5 ^" T+ d+ r. o' @+ E- L( ?8 h
                                                                       /                       \
7 F) c2 V4 Z) Q5 Q0 J- a& d        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)     W$ ^& @1 n: g3 `4 B
                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1]1 F! j) U. L& i. i$ q' ~0 e1 p
) a% Q) ?/ c$ c! o/ X/ ?& @
操作模式总结:8 m: u$ k' H6 [$ A9 l
        1. 复位后处理器进入线程模式+特权级+ A' r* Q' y2 q. h" |; k
        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)
# u7 S5 j. N- j3 D# t; ^' `, a! f4 h/ _

* h3 b2 a5 a  D* u5 u6 H/ q/********************************        Flash        ***********************************/
3 t# F) i+ |6 ]* i. R! W# [主要特征:$ g1 k, j5 U$ y  ^- z. U! z
        1. 1Mbyte容量
+ l7 e8 w- e, [# k- ~5 V        2. 128bits位宽读取# ^2 H) f4 M  D5 g* q9 @: o0 y! r
        3. 字节、半字、字、双字写入
  W" [% o* C/ E4 D        4. 可按扇区/块擦除
6 B6 T- M; m8 o/ Q: g" p        5. 存储区块架构:/ x* i" G/ {" H+ j
                    主存储区:     扇区        基址                尺寸
& q3 D+ D# K: ^5 @" f. W                                Sector0        0x08000000        16kbytes
- {0 p  ~# s' ]" z  v                                Sector1        0x08004000        16kbytes
* C& s% b0 {/ U) {5 _  q                                Sector2        0x08008000        16kbytes
! P* _% E. }2 l; _' Z! ]                                Sector3        0x0800C000        16kbytes
  u, k9 b+ V, `7 n8 \- G$ L' i                                Sector4        0x08010000        64kbytes/ @& ^6 L. O# h8 d* _/ i5 w& H! _
                                Sector5        0x08020000        128kbytes$ `' [/ t3 a6 ~% _
                                Sector6        0x08040000        128kbytes
! Z, P+ o. @, ^' _, |  X# o                                Sector7        0x08060000        128kbytes) S( K/ M' m8 r
                                Sector8        0x08080000        128kbytes
# ?/ H* c* s; {7 \# T) \8 I  t" v( F                                Sector9        0x080A0000        128kbytes
% O; {7 ~, D, L3 N8 H                                Sector10    0x080C0000        128kbytes
" U7 d: v/ r/ D                                Sector11    0x080E0000        128kbytes        : N  {* T2 i. P  j  q
                    系统存储区:                0x1FFF0000        30kbytes
/ |7 s% |( b- U6 a                    一次性编程区:            0x1FFF7800        528bytes
& h% Y: U1 n/ J                    Flash配置字节:            0x1FFFC000        16bytes
) {+ `8 u, U: @3 e% A, b- k; x/ ]
* R, f; E7 a! yCPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。
2 g* S% o' ^4 W6 r" ?                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。# ~! E6 ?1 F/ _7 G
                          更改时钟频率的标准顺序:
- c- }8 ?( J$ M" t: q- r                                          1. 增加时钟频率:
8 Z  b& ]. P' Y  t5 j                                                  修改FLASH_ACR寄存器中的延时位LATENCY
2 _- z$ q1 x0 R5 ^! `; J                                                  确认延时是否修改成功3 N) q* n" w" J
                                                  修改时钟源/预分频
( [; B' t  b; U$ T) w' x/ l3 n                                                  确认是否修改成功(看RCC_CFGR中SWS标志位)6 F! Y8 L7 Z- d+ C
                                          2. 减小时钟频率:
8 [% ^2 |& d; `" \                                                  修改时钟源/预分频
, a$ \: D2 f0 J+ k8 @* B; y                                                  修改延时位LATENCY
& Q* _( S( \9 z* M4 V  ~                                                  确认延时是否修改成功
( {: u+ T1 ]6 k0 [
$ J# Y: k3 s* O: k3 nFLASH寄存器:0 O. t. e" l) k! B
        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时
& A5 P, \, ?0 Y: H        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁9 s: O' T$ A  z# s* \/ v
        FLASH_OPTKEYR:    配置字节密钥寄存器
7 ~7 R& U) A+ K& d' Y        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位: E6 K& A2 Z+ L- s5 a# e
        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置% F( H6 [6 z4 F* E- x
        FLASH_OPTCR:    配置字节控制寄存器% _- I3 ~& B1 y; R; a9 L

; {( M' u& A5 W/ n. H" e7 x$ lFLASH操作:
( Z9 v7 q, j( A2 x  u        1. 解锁/上锁   
5 K2 U7 a  h( d! D/ @# A: L' r* I            对FLASH进行任何编程操作前都必须先进行解锁;) |' N1 o- T/ Q- `
            完成FLASH编程后建议上锁
$ S* }4 K/ [6 F        2. 写入单位设置' R* H$ D" j9 u/ }  M& l
            写入单位跟供电电压和Vpp有关,详见RM手册. v: B! x" o: s: v  Z
            此设置必须在任何擦除/编程操作前进行, Y% J- E+ p0 t. F& H9 D7 l- l8 v  e
        3. 擦除; ?* k2 c1 w/ k0 U6 R
            扇擦除:# j) A+ q/ w0 j7 b- V
                擦除前确认当前无FLASH操作8 ^$ X7 l$ C. K: V) c
                扇擦除位使能、选择擦除扇区
3 A, Q. j8 j/ Y- H  M4 o                开始擦除
6 q, P7 C+ U6 A  Z: t# j                等待擦除完毕( M0 F. L4 }: C7 N3 \5 c7 q$ a
            整块擦除:0 a. H" F4 C9 v9 n
                擦除前确认当前无FLASH操作7 ^; @( r) c* L
                块擦除位使能9 O; G6 g' d% O7 X8 u7 k
                开始擦除( L  b0 q* V4 o, h5 ]
                等待擦除完毕          y% N( j/ r, ?! \' K* J6 d
        4. 写入1 x# q3 I% [6 x! u, H/ h( h7 e! f
            写入前确认当前FLASH无操作
( L% ]- p0 \% l  h; ^            写入位使能3 I' w! }1 D- Z" ]
            根据写入单位设置执行写入
$ L) o: F  t% r9 G- A3 l2 t            等待写入完毕
6 n# n9 v. r9 t' i; z7 s$ B5 A- v1 B3 v2 w# f
1 p; [" t2 Z" ?

% \" w6 B- W' l9 j/********************************        EXTI        ***********************************/7 v- i2 s; t- p& g' \* L. V
主要特征:
, z) t' N# H, b1 n" }$ B& a        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断
( [" u! ]; D, s+ L% T4 x        可以检测脉冲宽度低于APB2时钟宽度的外部信号
, ^% V9 X4 ]7 S) j2 O
. j4 u& {) V6 t4 l, REXTI寄存器:
2 R' \; x. Z  j) k        EXTI_IMR:     中断屏蔽寄存器
7 @) A3 S, U1 Z# b4 w; Q& A        EXTI_EMR:     事件屏蔽寄存器
! K8 T, Q1 N, y* r        EXTI_RTSR:    上升沿触发选择寄存器
1 k4 z# M! |5 b8 B        EXTI_FTSR:    下降沿触发选择寄存器( v, L  A! k7 m' a6 R
        EXTI_SWIER:    软件中断事件寄存器
: c! Q" m  p7 }        EXTI_PR:    挂起寄存器
* v2 B% H! {4 l" v. D( K. u+ e( F" C9 I% @7 p
初始化流程:' y# e6 j+ e6 d  _8 j( Z
        1. 使能GPIOx端口时钟2 v1 W7 s7 [0 B2 e0 [4 t2 S- H
        2. 使能SYSCFG模块时钟
/ Y9 R7 {7 R! {$ r# E        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)
9 d! u6 j, k; r" r6 C, V7 U% t- g        4. 将EXTI的n号中断线跟管脚n相连' P/ C$ b* T, ^6 m3 C
        5. 配置EXTI的n号中断线
; ~/ o! Q; p9 y( T2 e1 R: Z        6. 配置EXTI的n号中断的优先级并使能中断
. A: j+ [7 o: U. U, e! e
; J+ o( o) [5 o9 V5 r
( [. J+ w" q( N4 d5 F
收藏 评论0 发布时间:2021-12-3 16:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版