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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/   
5 b2 a  s/ N/ D1 q" K2 p$ P主要特征:
6 A0 E3 O8 @: Z8 X4 M+ q2 y        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源/ U& z# a8 e0 S) z  v# X
        16级可编程优先级        //标准M3可最多拥有128级可编程优先级
5 g' i8 _/ J3 C0 G5 C        优先级又被分为抢占优先级和亚优先级两段
% i6 Z7 i+ h/ b; o) C3 z; L0 h, z
8 _8 P& `2 s8 w5 r+ U8 M" INVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E100& o2 l. @( A, a3 o2 H0 n% |5 W! @
        地址偏移量        寄存器        0 V: X0 R" l  u7 _, Z' Y2 W
        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)* L6 i, J7 M* D% ]
        0x004            NVIC_ISER19 {, }+ @3 e, @8 o5 Q, `/ W/ r
        0x008            NVIC_ISER22 f3 E7 F3 w+ M) I- `
        RESERVED
' V* D% z. E8 x1 Y        0x080            NVIC_ICER0
  h* P- J# q- ~9 G5 w& z        0x084            NVIC_ICER1/ N& k" k* @" W- F  _# H
        0x088            NVIC_ICER2
: h' j* p8 f5 j% d$ u6 q        RESERVED# B! ~7 {0 L  y% i* E. J! w% t2 Z
        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)0 ]* M4 _4 m/ F, O7 }; |
        0x104            NVIC_ISPR1
: e  h: X! R1 ]* E& G2 Y        0x108            NVIC_ISPR20 \$ n' q2 S& \, i, _: a; ?0 F
        RESERVED  c0 K' f( B7 l4 o5 t# E
        0x180            NVIC_ICPR0
0 s7 C% ^# M* M$ c# F9 e2 h$ K        0x184            NVIC_ICPR1+ T, ]5 C0 X* @, o
        0x188            NVIC_ICPR0
* t7 j: {. o, @; {        RESERVED% P, b1 f, Q5 Z& a
        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)
/ h7 }' l# g/ |) R; _        0x204            NVIC_IABR1+ s  {& @$ V5 S: x4 B# x. }0 x: S
        0x208            NVIC_IABR2
2 K) f' j. x! p& g0 ~+ }" u- _( _        RESERVED
6 f% c' B" E6 N        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个
5 ^7 U7 k3 t( l/ ^- R# [1个特例寄存器:- _$ t" k3 M& O" U) W7 ~7 e! y
        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能- }- n( Z* ~0 f2 w( k
                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断
+ [- E# {( X9 u0 i9 N$ o4 ^- {异常和中断优先级配置:$ a* S, I3 f9 g- |) F
        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常- x. J: l) D+ h( ^# [. m5 b
        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐
+ M; E9 h0 P" U4 t+ s) U            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0# D) i! J( \! w. H$ r0 O2 `
        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM        . Q5 c( t3 O! m( Y* V5 W
        4. 抢占优先级的方法即实现了中断嵌套机制
1 u: W3 ^, q) W+ V$ ^        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占
( H8 n; M- [, V! Q1 r! `        6. 异常和中断优先级寄存器都可按字节读写% x6 c5 ^" _+ r1 E$ Z; ~  z" h
        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值
& x8 d9 ]( v5 q5 @3 d& F% s. c        8. 不同中断源优先级可以设为相同!!!
1 U" Y2 ~4 ~# @  j% C! e; y6 \# H
) @/ _6 A4 j0 p* N9 `7 C+ T( k" h- ~+ Q
7 l9 N  O. J, @, M% L2 V1 ^* R: i/********************************        SCB        ***********************************/9 k2 M6 |' I( L/ [3 z+ U+ E
SCB模块寄存器地址列表:                            //SCB模块基址0xE000ED00
+ j0 K7 \+ |2 m# f& {0 |7 O: U3 M' B& Z        地址偏移量        寄存器2 S; P9 j# g; ^- y1 G; M
        0x00            SCB_CPUID               
8 `) h! t2 B1 g) F5 g. C        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常
; T& x/ ~; Q; \( h# B# e        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)
6 X- U9 y2 H& G, b                                                //STM32F2默认值为0x08000000,正好对在ROM基址上
* p7 W4 Q% }6 I) |$ }$ ?        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组
& B1 }: x2 E, S  [# ^0 R! K) K        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关
" v( U1 ?! |: z: M' x        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关5 r, o1 \% d6 r; D- p, u: }
                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制' C* ~3 y6 s8 P& A; I: X
        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常) V8 H6 q, R# x" I  p; i: |6 h
        0x1C            SCB_SHPR2                ) u0 |. `1 ~& z. u" \
        0x20            SCB_SHPR36 B( k# ?& d: V8 _( {
        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn2 y6 y; _; ^) c/ c
        0x28            SCB_CFSR                //以下几个暂时不管# i& W4 x7 o2 K" P4 p- l
        0x2C            SCB_HFSR, ?) S) V9 m  N# ^
        0x34            SCB_MMAR" h/ O2 I# J. n7 F( a
        0x38            SCB_BFAR1 H& x/ i% O! m; x0 T% n/ |, O4 a

# y, g3 m& R# B8 L1 S9 C0 H2 I4 O+ K! L* b: J
/********************************        特殊功能寄存器组        ***********************************/4 f- E( g, K! h0 r% q5 t$ e
CONTROL:控制寄存器
0 I. X! K/ a* D( a7 |' D! g    仅当在特权级下操作时才允许写该寄存器 !!!
- [; s8 g6 {: {. Q  D" C        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级" B0 r4 ^% ]  P* f% A
                        特权级非特权级切换流程如下:
5 J5 M' x; \" S% U                特权级——————————>非特权级———————————————————————————————————>特权级$ ], d  R& J* e4 R$ L
                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,               
; y# g+ z4 d" G* {* Z. a$ K                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级    ( m, I$ B2 v( c+ Q* E( m
. K& l8 A$ V3 ^3 L) ]! l$ A1 V( Y8 X
6 d* O3 h! z; |7 u2 h: i
        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针9 C" ?9 b6 S' v; _& c4 H. l+ ~
                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效   
' X$ G) l. e- s/ v6 _4 ^- N# E                        MSP/PSP切换流程如下:
* J  H* l' `- V3 e) q                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        
; I& S5 W! N. X  L9 B/ y                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]
& ]$ |5 V& g- O* U+ ]1 d                                                                             /         \   
1 l9 v3 F/ Z8 n  z. ?% n5 C3 i3 H1 p                                                            操作CONTROL[0]/                \触发中断/异常  B) L; W- Z" {/ c$ @
                                                                         /                  \# E4 [+ {: o) V9 K1 K0 J
                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)1 g& M* L0 F) R* h) C
                                                                         /                 \7 k- W& r4 W8 T2 O! U! z% u
                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回
