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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/    5 }- S+ Q. f2 o" \% w0 \
主要特征:
2 Z; z/ Y; X8 q; Y7 l        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源$ P, N( x6 W  ~0 q7 j2 F5 u
        16级可编程优先级        //标准M3可最多拥有128级可编程优先级( L8 y& e, K  h4 K- B/ ?# @& R
        优先级又被分为抢占优先级和亚优先级两段& x1 ^7 x" m# e/ `

; a3 ?7 d) j2 `: RNVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E100$ L2 }1 _% \4 v. c
        地址偏移量        寄存器        3 H: v5 @; q$ V; [* B* J
        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)  N) b- [0 j; |8 l4 W7 S
        0x004            NVIC_ISER18 M* w9 |1 h  _
        0x008            NVIC_ISER28 O% @5 T- {/ Z+ {2 E0 m
        RESERVED
; A- Q3 t) B# h' X9 Z        0x080            NVIC_ICER0
8 D% Y, E' f% i0 N6 N$ ]) X- o- @        0x084            NVIC_ICER1
9 s5 p4 U) I; ?. X: Q/ I  T/ s        0x088            NVIC_ICER2& {) I, S/ N% Q( U! E5 I
        RESERVED
9 V4 O9 y2 N2 U5 [1 G0 n4 z8 _        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)( _# a( X- N9 F# I8 }
        0x104            NVIC_ISPR12 P7 C' E- g# b# \! R& G
        0x108            NVIC_ISPR24 u' b6 d% ]9 X9 v
        RESERVED. f4 z0 _8 }7 L2 `& X8 a
        0x180            NVIC_ICPR03 T3 W& R% Z! `9 E0 p/ ~' s
        0x184            NVIC_ICPR1
" ]$ |. H7 D6 E( P: {- `        0x188            NVIC_ICPR0
$ ^% e/ t: H- ]  D9 V" C        RESERVED
5 f, f. Y& A2 t+ [$ P  _  l        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)% H0 b% l( w/ i9 h
        0x204            NVIC_IABR1
- [3 T9 v, ~0 [2 B* |# M# `        0x208            NVIC_IABR24 @0 ]. N2 e( i' Y& c; c" |
        RESERVED
% G$ k. k  l" X- q        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个
! m( X! A- f* l1 S4 k5 E3 W1个特例寄存器:$ H$ L% d, j) ~( ]8 D+ [
        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能
1 y) E. a$ W! {. d                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断/ S7 n( x( b: |
异常和中断优先级配置:
$ x9 w  O: A$ k  T; D/ h        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常
( J+ m4 s/ ^* v* ~7 R2 E7 @$ g        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐
! t! _. L6 S* {8 Y4 U$ x7 }3 u            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0
- T$ G  i/ M. C. R1 G  N        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM        0 t# c3 n  C/ H* U6 ?
        4. 抢占优先级的方法即实现了中断嵌套机制) p% ~* o9 h9 {2 E( E7 U
        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占
) }. E1 @2 |) {; z3 T        6. 异常和中断优先级寄存器都可按字节读写
' V9 S7 o/ q' `$ d" h+ h3 I        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值: Q. d% C; x, V, |" W& R
        8. 不同中断源优先级可以设为相同!!!
2 X  D: S0 a$ I4 I* S- T
' B# l) J7 }* y! R
# }' ~; K. p) V# |7 Z9 {, y) U/********************************        SCB        ***********************************/7 u, P8 {* o- n' Z7 S7 c
SCB模块寄存器地址列表:                            //SCB模块基址0xE000ED00* l. K1 n* |1 L( y$ s
        地址偏移量        寄存器( h4 j9 y% E5 K4 F
        0x00            SCB_CPUID               
" t! C0 r4 @% a        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常: o' ?+ O* Z- W
        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)
" ?6 |+ B* u' \  u. \                                                //STM32F2默认值为0x08000000,正好对在ROM基址上
( ?+ a1 M0 c+ r- e# c        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组  ~" @6 _! {* g7 l* Q( R4 S
        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关7 k( c8 D6 y2 ^  o2 Z
        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关) S+ e! ~, W: c7 a3 G+ c% {/ t0 X
                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制
7 d3 ~) @/ f+ N: X6 D2 }+ R0 C        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常6 M5 ?: a+ {% {1 n- L
        0x1C            SCB_SHPR2                  W, }: s9 Y  ^* T5 {
        0x20            SCB_SHPR3
" ^2 m; N6 L1 N0 l* I        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn6 J1 b! }( c, e' W* B0 X$ ^1 }% u
        0x28            SCB_CFSR                //以下几个暂时不管. Z% t( B4 R8 q
        0x2C            SCB_HFSR( V) ~3 ~+ f6 @6 U2 N/ h7 l
        0x34            SCB_MMAR$ s8 V8 D. B, ]. i& Q- g  Q6 P
        0x38            SCB_BFAR
0 ]% |& j# i- L) E" D9 G% P% o) T4 ~7 j4 U' }

7 `% f" P+ Q) N3 I2 n1 a0 ]% x/********************************        特殊功能寄存器组        ***********************************/: |( N7 E' ?5 K& G; A$ f
CONTROL:控制寄存器9 b2 W% L6 o3 A7 C+ A
    仅当在特权级下操作时才允许写该寄存器 !!!
& B. i) a( X1 @, I+ v$ C        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级. R- O6 G1 k' G! B: p8 ~& p
                        特权级非特权级切换流程如下:
, t) E/ A6 i( _+ q# n. _- ~                特权级——————————>非特权级———————————————————————————————————>特权级0 |- H6 h7 y; {% u9 l6 M2 ]
                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,               
" C2 O+ V+ _6 Y& p" U  n) `+ {( t                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级   
5 c: }5 H1 }* x/ w
3 l  q" Y4 o) y1 m8 o; @: `1 \& t( W$ ], J6 [8 S  E5 D
        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针# n4 [+ ?3 o; U( A) p+ j& h3 g
                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效   
( `' l- B& j& G# ^# c5 i2 M                        MSP/PSP切换流程如下:
' ]8 L: p  Y. @* S6 a                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        
7 V1 E* c$ r6 V. R7 h2 B$ Q% T                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]4 G7 w  ~) J0 n: W; K7 q# X1 g
                                                                             /         \    ! D3 ~, H8 T9 i% H" k1 ]
                                                            操作CONTROL[0]/                \触发中断/异常, T0 W; ?( g9 Y; M! K
                                                                         /                  \7 _+ X' I) z: P* C' ^% c1 f
                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)5 g% S  ?2 E* O
                                                                         /                 \$ k& ^5 _& J3 K: x
                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回7 k( w" K9 H! m
                                                                       /                       \0 C  a1 x/ e  o- @% e
        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)   
8 H$ v3 H( v& }- f4 M                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1]# D% }) }' j: u9 w  Y7 Z; m: B0 v

/ y+ ]' S. G8 _) l操作模式总结:7 j4 A$ _% ^- @" c7 a' B
        1. 复位后处理器进入线程模式+特权级
, S# s6 \/ n' o- I        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)
  U* [- p$ U' c6 J5 d6 p
' n; w) N$ K4 R, d1 t/ g
3 B" c6 Q- c, F* f! t/********************************        Flash        ***********************************/0 t& u0 f1 y9 F% F* m6 d. n
主要特征:, i$ h7 g) ]3 |& R" G
        1. 1Mbyte容量$ j& r( k! c* v: c
        2. 128bits位宽读取
3 I6 G3 Y3 j& r4 o# A; D        3. 字节、半字、字、双字写入
2 K+ `& y" s& w; w, H( m        4. 可按扇区/块擦除
3 z9 o" r+ D6 Z$ h" y        5. 存储区块架构:
0 d( ~9 z; L6 t6 h4 q9 S                    主存储区:     扇区        基址                尺寸" M3 w; x- p3 d. d% o! R" `2 w
                                Sector0        0x08000000        16kbytes
4 l5 V- u7 S  R                                Sector1        0x08004000        16kbytes" L( C. @9 f. C; s
                                Sector2        0x08008000        16kbytes
5 D& f3 z( }+ X! X' y, ^                                Sector3        0x0800C000        16kbytes
, {$ B6 x& ?4 e0 T  {9 ]! k, k6 U                                Sector4        0x08010000        64kbytes: _$ E( G4 q6 t5 [+ x4 s
                                Sector5        0x08020000        128kbytes
7 j6 k* z3 B8 ?: V* b1 r% L                                Sector6        0x08040000        128kbytes3 D8 K( w) S+ c
                                Sector7        0x08060000        128kbytes
& [* c+ P. }2 s) |7 `& H                                Sector8        0x08080000        128kbytes" O9 f( u& Z$ P: D4 \5 V0 b7 |
                                Sector9        0x080A0000        128kbytes) k! O+ v" l3 U- l$ F$ F( v
                                Sector10    0x080C0000        128kbytes
& S4 }) B/ t: u( m* w                                Sector11    0x080E0000        128kbytes        
/ P& V* t9 K0 Y) ^                    系统存储区:                0x1FFF0000        30kbytes/ q8 z9 a1 Y: e: O0 ^; b
                    一次性编程区:            0x1FFF7800        528bytes
8 t# _3 q$ J; d, z# O( G$ P( F7 K. y                    Flash配置字节:            0x1FFFC000        16bytes
; R3 k3 {" ]1 T% ?* s
4 `, d' I# N; h1 y+ ^CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。
2 K% X* [  v, I9 B  w! Y                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。
" l5 o0 q' z" b1 t) P9 k! b                          更改时钟频率的标准顺序:
* }/ q7 Q6 W5 h" `1 W                                          1. 增加时钟频率:
7 f; g! z3 z9 ^7 L; |  \- v" E                                                  修改FLASH_ACR寄存器中的延时位LATENCY% {- N9 s( G% {# C, d( H. R$ m, Q
                                                  确认延时是否修改成功6 V, A* V/ Z% B! E4 W5 f3 G
                                                  修改时钟源/预分频9 R- r" o4 W9 c- U( M
                                                  确认是否修改成功(看RCC_CFGR中SWS标志位)2 f; ?# R. C4 _" m6 l
                                          2. 减小时钟频率:- N$ z+ t& k4 [' T  v; y2 P
                                                  修改时钟源/预分频3 b  c0 h* R' T7 K0 }
                                                  修改延时位LATENCY: Q2 E) b% Q* K! B; l3 Y8 i
                                                  确认延时是否修改成功
. ^' j0 }2 ^# I3 i, }  d1 A
; P$ g, U* L* x( E# CFLASH寄存器:
/ \" @: ^3 B+ |+ h  W. F. X        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时9 c$ c' `/ X; W- a
        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁
; _' M9 c5 R  r- K        FLASH_OPTKEYR:    配置字节密钥寄存器) @& H4 A: t+ }- \; Y5 W
        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位( j5 ]3 C! }# H# k% d' u
        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置
; Y, f2 _0 c# Z+ e        FLASH_OPTCR:    配置字节控制寄存器6 j" L  }* P! A0 Y
# w+ {  l/ \8 I
FLASH操作:0 D; s  s# t# @: J7 ?* [5 G
        1. 解锁/上锁   
/ R8 G7 t  _: C" h# w4 z( G$ b- w# H            对FLASH进行任何编程操作前都必须先进行解锁;9 s) [" W( s3 R- ]
            完成FLASH编程后建议上锁) _/ O! O; p8 G
        2. 写入单位设置) w/ r  k4 v3 w; p
            写入单位跟供电电压和Vpp有关,详见RM手册% c, {0 [1 b& X" j% d3 {$ T5 q7 g+ {
            此设置必须在任何擦除/编程操作前进行
$ R2 g6 w$ c6 d! a        3. 擦除
% f( I- C& O" G$ U3 j            扇擦除:
! j7 o& D& c8 a% k; N; K, r                擦除前确认当前无FLASH操作
/ ^9 r, l2 T0 k                扇擦除位使能、选择擦除扇区& u  ?' f6 ^  }+ j% i; j
                开始擦除
- P5 m# o, v1 r' ~9 f. ^8 T1 z& C                等待擦除完毕
7 P- f( V4 q5 K# |            整块擦除:. f5 ^/ u0 |3 m6 v  V1 }
                擦除前确认当前无FLASH操作
" b$ i# M& b1 W1 V& ^                块擦除位使能- e" a  u5 n8 G. D" N7 l
                开始擦除, |* M& {% O5 q7 @  k: B5 Z
                等待擦除完毕        
) O- c$ w1 r: S4 C5 O5 r3 A% q        4. 写入3 a& w1 `8 ]& r0 d
            写入前确认当前FLASH无操作
, u9 ^& W) {# B: S7 g            写入位使能
+ n: X/ i5 t# D8 q. j            根据写入单位设置执行写入
8 o& m. N" x* Q5 @" u5 K            等待写入完毕
( Q" E/ B" z0 v1 D
; l' e. {6 z' v8 b
. E( ^6 _  w" }. R1 z; ?/ j% ?6 T1 c( q" t6 X+ [  E- ]2 W. P4 G
/********************************        EXTI        ***********************************/
" Z. Q# r% Z% w) p; J* F7 r主要特征:
# q% I3 b( L" t6 d' U        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断  H, B5 W: x, ~/ e$ T
        可以检测脉冲宽度低于APB2时钟宽度的外部信号5 B5 P5 d# x3 C3 ^

- F9 _+ b1 y$ d9 y5 ~& M) LEXTI寄存器:
- U9 r7 q9 X$ w- a' w: ]# T4 ?        EXTI_IMR:     中断屏蔽寄存器
+ o  I% C! {7 e& Q        EXTI_EMR:     事件屏蔽寄存器
: P+ Z- r& k! b5 U: @  o, O7 r        EXTI_RTSR:    上升沿触发选择寄存器- V4 i# Z7 i1 \, N" E9 K
        EXTI_FTSR:    下降沿触发选择寄存器6 q9 `8 B- J+ u& q6 M3 t
        EXTI_SWIER:    软件中断事件寄存器. c& y8 p# I6 k
        EXTI_PR:    挂起寄存器
1 D* r- h$ r& T( n0 Q% n  R9 k" I, P; K, D2 O1 O5 [
初始化流程:
  K+ J1 u9 c; \- C        1. 使能GPIOx端口时钟
, T. l* z5 o* p1 A2 t9 `% u        2. 使能SYSCFG模块时钟
+ r' J; T' k: N        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)
4 M8 O) b" u* Q/ M0 q* z        4. 将EXTI的n号中断线跟管脚n相连
! r8 o0 d4 u- y        5. 配置EXTI的n号中断线
3 u8 l  G- F  Q4 \: U* E; D1 k+ d        6. 配置EXTI的n号中断的优先级并使能中断( ?9 t# H9 b' s! D% M( ]5 E
. ~( z8 ~$ w; V' ^3 p

+ B) \5 t+ \9 |8 y* T
收藏 评论0 发布时间:2021-12-3 16:00

举报

0个回答

所属标签

相似技术帖

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