请选择 进入手机版 | 继续访问电脑版

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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/   
$ d) E, Q" Z4 l' `0 ^主要特征:
4 L5 `/ R1 U5 D# v        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源
2 G/ L, |' R- j; V( \        16级可编程优先级        //标准M3可最多拥有128级可编程优先级6 c9 |2 u4 o  z. [/ w* f' @
        优先级又被分为抢占优先级和亚优先级两段
+ |6 `/ `' O5 m
! N1 ]' `. p" q9 g: QNVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E100% t% }  g; P" j1 G7 H
        地址偏移量        寄存器        ; ?: F8 ~2 M; o+ q
        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满): I- s1 ~% i& M0 t- s0 i
        0x004            NVIC_ISER1
  q$ z* Y- V/ e$ D, j7 F+ A        0x008            NVIC_ISER2( }! ]& r6 }9 u
        RESERVED( R( N, H1 I! F# [% |7 l& G
        0x080            NVIC_ICER0
6 V. R" E) A9 q, H& o  l        0x084            NVIC_ICER1" j$ V. C5 h1 `/ b
        0x088            NVIC_ICER2( @1 ~: ?. P% m# _/ j* P+ j5 M
        RESERVED. `+ T4 y9 {0 J4 q) F( b( k( R
        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)* p1 Q! o' ?: X6 E
        0x104            NVIC_ISPR1
& |( J! D  C% Q0 r$ r, [- d; u        0x108            NVIC_ISPR2" c9 r% r$ m. K7 Q" u
        RESERVED' Q. k& P" ~. ?/ r0 `$ K
        0x180            NVIC_ICPR0
" P- i3 X2 [; r+ ]2 k3 Q        0x184            NVIC_ICPR1
* ?8 V1 n! t" k8 G( `        0x188            NVIC_ICPR0/ {9 `( h. T* M  `8 Y  h
        RESERVED; G1 E' G5 w0 l# K) u( B( _
        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)
" k0 m% d$ g! P        0x204            NVIC_IABR1+ Z' ^! v' M  B1 t/ y
        0x208            NVIC_IABR2
" N3 B7 M: O8 ^" e        RESERVED
$ z- \: @" v4 x9 B# e        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个/ p! s% w5 |. r/ j* v6 i, @! _
1个特例寄存器:3 }; o6 ]% e7 R. A& ~
        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能- j7 w9 v+ w7 f% w2 m  L
                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断
+ C+ `6 J# a' H* w- L/ B1 Z异常和中断优先级配置:* M/ C8 n) X% k: b3 }) Z3 a! Z
        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常) {' N1 R+ w- c% Z
        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐
" J2 J* _( M* d4 {1 x- {3 d            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0
# V' S) {( g8 u, h2 K! N        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM          U' G- q' F& [: j- \  t' L$ Y
        4. 抢占优先级的方法即实现了中断嵌套机制
; h; |# [! |8 @* o        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占
# m$ _& C6 }5 I" {        6. 异常和中断优先级寄存器都可按字节读写" w' l7 |# p! k" H6 t
        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值: C4 @# f* i% c5 Y4 _. S, d
        8. 不同中断源优先级可以设为相同!!!
* l2 p3 u7 `9 o
$ O1 L9 G5 v" k" ~" P2 V  m2 X; P; \, _* V4 b5 z6 S' V. F
/********************************        SCB        ***********************************/
' B) ], @! Y4 Q8 b" t. iSCB模块寄存器地址列表:                            //SCB模块基址0xE000ED00! d! v4 a4 j( R, p
        地址偏移量        寄存器+ }0 }. j3 x% _( n6 k, Z: P
        0x00            SCB_CPUID               
5 L9 r, i2 M. q0 K$ q/ ~        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常" G: e: [; k8 Y8 I1 |
        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)- `# {9 S+ n  Z. X# `
                                                //STM32F2默认值为0x08000000,正好对在ROM基址上+ `4 v7 E# \% E# D; K/ O5 [- |& d
        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组- o0 E; u( |$ [: Q8 d4 w
        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关& ^! c$ S5 O# M& b+ N( F. J* E8 u0 Z2 U
        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关% c: |4 Y! n' u$ }$ h6 R3 I: K7 }
                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制8 \: j( O8 h: U$ ^4 u
        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常* s4 y9 {! l; \2 {3 w6 d
        0x1C            SCB_SHPR2               
8 j& M" s" b- |4 G5 p9 l7 B& `" i, S: X; Q        0x20            SCB_SHPR3
; `' W& i" Q$ b; `$ m& `1 w( L% G        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn
% j% U) {: w2 c( B+ g        0x28            SCB_CFSR                //以下几个暂时不管- }( }1 G/ z; f$ T
        0x2C            SCB_HFSR
9 C) j) ~1 o6 v8 H        0x34            SCB_MMAR
/ j1 B+ f7 [) S! {- s2 j        0x38            SCB_BFAR
- h- @# j# P7 s& }, W& q+ h7 ~$ c1 P  [, N' n) o
, L/ @1 y* g3 N+ l% C6 i/ x
/********************************        特殊功能寄存器组        ***********************************/' ], Z; H5 I6 M6 S) o) k
CONTROL:控制寄存器  v* q7 P! J/ m( X' q, U2 A' c
    仅当在特权级下操作时才允许写该寄存器 !!!
/ n( w  }; h5 U  `        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级
7 e! T9 I2 i$ T' U. |                        特权级非特权级切换流程如下:' ?5 N2 @2 M6 A% f0 Y' J3 ]* q- }* W
                特权级——————————>非特权级———————————————————————————————————>特权级2 K$ ?$ V, \/ R5 K+ m+ ~, C  j4 C
                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,                  G8 E8 w5 Q8 A8 |. Y" A# T
                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级    ' L6 d& O2 M  |6 G) V1 h- K, a

# w) P& a+ ]6 F- ]  k' u  `$ ]" e* v' S
        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针
9 R! L7 ~7 y  Z, J  v9 D2 T( Z/ A                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效    % A* x" O5 ?3 A. N2 J% q
                        MSP/PSP切换流程如下:) F* Y/ o$ R* Y* Y' V
                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        
- u% c6 f" S+ |                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]
7 C% }  d  x) g8 V& F; u. t4 Y6 a                                                                             /         \   
4 n9 D- ~# G) ^  I3 @3 t                                                            操作CONTROL[0]/                \触发中断/异常
8 u; z. D3 q: r+ ^1 ]0 B                                                                         /                  \+ q; x8 x' ^' Y/ e. e
                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)8 C9 ?6 Z3 `/ ^; j0 h' u  r
                                                                         /                 \
3 ~4 d. t" C4 e7 B3 v0 h* S+ ]                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回
% V# U- l6 J! t+ a# j' j  M                                                                       /                       \$ M1 Q+ f- J6 T& l9 ?
        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)   ' ^, Q2 u3 j* r1 ~( V+ ?- @
                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1]
* }9 E0 ]3 r# d8 ]: `( |+ ~& G4 X- e
操作模式总结:% `- u% }! G$ ^. y
        1. 复位后处理器进入线程模式+特权级
9 `7 F, S: L7 i, F2 ]        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)6 q9 ]. i1 s" B2 {7 w4 {