; o3 R$ F/ _# y                                                                       /                       \
2 q9 m6 S; `8 {! v9 p( [9 h        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)   # ?1 d9 Y! M' m: h0 Y- A, I: D
                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1]
: Q9 t: ]9 ^- T9 n
! Z1 K# v# G4 ]% V8 P; C操作模式总结:
2 d8 q: W0 s/ T        1. 复位后处理器进入线程模式+特权级4 C/ P/ m& k) J! C3 X. Z: M
        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)+ B. {$ m/ b  {
5 Q4 I8 Y  g# Q3 V6 {

: J" ^  p3 x: F- ?/********************************        Flash        ***********************************/2 }$ O* ?6 p9 p: A3 }/ b
主要特征:
& [' h4 b  V8 w% _, _9 s        1. 1Mbyte容量' w; V: G/ e6 f: m0 |& e
        2. 128bits位宽读取
% V* Y% B, c3 k. ?, l8 E; a        3. 字节、半字、字、双字写入; u7 q( f) p& `+ h$ _
        4. 可按扇区/块擦除
7 i/ G5 v) X* E5 D  V! c  A7 j        5. 存储区块架构:; b% @* M$ \  f& C! m' k
                    主存储区:     扇区        基址                尺寸
1 @4 e% \* H1 e' }                                Sector0        0x08000000        16kbytes6 r7 [9 u2 V- z. G' I% E
                                Sector1        0x08004000        16kbytes; B( t$ a1 O9 t* n% R& J7 ]: F
                                Sector2        0x08008000        16kbytes1 l) e) a; j- N8 o; U4 v
                                Sector3        0x0800C000        16kbytes7 N  o/ G- L8 r5 \/ [7 z& ^
                                Sector4        0x08010000        64kbytes% B( @" F3 E% k  y! C. O$ L8 `
                                Sector5        0x08020000        128kbytes
/ i' z/ E: k- \                                Sector6        0x08040000        128kbytes
2 p) I+ B, o" g0 T2 }; F9 x( X& S                                Sector7        0x08060000        128kbytes
) t+ W3 s& `" G$ I                                Sector8        0x08080000        128kbytes
! T# s# @9 M: ~( a. R! p) ^                                Sector9        0x080A0000        128kbytes
: \! P  M3 |6 v                                Sector10    0x080C0000        128kbytes
& M0 ~5 A2 d' r, h" b8 w3 P( }                                Sector11    0x080E0000        128kbytes        
7 B! Q' n7 w# m6 a% J: j/ }$ ^                    系统存储区:                0x1FFF0000        30kbytes' ~6 l0 l9 A3 _8 V; m
                    一次性编程区:            0x1FFF7800        528bytes
+ G0 Z7 [- I- n4 v  @                    Flash配置字节:            0x1FFFC000        16bytes8 a: \, q+ ]# @; X

4 |6 p' t7 g7 |2 _' [CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。
5 i3 f+ q. h+ ~$ b                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。
, q& U" {: @* L+ e                          更改时钟频率的标准顺序:  B1 Y" i3 J6 T3 N5 n; \1 z
                                          1. 增加时钟频率:: ?" c5 A4 I: j, n6 n8 o
                                                  修改FLASH_ACR寄存器中的延时位LATENCY* g+ |% C; G  U8 @; |- z
                                                  确认延时是否修改成功! J; F0 h+ y9 x# m9 [
                                                  修改时钟源/预分频, J, k# ]. f& |  R. N
                                                  确认是否修改成功(看RCC_CFGR中SWS标志位)( E4 C) @3 O7 T$ f
                                          2. 减小时钟频率:
7 Y8 }# o  L7 A& g                                                  修改时钟源/预分频
1 z6 J# N) d% t4 ^8 D                                                  修改延时位LATENCY! \( \- j- G: J0 @6 Q
                                                  确认延时是否修改成功
* y9 t  ]4 t1 N  C4 ]* r% N- e0 U2 N
FLASH寄存器:3 }3 k3 u# S) a8 T
        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时$ }5 e* e9 d( E# I% Q3 R
        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁
4 J% s, G6 Y& q5 ~        FLASH_OPTKEYR:    配置字节密钥寄存器
7 T! J4 f2 ~! x& a6 L        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位/ M% r# \" ~9 h( B
        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置1 l5 ^9 f1 O8 h5 U5 g
        FLASH_OPTCR:    配置字节控制寄存器
$ G, i1 Q8 b" u$ I6 M4 E- U/ o" |" c% H0 u8 G
FLASH操作:
8 i6 v, U9 `* @7 e4 R3 d6 h        1. 解锁/上锁   
- \. ~- t2 x2 ]# ]! {! v2 |            对FLASH进行任何编程操作前都必须先进行解锁;# f6 k7 ?5 Z+ q, S3 P, V7 k
            完成FLASH编程后建议上锁
