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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/   
8 r+ i2 ?9 m  q5 B3 `/ h8 }主要特征:
2 {3 [6 A5 |. n8 k. R- T) f0 O        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源
) y/ a, G/ K  S6 }& O$ f. |        16级可编程优先级        //标准M3可最多拥有128级可编程优先级& Z: g& i( T2 }" d1 l7 |3 {. B, k
        优先级又被分为抢占优先级和亚优先级两段
; I3 s! _, {* k$ T
, a4 M  m; ^& g& }5 BNVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E1003 k/ Z0 D2 {* t) i6 }! l  |% l
        地址偏移量        寄存器        
: h: ]. U: S" s4 W9 f+ s! m) D        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)
1 d2 Y& Q  S/ f/ `1 y        0x004            NVIC_ISER1
+ c& _* c/ `' Y$ a        0x008            NVIC_ISER27 n+ z$ L! {: |
        RESERVED; d+ v, j) P1 v/ D" V5 Y
        0x080            NVIC_ICER0- |! w( U0 b& W; g: F
        0x084            NVIC_ICER1( a3 @5 W0 P7 @& v/ Y9 z
        0x088            NVIC_ICER2
, ^2 d) h' d5 J# Q0 ]        RESERVED/ O8 o( G" T% T
        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)
- w4 ~" S4 {! F4 @# i        0x104            NVIC_ISPR16 A7 Y8 K; s$ z  D4 t8 J9 Q  x
        0x108            NVIC_ISPR2
3 K4 D* b5 C, m( F        RESERVED- _, S) p! d: s4 l
        0x180            NVIC_ICPR0% m( T% o; {& r& \+ Q: J
        0x184            NVIC_ICPR1. N1 }% e* R# A( U5 h
        0x188            NVIC_ICPR0
6 J8 ^0 H1 H% w* t        RESERVED
# t( J* \; _# H' x        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)' G* A/ v! P8 o9 R) }. d& ?0 m0 q2 `
        0x204            NVIC_IABR1
1 ?4 l; L  A% N2 `        0x208            NVIC_IABR2
2 w2 Q: \0 K; Y        RESERVED- z$ u* u3 a* {% Z+ O
        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个
8 }5 n% s" M) Y1 _8 b: U1个特例寄存器:' Y4 ~8 \  F# y3 T# [# I. p
        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能/ \9 b- a' X4 J% ]& |# h" b1 m' q
                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断  P6 G' @, J' @# K/ B5 M" q, ]
异常和中断优先级配置:
0 ?  Q% _+ u  u# U        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常% g/ ^! o: l7 |- d$ V5 t' l. f
        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐
9 G- L3 W" S2 f            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0
7 p$ o$ k% H9 g/ _. y        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM        
3 H( I* I  V! R* c* O, u        4. 抢占优先级的方法即实现了中断嵌套机制
, e! i4 e8 c4 i. Z+ I; M        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占
* F2 ~: b9 u9 y( L; ^        6. 异常和中断优先级寄存器都可按字节读写
! M: t) K! ^2 w4 Z, {' R        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值- H9 v( ]3 m: w9 X- Q0 v
        8. 不同中断源优先级可以设为相同!!!7 K7 ~3 A$ m' q8 d5 G5 h% f* P+ l( ?- F
  m  c. M; y+ G! \5 R2 Y

/ J" K( {' t1 x- m% W# Y7 h- W/********************************        SCB        ***********************************/
4 m- F: |5 n3 R7 v3 L! fSCB模块寄存器地址列表:                            //SCB模块基址0xE000ED00
9 \# i, k  |# y6 z: V( N        地址偏移量        寄存器; @; N- v% t1 H! d# G; {) h" [
        0x00            SCB_CPUID                3 z$ R% o) B5 h; ?
        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常
/ P9 }9 p8 n' Q' ~7 i- G4 e        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)! s' x* ~* l, N8 j/ O" \# X
                                                //STM32F2默认值为0x08000000,正好对在ROM基址上
8 T6 P0 ]1 F* g        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组3 W- ]7 q* ~8 {$ s, |# B" p
        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关
, C. {! L4 A% l- D. p. m  _, ]        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关3 {. y8 S$ S. s8 [9 i
                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制
2 h. d  E3 F6 m8 W        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常' x8 e) b! j# I+ a
        0x1C            SCB_SHPR2               
6 C- [' ?/ a, ~/ r& B        0x20            SCB_SHPR3
% g/ J8 w" G; Y: i5 E3 s4 _, \        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn+ G1 n: ?$ ]* w/ T# A
        0x28            SCB_CFSR                //以下几个暂时不管7 {7 w5 f  ~2 d4 r  b
        0x2C            SCB_HFSR- K$ b" o4 c! ^/ X
        0x34            SCB_MMAR7 ?, F7 ~3 [* x* V
        0x38            SCB_BFAR
% _7 x3 D8 X, I4 ~- N
- @: [! l2 }9 h- s" J- ]/ X' G* k+ k7 V( z( R' g; }7 u$ k1 W
/********************************        特殊功能寄存器组        ***********************************/
) F% R+ R* I2 O8 r  p4 aCONTROL:控制寄存器
5 H' U" i" ^0 t# L% J    仅当在特权级下操作时才允许写该寄存器 !!!
: X  c3 ^$ B# A6 K3 i% j5 o) ?        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级+ W7 X4 p7 Q; l) h5 |( g
                        特权级非特权级切换流程如下:
7 P+ v- ~/ z7 F4 J. m9 `                特权级——————————>非特权级———————————————————————————————————>特权级9 O6 }, A2 J3 V' O5 D* ~8 A5 d
                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,                % Z" K6 n+ y9 {# X
                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级    8 }/ U2 a: D& k