3 O5 _* X6 S( q
( _9 i& [6 t" l/********************************        Flash        ***********************************/, u! P: t, C% _' N) w  N) W6 E
主要特征:
( r$ F, i# _" r0 ~* w+ _; _        1. 1Mbyte容量: M9 Z8 j8 s! }" v
        2. 128bits位宽读取
+ f$ X3 ~/ f2 T        3. 字节、半字、字、双字写入
# o7 q/ Q6 F4 j        4. 可按扇区/块擦除
+ Q5 [' d% ?+ B9 \# l        5. 存储区块架构:
  T! D- S- y1 v- K4 z- {                    主存储区:     扇区        基址                尺寸
! G$ a) ]9 w+ ?0 b9 {                                Sector0        0x08000000        16kbytes0 F% g9 u' |; O8 G7 N7 ^* V$ a
                                Sector1        0x08004000        16kbytes$ Q1 q' A+ e% k7 i
                                Sector2        0x08008000        16kbytes
+ H7 {3 L; s8 I1 N1 ]( R                                Sector3        0x0800C000        16kbytes
$ N7 U1 g5 B. W. C, `$ S                                Sector4        0x08010000        64kbytes) P/ x% h/ k7 U
                                Sector5        0x08020000        128kbytes/ c. D7 a* W& p% p& o
                                Sector6        0x08040000        128kbytes
4 ], ?) @2 ?" Z: \: f  u                                Sector7        0x08060000        128kbytes
% J( O* G2 L/ x$ m6 u2 i1 }                                Sector8        0x08080000        128kbytes
( W- _: P' |" q6 @                                Sector9        0x080A0000        128kbytes; }8 U, P1 F& c. W1 p+ z* z- m0 U
                                Sector10    0x080C0000        128kbytes9 X+ P, ?& J/ l- y
                                Sector11    0x080E0000        128kbytes        7 R; J9 m( @9 V: v2 R8 E0 l7 ^3 E
                    系统存储区:                0x1FFF0000        30kbytes
5 \& D5 U7 I! }6 Y& q4 }, l3 {! r                    一次性编程区:            0x1FFF7800        528bytes
. G% i) O: j" K! \/ |% y0 c: @                    Flash配置字节:            0x1FFFC000        16bytes
% ~! q$ L; t9 E/ B) E! ?! F0 c" |
  L9 V5 S) K5 LCPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。
3 k0 @' Y) b6 N' F) P                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。
4 w* z. U" t4 C: A& Y& t0 |                          更改时钟频率的标准顺序:
7 H3 ?1 E# M" n                                          1. 增加时钟频率:; [0 l4 P! L+ O4 V  l
                                                  修改FLASH_ACR寄存器中的延时位LATENCY
, |; ^% R" d6 [/ z# `6 n                                                  确认延时是否修改成功
: `. V2 Z; G7 F( V9 L7 _% y6 [% q' D* {+ [                                                  修改时钟源/预分频" O: u$ e5 K1 |- u7 n7 A+ ~
                                                  确认是否修改成功(看RCC_CFGR中SWS标志位)
. R9 E7 ]# \/ [3 p( [                                          2. 减小时钟频率:
! U, O  D' O. e# |. F; Z: v, U                                                  修改时钟源/预分频& ^) j2 D6 {: h6 |$ F$ ]) I
                                                  修改延时位LATENCY) l% E, o7 V% V0 C
                                                  确认延时是否修改成功
& `& _5 K! y* k
' s. x5 P. u$ |* AFLASH寄存器:
/ J2 w" Z: P" d        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时
2 C1 J. D/ S3 l9 S        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁
5 Q' u- o! h9 q# ~" n. U        FLASH_OPTKEYR:    配置字节密钥寄存器
" F2 g" }8 X, R8 Z$ r9 g        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位  ]6 B3 s: X# x# Z, Q/ G. W
        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置  g, ^- F* J/ C7 D* L/ T9 ~
        FLASH_OPTCR:    配置字节控制寄存器
5 G) a8 O7 J7 h. ?/ I. ?, Z! W3 ?( Y+ o
FLASH操作:7 E& h% j4 H* g3 G
        1. 解锁/上锁   
( q; [  z1 P( B            对FLASH进行任何编程操作前都必须先进行解锁;0 o" h( a/ }9 H* k5 b
            完成FLASH编程后建议上锁6 E0 A# L" y$ h8 o+ k! e& |' ~
        2. 写入单位设置7 p5 @5 m$ {. h
            写入单位跟供电电压和Vpp有关,详见RM手册
3 \$ B  r' G' Y, _( Q            此设置必须在任何擦除/编程操作前进行5 ~0 v% \+ K0 ]7 p) h- v" Q
        3. 擦除
* f) X4 V: [8 y, D            扇擦除:" P" j4 y& s2 F1 K5 h
                擦除前确认当前无FLASH操作( s, y* I% f0 {9 k% j6 B1 s4 d
                扇擦除位使能、选择擦除扇区
! W* t" @9 i" ^  v                开始擦除" j9 }# d( Y, C, g' ^
                等待擦除完毕
6 p3 k$ v0 Y& }9 u            整块擦除:
/ S" i' i- k% {$ l8 u3 [                擦除前确认当前无FLASH操作
$ |* g: E& F* P3 F- V% U                块擦除位使能% Y( {8 a5 r; l
                开始擦除; O0 o6 M( S/ X4 u/ g
                等待擦除完毕        # w7 L" i7 O' G4 {6 c; g4 \
        4. 写入# A% w1 H( h, Z% n. z5 s& T
            写入前确认当前FLASH无操作
4 E6 i9 Z/ f  B! b( \1 k. i            写入位使能
, I1 [1 [: S8 p! R2 q            根据写入单位设置执行写入
- _7 U1 U2 z. i' Q$ V# E2 K            等待写入完毕
4 y) f. n0 N0 G, D8 W6 j2 d- q0 W9 S1 f$ T3 E# Y

8 _1 j7 h" |" P* W2 v( V- ]$ S% h& P/ B, r  t3 C' Y
/********************************        EXTI        ***********************************/  k/ [7 ^0 s4 Z3 e6 H7 U8 c! z
主要特征:8 ?9 D* l: s- ]3 x$ y* `
        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断
1 ^" T. ?: e% |/ X6 o9 l; c        可以检测脉冲宽度低于APB2时钟宽度的外部信号
7 R: Q* m& u% T! E" P
  P8 _) B3 I1 W6 Q8 ]4 kEXTI寄存器:+ _0 i( d% n* e8 S
        EXTI_IMR:     中断屏蔽寄存器5 p/ T: v; z$ p& M! F
        EXTI_EMR:     事件屏蔽寄存器/ U4 ^; z2 g. ~/ X' R. r" m
        EXTI_RTSR:    上升沿触发选择寄存器/ C7 s# ?+ S  p/ p3 v. v, Y5 {
        EXTI_FTSR:    下降沿触发选择寄存器
' S# h- Y$ Q' i, ]) W        EXTI_SWIER:    软件中断事件寄存器* R7 \9 j2 ?) j( v- z+ o
        EXTI_PR:    挂起寄存器% d1 ~& ]0 g3 O8 B! r/ T! \& b4 w% }

- l7 Y7 W8 x5 B0 H6 g1 I# ]初始化流程:4 H1 T2 D+ J" d7 N0 v& q
        1. 使能GPIOx端口时钟
6 o9 V/ J: ]/ {8 s" ~. ~, m        2. 使能SYSCFG模块时钟
- Y0 o% f; A0 H4 ^        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)# l  `" @( W1 `: K, G  t- V
        4. 将EXTI的n号中断线跟管脚n相连1 h% p8 i7 A) D; w  |( `+ Z! X
        5. 配置EXTI的n号中断线) R% p) c' m  Z$ t: K7 R" \
        6. 配置EXTI的n号中断的优先级并使能中断
: n1 @2 r9 h2 }' [
, F6 S, @1 B8 G5 T6 V5 J
* j9 I* k; @  E9 M: d1 o
收藏 评论0 发布时间:2021-12-3 16:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版