$ |# q2 U* V! k$ i        2. 写入单位设置5 d9 n- T" k1 U/ s5 M2 ~7 A+ K
            写入单位跟供电电压和Vpp有关,详见RM手册
4 l' c5 _8 Q' U7 V# P% D            此设置必须在任何擦除/编程操作前进行
& N5 z: i- i6 C2 i% M        3. 擦除% }. \8 q* j$ u/ Z
            扇擦除:
* J2 T5 \( p  x1 s5 e8 v                擦除前确认当前无FLASH操作
2 _. d  e* J! ]& S                扇擦除位使能、选择擦除扇区
" H  u. ~" I# [4 L! Q1 N                开始擦除
" x2 O; A: |. D; b/ d                等待擦除完毕
8 B5 D1 P: H& @" X2 f            整块擦除:+ D& Z2 t/ X" h: u& B3 V
                擦除前确认当前无FLASH操作
7 k$ Y( x- ], h$ O2 C% Z                块擦除位使能( U4 {4 w4 g8 v: h1 d% u3 _2 J
                开始擦除1 Z5 |" M( N+ T
                等待擦除完毕        
2 k0 }6 i' H7 r4 x  [1 }        4. 写入" w4 j0 h- @. \$ a/ K
            写入前确认当前FLASH无操作; ^( O2 S8 I* S1 N' x$ R
            写入位使能
# G" J# P* i+ P            根据写入单位设置执行写入
7 H, j  J! O  x. L& s            等待写入完毕9 J. b( z( c6 B! G7 q

" L$ e. ?+ S/ r1 B( V" k; h2 x6 m1 u, p- S/ x5 X

# N( h% X0 I" V2 m( r$ k/ P/********************************        EXTI        ***********************************/
+ f' e& ^/ j' L4 Z; \" l6 b" G主要特征:
7 M1 w6 B' f7 q% F        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断
& L; C6 \2 r: ]1 X        可以检测脉冲宽度低于APB2时钟宽度的外部信号
$ x* m9 q& g* {- a5 e, S3 _2 q1 Z. w4 U% h% L: E
EXTI寄存器:& E4 `, V+ e( a# c
        EXTI_IMR:     中断屏蔽寄存器- i; h5 C3 i& m" l  P+ ~: c& M
        EXTI_EMR:     事件屏蔽寄存器4 c1 h$ s2 B8 z; g; Z; }6 D. A
        EXTI_RTSR:    上升沿触发选择寄存器
6 J- Z- f- H- E! M        EXTI_FTSR:    下降沿触发选择寄存器* C6 t' W* K8 \
        EXTI_SWIER:    软件中断事件寄存器( L( Q8 z$ W* O0 r! Y! D
        EXTI_PR:    挂起寄存器+ e) n! m: `1 I% P: A. e3 F# y
' S* R" y2 |& Q4 t  f2 m' n( y
初始化流程:+ w$ A% p  }! K, W; q( m1 J$ L
        1. 使能GPIOx端口时钟
. A" N: v2 o& F% J0 V        2. 使能SYSCFG模块时钟8 N) Q' ?: p$ m% p! F$ d
        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)
/ V3 s  O8 ?/ K( l# ?& X        4. 将EXTI的n号中断线跟管脚n相连
& z* l+ v+ ?) P4 x9 k: B        5. 配置EXTI的n号中断线
2 S3 |* l% @  @        6. 配置EXTI的n号中断的优先级并使能中断& e! i/ k  x" `7 I. u
% ^3 O# L  p. W0 @( w

' H) i% ?- n! _0 q$ A) N9 L
收藏 评论0 发布时间:2021-12-3 16:00

举报

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