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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/    ( h+ o) |" o: y5 \
主要特征:
4 ^) k4 z- d  u. [        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源
/ ]  C# k( |7 ]) Y        16级可编程优先级        //标准M3可最多拥有128级可编程优先级
, U5 e: e) T' t+ C' p  _: S        优先级又被分为抢占优先级和亚优先级两段
3 r; b5 I; q& P
, o0 A+ D' Z0 h* rNVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E100* ~1 f2 L( n" Z- s" m; u
        地址偏移量        寄存器        
0 j6 K  p, V5 g5 J; i$ V        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)
: c9 P8 j( ]1 ~9 E; T        0x004            NVIC_ISER1
# V0 B& a$ z4 u( U! i- V& m/ X& W        0x008            NVIC_ISER2
( x4 R6 p$ M" v$ C% y. l* v- C; o        RESERVED
7 ~& E) V1 ^- ]        0x080            NVIC_ICER0- n1 }* o) F. ]8 h; [& N0 C
        0x084            NVIC_ICER1
# O8 h; z- _# H$ B+ F) R        0x088            NVIC_ICER2
( ]2 j" V9 N  s! @5 Z6 H3 d& N7 P        RESERVED6 G1 ~: p0 \1 i" d, k% T' N0 h( `
        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)
" I& {' Y9 I( w        0x104            NVIC_ISPR18 {/ C- \* S1 g5 T5 E
        0x108            NVIC_ISPR22 r# L) L1 N, U3 u
        RESERVED
* u  e+ v2 X/ X- ]        0x180            NVIC_ICPR01 h  I. b8 l1 m2 Z0 ]4 v
        0x184            NVIC_ICPR13 F9 g4 V3 J# b3 o* A& x
        0x188            NVIC_ICPR0
" W9 q" A1 P5 v) A6 G        RESERVED( j; ]+ U' u6 q! h# e
        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)9 t2 J- y* a1 g. }0 h- _
        0x204            NVIC_IABR12 }8 \, o% }% o- ~" v- _
        0x208            NVIC_IABR2
1 e5 G: E! m- H! r. K1 @        RESERVED' M' T/ V+ i% k. w. |+ N, p
        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个
4 A2 ^! T9 u  N7 e2 U4 O1个特例寄存器:
& o/ U% S; N# g6 i        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能
; {/ l+ q% b+ S$ n& Z9 K6 _( l                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断9 q4 `- f: L5 e5 x4 n: l
异常和中断优先级配置:# o+ Z5 N, _( j6 S3 G$ e
        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常
$ ?7 Z0 {( d! W1 H! d: r8 z        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐
# z' D8 p' e" G3 v; Y            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0+ i4 K5 y1 _" T- n, J! B
        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM        
$ O* g/ j1 V* h  K/ e: [; [# g# x% R        4. 抢占优先级的方法即实现了中断嵌套机制: }# G' _, F) @. G, d2 c; R' T$ U
        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占
/ r# B# S  Z( t        6. 异常和中断优先级寄存器都可按字节读写  W9 n. V& J  w. ?
        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值
  ~" S6 v( X" l& f        8. 不同中断源优先级可以设为相同!!!
8 H9 u0 \2 v8 [, c1 X1 M, I
+ n/ k6 U, Y6 [. v- {/ s
( V: {9 z+ O. \% }/ j! ]/********************************        SCB        ***********************************/
2 t/ j" {. I! lSCB模块寄存器地址列表:                            //SCB模块基址0xE000ED00
6 o( N* [! M4 D) R3 [! w7 Q4 V; p9 p        地址偏移量        寄存器$ l  ?2 R$ o, q  @: {2 v9 i7 ~' \$ }
        0x00            SCB_CPUID               
# t! H5 I; _9 `        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常5 J, }1 h. H# q& E2 t, d6 S
        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)
9 n2 ^7 N2 C# L1 L7 ]                                                //STM32F2默认值为0x08000000,正好对在ROM基址上1 D/ S. R+ Q; W: d' [6 [6 \1 t
        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组
" L& R& D1 _) K' n& x% }        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关
# D4 y: Q3 B2 M  p        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关. B3 S8 S% K- B* _7 I  l* F
                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制
3 F- l) F) C* u+ v% @: H& E        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常
' G; K' t3 C% m) u. R        0x1C            SCB_SHPR2                , _: k0 @( u7 _# s6 B) ~
        0x20            SCB_SHPR3
* X& A5 J% o2 P8 \& p" `/ D. E/ I        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn
1 n  U. E. y7 P) d. @1 @        0x28            SCB_CFSR                //以下几个暂时不管
) A% Q2 M! B* t! E1 o        0x2C            SCB_HFSR2 V) O" G: M$ _% x" V2 l
        0x34            SCB_MMAR! R! u+ |" g" G+ D+ c0 @" a
        0x38            SCB_BFAR
6 J& b$ @' F5 A
' ^7 l9 V8 M$ d" x# V+ ]$ R2 j7 |. d3 S' a
/********************************        特殊功能寄存器组        ***********************************/" B7 M6 [( j1 a* L; O" N
CONTROL:控制寄存器. q' t, N7 p5 I
    仅当在特权级下操作时才允许写该寄存器 !!!