, ~3 R4 S; ^% V" r3 Z, {! }6 \2 w0 D9 n4 r1 x% l" Z, K
        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针
. h+ O" I3 F  w  W                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效   
( ]# ]4 o( W+ k2 T" U                        MSP/PSP切换流程如下:
+ c: h6 }) c7 h                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        ! ]1 w3 C  E7 `! q
                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]
" z4 X, `+ \) J. [% ~                                                                             /         \   
" P( D8 S+ G2 l3 d                                                            操作CONTROL[0]/                \触发中断/异常
, h" ], H# ~4 J! K5 D                                                                         /                  \
* H2 _( H6 ~0 \2 P! N1 I# J3 _" O( }                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)
! d' R# V2 Q& @) b5 ~                                                                         /                 \
" X, |7 k0 o4 A( \0 F1 E                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回
' g/ f" t& y% }! l3 E2 P7 Q                                                                       /                       \3 U  O% s! e: I" d( Z0 L
        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)   
+ |% u: P$ K2 s) w% }                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1]+ M5 A& L/ t$ j- @0 x- F

( j0 P0 E* {' S3 x: _操作模式总结:0 b+ Z8 j- ]* l1 h5 X9 \4 c
        1. 复位后处理器进入线程模式+特权级! i+ K8 I3 c8 W: p& v0 [" s$ v- I' q
        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)
$ u* a  ]4 l( k% D9 e6 v3 W9 [6 ~, P6 j$ q  X. _

' `8 t) ~+ O2 B5 w' P# r* v$ s/********************************        Flash        ***********************************/
' _- R( B5 n- ]  t主要特征:( a1 i& z0 Y$ e7 \
        1. 1Mbyte容量) \! Q" a7 ?$ B7 ~3 N, H
        2. 128bits位宽读取
- e3 N, ^6 I3 G: t5 M0 _        3. 字节、半字、字、双字写入8 g0 T# D% O6 K' k4 a5 }
        4. 可按扇区/块擦除, u/ ?0 D1 r6 e7 \' T% o. {
        5. 存储区块架构:
# J: ?. P  a% t6 @0 v                    主存储区:     扇区        基址                尺寸
( ?* k3 G2 l( W) B6 H, x                                Sector0        0x08000000        16kbytes
5 c3 C2 }# j+ g% Q5 @, ]1 M3 M                                Sector1        0x08004000        16kbytes
$ ?; j7 V5 i' u# X                                Sector2        0x08008000        16kbytes6 R9 i2 }( f( A; s5 J0 S
                                Sector3        0x0800C000        16kbytes. }7 d! [: Z. p( [1 s; ?  w
                                Sector4        0x08010000        64kbytes0 P( a; h4 ]0 ]0 ?) Y, r* ?
                                Sector5        0x08020000        128kbytes# t7 q1 `5 k/ w6 O) b; m. q
                                Sector6        0x08040000        128kbytes
9 {5 }1 M3 a2 K                                Sector7        0x08060000        128kbytes' Y) m) E- `- O! g; v
                                Sector8        0x08080000        128kbytes1 n3 W0 j5 z; C, |
                                Sector9        0x080A0000        128kbytes5 W7 Y0 F. v; G2 c
                                Sector10    0x080C0000        128kbytes& A  J, `1 H9 Y/ V1 f" r
                                Sector11    0x080E0000        128kbytes        9 Q; G' e7 t( M6 S$ K) A- B$ I
                    系统存储区:                0x1FFF0000        30kbytes: S- }( t% W' V( @: s
                    一次性编程区:            0x1FFF7800        528bytes4 x2 }; M# v& j1 U
                    Flash配置字节:            0x1FFFC000        16bytes/ S( h/ `$ q. }: ?1 M% M

* ?  _  p$ C" I" O0 V: QCPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。
! @& Y$ h: N7 K- Q/ b" v                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。$ d# c- ]7 a7 ]. S+ q
                          更改时钟频率的标准顺序:
8 Y; m3 i* J, h3 X                                          1. 增加时钟频率:$ }+ Z) i4 T7 {! W0 o, _
                                                  修改FLASH_ACR寄存器中的延时位LATENCY
9 i2 a, g1 L. G9 d                                                  确认延时是否修改成功
- C2 x/ Q7 I" j7 m, q9 G                                                  修改时钟源/预分频
4 X; ~; r) L; Z, B6 f7 P                                                  确认是否修改成功(看RCC_CFGR中SWS标志位)
8 q4 }9 }. M' y( N3 g                                          2. 减小时钟频率:
% `6 e- F5 o5 g5 @# Q# `                                                  修改时钟源/预分频6 `6 @# o; k# f* u% Q
                                                  修改延时位LATENCY
- P- m- u7 ~9 e( n3 n* I                                                  确认延时是否修改成功1 n1 Z( y' c5 G  Q

- c8 c$ Z2 T  L& Z: n1 c8 r4 IFLASH寄存器:" p! j; l0 j1 ]8 ~8 u+ |+ o
        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时
- T& N# x3 W% a$ L' C& c- b4 b: d        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁
# b; d+ B+ m/ ]9 x- e  j        FLASH_OPTKEYR:    配置字节密钥寄存器: J4 e# l7 J8 y6 y1 K  P4 @% |
        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位
4 L1 P% Y* B' a9 R. p6 |( @        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置' c& I& _0 A/ @
        FLASH_OPTCR:    配置字节控制寄存器# {( P8 z2 }9 R6 t% b. O( q' k& f
5 g: _: ?3 v0 H5 ~9 R5 p8 O
FLASH操作:! C, G# N7 W6 M4 \/ v9 ]6 v
        1. 解锁/上锁    ) J3 Z) M3 T  u4 j4 @
            对FLASH进行任何编程操作前都必须先进行解锁;
* ^5 `! a* M0 C  K$ T            完成FLASH编程后建议上锁9 [( `) |" _0 H1 g1 I+ D3 o
        2. 写入单位设置
$ R4 G, k7 y6 k            写入单位跟供电电压和Vpp有关,详见RM手册# j8 ]5 Z4 n$ A$ d
            此设置必须在任何擦除/编程操作前进行
4 f, y# D1 R$ R3 }        3. 擦除4 a# N  S! t! G- Q3 _  n
            扇擦除:
. Z) R( ^) i. B                擦除前确认当前无FLASH操作' m  }- D+ h' d6 }  a
                扇擦除位使能、选择擦除扇区# k$ J' v! s: A; l8 \$ I# ]
                开始擦除4 \% n, H' B1 T. `% ?9 ]6 j9 L
                等待擦除完毕+ ~( U: o% E- @4 ^: {% N9 q& _
            整块擦除:# Q5 b; a9 Q; c1 A
                擦除前确认当前无FLASH操作% \" w; ]0 o5 {, Y
                块擦除位使能
. F/ m/ T9 U/ b, O                开始擦除
+ R" I) _. x3 ~! d- K* |% U                等待擦除完毕        $ g& X( q0 s6 j: X% w& I
        4. 写入: M4 p* @" R5 l7 e
            写入前确认当前FLASH无操作2 P" m2 h  [7 W# R, J  o
            写入位使能
( ^0 {  `4 [8 \' h  n            根据写入单位设置执行写入$ l( k5 w+ h$ m" Q* V- _' k
            等待写入完毕
( l% `$ t( t0 B$ ^6 B
# A! l. U& I5 Y# }5 O( R* }9 V8 B& h0 p) q/ m

( q8 P% d7 M! O. O  q/********************************        EXTI        ***********************************/8 v& A7 v2 H# Y# s# ^
主要特征:* R: b8 t( y7 H: Y' i/ ]& J
        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断
1 q  K/ i& \, b& L        可以检测脉冲宽度低于APB2时钟宽度的外部信号7 G" e  Y) u* ?, r) |3 U

8 a& t- K3 M! lEXTI寄存器:
! q4 `  m7 V9 H" w. t6 w        EXTI_IMR:     中断屏蔽寄存器: g) `7 d; b: [- t7 @
        EXTI_EMR:     事件屏蔽寄存器2 {& Z) S5 q, H1 s( g/ A% X
        EXTI_RTSR:    上升沿触发选择寄存器
/ V1 b3 G9 X; ~" t( C3 x        EXTI_FTSR:    下降沿触发选择寄存器$ m8 |5 }8 @7 q" A1 J
        EXTI_SWIER:    软件中断事件寄存器# P- h; W9 r+ s3 s  W
        EXTI_PR:    挂起寄存器$ U% V, [9 l3 j5 F' m, A0 f
) T: O) c: I8 J+ l/ B7 V9 |
初始化流程:
2 c) ~. Y9 G) }2 n, k# q        1. 使能GPIOx端口时钟
( c* }, X4 F! g        2. 使能SYSCFG模块时钟
% y9 d0 \' x7 v5 J; s) u( S+ n8 S9 a        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)  k' l; z1 B5 E3 Z+ F2 c6 C  q
        4. 将EXTI的n号中断线跟管脚n相连
% M5 l1 h% q% ~7 E! O) {% }        5. 配置EXTI的n号中断线
4 G# ~7 q7 z# `: |        6. 配置EXTI的n号中断的优先级并使能中断1 r4 b6 Q7 h% Q' W
$ {. O5 |7 u( [, j
3 Q" r  a- u8 P' y, L/ y  C; \$ Y
收藏 评论0 发布时间:2021-12-3 16:00

举报

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