. {2 H0 Q3 t+ M6 S* s        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级" V# n& S5 i: g4 _# X3 O# f
                        特权级非特权级切换流程如下:; e4 N3 m! d* q
                特权级——————————>非特权级———————————————————————————————————>特权级
( s  W" {' Y; N- J7 T+ m7 Z0 d                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,                - P5 T: P% s! A8 i9 w& x4 z  R
                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级    9 ]: C1 q/ m* M2 N" X

. ~6 {6 X5 C3 |' i" b8 _) L" @# T+ T( T' Z" X6 u3 m/ W% a0 f
        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针
: t0 l5 e. p: @8 Q! H. p1 s1 ^                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效    / S. c1 W+ P  d( g' R0 T( {; x0 m
                        MSP/PSP切换流程如下:
' f& E; X  a- J9 ~! w                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        
. X/ ^1 N6 `, Y1 i% V1 G% I& f                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]
  j" C3 L" G: s1 X. h# Y& r                                                                             /         \   
. l) ^4 U; l) `# W: e5 _* A                                                            操作CONTROL[0]/                \触发中断/异常, Q' w0 i& }1 J7 j* c( ^
                                                                         /                  \
9 ~  _1 _3 o6 C  _5 F, B( v                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)5 \; b8 ^& `* u# H1 i8 u) T
                                                                         /                 \2 _, f5 T: w/ U1 n4 J( A' b( K/ X
                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回
6 A/ J! G- b1 t/ y  h% _                                                                       /                       \3 }& Q# e7 ?* u+ V% H1 r
        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)   0 P1 f* D8 Y& B& g
                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1], A5 `! `: h% s

5 {$ j' P0 S# H- `& n, V操作模式总结:! @+ x; f. T- C9 P& `# Y7 ^
        1. 复位后处理器进入线程模式+特权级
8 ~+ h! R/ x( s5 a        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)
3 x% F: l. {7 r" x! @: H; J* b) O+ r( y' `- Q- @

  A5 u8 N; I9 ?, }' w* {( A/********************************        Flash        ***********************************/! T3 f: I3 `$ x
主要特征:3 [5 y) W" s$ h6 s  ?
        1. 1Mbyte容量
/ ~3 J1 k  r2 G" y: T4 j        2. 128bits位宽读取
! @9 u/ n) w; o2 S& n. {7 Y        3. 字节、半字、字、双字写入+ I" O. M" q" ~3 I) G  d( H  a
        4. 可按扇区/块擦除! m. l6 h3 o/ X' R) q
        5. 存储区块架构:
# g4 ?, \5 b+ G) U% E; K9 ^                    主存储区:     扇区        基址                尺寸
9 z0 b% C3 P( H  ?4 c                                Sector0        0x08000000        16kbytes
" n5 J) i& B7 Q  E6 Z6 V; Y                                Sector1        0x08004000        16kbytes
. u; O* i7 T4 R: B                                Sector2        0x08008000        16kbytes
6 v% g& C* X" u/ w                                Sector3        0x0800C000        16kbytes
5 U* k. c: J7 J7 U% g0 e5 x5 a                                Sector4        0x08010000        64kbytes8 }. L% O* T! g
                                Sector5        0x08020000        128kbytes
) A) O+ }% y6 _5 H                                Sector6        0x08040000        128kbytes
' d, W: q8 B+ M4 T$ N2 d                                Sector7        0x08060000        128kbytes
: }, Q1 [' s; d/ e  m/ d                                Sector8        0x08080000        128kbytes
) C, ~5 y; p: T3 Y! g1 N7 I0 ~                                Sector9        0x080A0000        128kbytes
! @  F$ u6 Y. T                                Sector10    0x080C0000        128kbytes! J7 c* H( H  r  p# ]" V% w4 C
                                Sector11    0x080E0000        128kbytes        
6 T- w1 S: M/ ~% [6 R  t$ g                    系统存储区:                0x1FFF0000        30kbytes
' B; f, b# T, t                    一次性编程区:            0x1FFF7800        528bytes
) N# U8 a" A# `$ }" N* j                    Flash配置字节:            0x1FFFC000        16bytes
% m* c7 H1 z; c: j# j. l( [+ {
+ [) X6 W' B' h8 l! {, LCPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。
( ?4 _: `. h( A                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。4 }( p* g4 v7 u& Z+ F) {9 \2 k
                          更改时钟频率的标准顺序:
. X7 l0 i; ?+ U; U" Q+ S8 X1 c) p3 c3 @                                          1. 增加时钟频率:( I% i; \2 w% O8 y2 ]/ @
                                                  修改FLASH_ACR寄存器中的延时位LATENCY7 X. w! j! j2 p  W7 q
                                                  确认延时是否修改成功
& D. F7 K2 t5 N! g                                                  修改时钟源/预分频
! }2 _+ n: }. q0 W* K  B# s* i: c                                                  确认是否修改成功(看RCC_CFGR中SWS标志位)& y! o" L5 K$ U0 {. T
                                          2. 减小时钟频率:
* _, q6 d8 x  H/ y+ S                                                  修改时钟源/预分频4 A/ W8 f& z9 L0 P  E. V
                                                  修改延时位LATENCY1 l8 R( v; h: c2 x8 l
                                                  确认延时是否修改成功
8 p5 F; D  k/ O% u, Y# M* u& C' u. V" |& Z3 w
FLASH寄存器:
% H0 B$ Q; G  R        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时
: J0 U  T3 V/ ~3 P  v$ a        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁# f3 M1 f7 m! |+ U3 W! u
        FLASH_OPTKEYR:    配置字节密钥寄存器3 H" s+ {3 n: @$ B
        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位
! d4 g3 n3 K, K5 C        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置+ [6 M3 _  X, l# R3 f
        FLASH_OPTCR:    配置字节控制寄存器$ ~# y9 B% `: k9 ^: J* R4 `
9 h) \/ F' [' y) ?
FLASH操作:0 M" A! i0 g  A/ |: ~
        1. 解锁/上锁    - |$ d' M# p/ a* s" E3 ?7 `
            对FLASH进行任何编程操作前都必须先进行解锁;
! A' O! H% g  l0 O! e. _5 `7 N( B1 s            完成FLASH编程后建议上锁1 a' F' P9 @+ O- ~% q
        2. 写入单位设置; j/ ^2 P+ q5 c8 `, f- x
            写入单位跟供电电压和Vpp有关,详见RM手册
) }, r* F* r1 {& C            此设置必须在任何擦除/编程操作前进行
  P) R. _: @4 N4 A# ?6 o        3. 擦除
# r' S; a- I8 E. E/ h* y. W3 k3 n! R, ^" b            扇擦除:
" \5 C! t" t5 g( \6 S8 F                擦除前确认当前无FLASH操作
4 r' T/ Z! N8 t1 u1 M9 O3 s  Y                扇擦除位使能、选择擦除扇区3 ?: S1 D/ b1 ^% ^8 q( f
                开始擦除7 V& y- G' O4 v: v
                等待擦除完毕
5 Z$ W! |9 w3 E# T+ x" H* Q            整块擦除:
2 Y6 N$ a- U) h% U. m! v                擦除前确认当前无FLASH操作& J' J& v9 N' I0 \/ g0 E+ |. Y2 S
                块擦除位使能* O: e3 c0 d! D2 c% B5 Z
                开始擦除2 M( O  y* E. n, ~- ]
                等待擦除完毕        ( I' _! M' t# o" {- ~; Q/ l- o& p
        4. 写入4 p8 w8 t, }- J( o  r
            写入前确认当前FLASH无操作2 E8 t& x! p& h; t7 H
            写入位使能! \; z( I; ^. |" B6 |1 k4 E7 y
            根据写入单位设置执行写入: J' X7 f2 K5 D/ ~* Y5 r# {
            等待写入完毕: P& X. k7 F) n/ l3 q( }& T

5 V$ N9 d' _( W/ U' m2 j, e4 W! A, j; X3 Z3 C
5 V& m8 Y. {+ V) M; l
/********************************        EXTI        ***********************************/8 Q8 H+ p  U& v" @0 G9 ]0 ?
主要特征:
+ P' C4 g* G' F, |        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断6 T, }( Z7 @. w$ z3 ]
        可以检测脉冲宽度低于APB2时钟宽度的外部信号7 [4 I: r9 X8 q# j1 h& \! M
, [9 J5 I' p+ R' A$ S! R
EXTI寄存器:) a8 A& b% u: ^. g. {
        EXTI_IMR:     中断屏蔽寄存器
% X9 P! `- O. t0 f+ _        EXTI_EMR:     事件屏蔽寄存器) g* m6 w" p. t9 P+ x+ i
        EXTI_RTSR:    上升沿触发选择寄存器) u# J* Q% C* [
        EXTI_FTSR:    下降沿触发选择寄存器5 f# P0 u8 ^  |* I& f4 c3 G3 _; a* h# P
        EXTI_SWIER:    软件中断事件寄存器* ^) V5 Q; ]) P) v, N0 _) r
        EXTI_PR:    挂起寄存器+ p! M' s5 j1 P2 ~' ^

7 v. C4 B5 T; m  \  d' P初始化流程:; B/ t4 I' \$ E+ t' Q
        1. 使能GPIOx端口时钟
+ J! {, F/ C' Q# E4 z1 L: H( G8 b        2. 使能SYSCFG模块时钟) C( x: l9 T. ?- q4 }' l2 m2 q! J( Q
        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)
3 R3 z4 i; Z, b! |        4. 将EXTI的n号中断线跟管脚n相连1 M, C& q5 ]; Z$ _* d: T7 j( [
        5. 配置EXTI的n号中断线2 m" g2 P2 v' h( S6 J2 Q
        6. 配置EXTI的n号中断的优先级并使能中断: ^, e/ D7 p9 {

& x5 Z6 S* p& S, o  n3 r" o0 [$ i
+ j8 F2 p5 b; i7 F  x9 w7 x2 |
收藏 评论0 发布时间:2021-12-3 16:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版