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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/   
$ g" R* @6 Y6 i4 {( M* U主要特征:+ G/ k# ~& H9 i" x" E
        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源
$ N- _: u* ^: A' W/ b3 b        16级可编程优先级        //标准M3可最多拥有128级可编程优先级
# e1 `# T( s5 I1 Z        优先级又被分为抢占优先级和亚优先级两段
0 e" d1 E7 s" }4 m# y- w2 Z6 p' k$ v. w* o+ S
NVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E100
9 U; q! u4 X' Q2 G- ?        地址偏移量        寄存器        8 e0 b1 K+ S# @% u
        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)6 O: }  t: Y* J7 E) s. l1 }
        0x004            NVIC_ISER10 h- |; z4 E' t
        0x008            NVIC_ISER2
( Q% v7 ^6 i' `! R  c        RESERVED
2 k  X  C& r! M/ _- b0 w$ O        0x080            NVIC_ICER0; ^/ H8 @, k1 g4 s- _( F% h8 ]
        0x084            NVIC_ICER1
+ x/ K( L( U1 s: d: `$ i! H        0x088            NVIC_ICER20 e  B! E8 E% Y2 P0 \8 d5 Z
        RESERVED* _  o% l  u; [  C9 h# T) g
        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)6 [& p" ^5 r+ C
        0x104            NVIC_ISPR1
6 f. m- s6 R" m6 d- r( h        0x108            NVIC_ISPR2+ d3 T$ v5 l' r  |
        RESERVED3 c+ e0 y6 D; z' y, s5 ^
        0x180            NVIC_ICPR0
+ E1 v. X& I" [' a7 _2 z        0x184            NVIC_ICPR1
, D% S$ O0 ^& S( C        0x188            NVIC_ICPR0" h% n5 i% ~0 s3 W5 n
        RESERVED
, m% Y1 q7 M+ t" `3 t        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)2 ]1 y' ~3 e1 U! Z. b
        0x204            NVIC_IABR1! }1 }: \2 o" ]. r
        0x208            NVIC_IABR2
- r5 w+ Z, Y. m3 K- l        RESERVED
, p& Z) j$ d, ~: I8 {        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个
9 t& ?" N3 e* E" v! A( e* {1个特例寄存器:8 @  w* r' D! x- U: e; v; z. T
        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能
6 Y9 c& S/ S" D" e- F6 x1 w                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断
/ J7 ^& e6 S9 {! B异常和中断优先级配置:
+ J' i; ?+ W) N/ M" ~7 A        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常$ c+ m/ j  [- \
        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐
& K- Y7 C5 g9 e1 m* h% ~# i3 `            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0
# i1 m- A- k" Y+ u& R8 r        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM        ( ]/ u9 R  ?/ K/ Q) S% t
        4. 抢占优先级的方法即实现了中断嵌套机制. q4 O/ k6 u# \" y
        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占
& e0 N8 @8 Z8 _        6. 异常和中断优先级寄存器都可按字节读写
; E; n2 O: k) `) o9 _4 G        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值
3 K/ `6 J  t% L! x% e8 a. E' {+ ]        8. 不同中断源优先级可以设为相同!!!
6 T7 L; ~: S5 o- {% m0 [- W! n1 P3 y' X7 \% N
, s; z/ m# D+ }; E' V5 {
/********************************        SCB        ***********************************// \% d$ ]( \' p) S0 v# _) ^2 _/ H
SCB模块寄存器地址列表:                            //SCB模块基址0xE000ED00! `" p8 l$ ?& F1 B2 Z
        地址偏移量        寄存器
& g" \1 `  \! c, s' j4 E! \        0x00            SCB_CPUID                4 J; J; J5 f6 M$ }
        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常" X5 l' R$ E6 _+ b
        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)
+ u9 [0 a8 Z+ t, R( {& }! Y: ^- f                                                //STM32F2默认值为0x08000000,正好对在ROM基址上
, D7 S! Y- R2 [- q  F" z  v+ x        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组
+ }, m- o- u" ?4 u, Q        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关
: N' Q5 D# z: F' H: l3 B        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关' o5 h# z* ^1 H
                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制) ]! b  ]. l" N/ O
        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常
) `' h2 Y0 F$ `5 t" R        0x1C            SCB_SHPR2                , X; i+ K/ q7 k  h
        0x20            SCB_SHPR3
. c. V( d4 J4 ]- [. D9 [0 O        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn* S8 P+ \+ f. i* ]5 e5 z( B5 _
        0x28            SCB_CFSR                //以下几个暂时不管
$ j! q+ M/ ~" L' `  f        0x2C            SCB_HFSR
- D$ Y' d) T$ \3 ?9 q2 ~( \$ Y0 @        0x34            SCB_MMAR
9 k3 A$ n4 R* v* ^  M        0x38            SCB_BFAR6 u- h. l$ j+ h
2 ~; _2 B6 X) E# k8 Z

7 A+ M/ c6 B7 \) Z0 r/********************************        特殊功能寄存器组        ***********************************/+ t, y0 m( Q( [
CONTROL:控制寄存器
/ ?/ T6 I2 X& {- c( j. F% @8 D    仅当在特权级下操作时才允许写该寄存器 !!!
2 ]& R! [) H* l4 [7 X; h        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级
- U2 K) A) c) V1 o                        特权级非特权级切换流程如下:' \( C3 `7 Q* k( m
                特权级——————————>非特权级———————————————————————————————————>特权级; F  u/ b# a' U: r8 g) L5 S/ x$ U
                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,                9 f; o7 H! K+ F) Z8 F
                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级   
* t+ C+ @  ]+ N! L# E+ {. T% {5 z9 D9 K) I# f
! S; o% f, o2 |- z2 e
        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针. R  Y3 M3 G0 X6 S. A4 e
                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效    8 Q) |' t, N9 h. `9 V0 y* T/ h5 b* G
                        MSP/PSP切换流程如下:! C  G2 D3 E& n7 I& s9 o; C. s
                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        : o) t6 \) `3 u1 m% E
                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]
" x9 l5 H& s6 \  Y! A  w                                                                             /         \   
) y  ^! y$ f" P4 B, l) p+ q                                                            操作CONTROL[0]/                \触发中断/异常
% a6 C" {( |: w$ w                                                                         /                  \4 T/ k/ W  Q. H! g3 _: W; X
                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)8 J- P; b+ @! i6 \
                                                                         /                 \
/ E) n: `4 m2 A6 S, a$ M                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回0 J* {) v9 |; P: X( s7 P( C
                                                                       /                       \2 K+ ~. {9 }) [. P8 V3 w0 Y) D
        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)   ( B+ ~0 |+ E& G( t: Y  j8 }2 D! P
                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1]
8 j; h& T0 w; X: }2 B4 t- S
( m# y: m0 w2 k& j2 H4 M操作模式总结:
* `8 X8 s- F. N' P4 }        1. 复位后处理器进入线程模式+特权级! K5 ?! r; K3 W5 Y- t, X
        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)6 ]. D' H: s( R6 `6 k/ _

3 s/ ^1 y2 E+ _% s6 L5 h. M6 T) t
/********************************        Flash        ***********************************/% B9 w' h2 @: D  \# J' e7 d
主要特征:
- i  q+ K1 R0 ~; m5 E        1. 1Mbyte容量6 w& `& n4 R$ O: p, m. A  @
        2. 128bits位宽读取) U# p* u! H) m: U# ]& h) P
        3. 字节、半字、字、双字写入2 z7 z/ n: r: x7 l5 J
        4. 可按扇区/块擦除
* c8 |5 N8 |  J8 y% A6 M        5. 存储区块架构:$ A3 k: }% ?: [% s- P
                    主存储区:     扇区        基址                尺寸9 {5 Y0 @, [8 s7 P
                                Sector0        0x08000000        16kbytes
+ ?, H) b7 ~- N1 z4 n                                Sector1        0x08004000        16kbytes
9 \* d- H' v8 y" h. p4 x- A8 s, k6 g6 R                                Sector2        0x08008000        16kbytes
8 ]* S5 q; y. q' K6 X5 {) e                                Sector3        0x0800C000        16kbytes
& A+ n) O" Y0 s3 B7 k% |                                Sector4        0x08010000        64kbytes
" f' q% y# O. f7 o9 A6 E4 E1 n                                Sector5        0x08020000        128kbytes. C3 B- ]. I- C5 Y& B) _
                                Sector6        0x08040000        128kbytes
) `9 Q* a" }( H4 G8 s* K" B' M                                Sector7        0x08060000        128kbytes
( ?. n( d+ N/ |                                Sector8        0x08080000        128kbytes) o3 F2 Z* o7 I  L1 Y9 _2 o5 a
                                Sector9        0x080A0000        128kbytes6 A3 ~1 ^( H! M; u
                                Sector10    0x080C0000        128kbytes
2 n/ k3 C" d# L6 W2 [8 ]2 p+ h+ X                                Sector11    0x080E0000        128kbytes        4 p9 f' P* H. P+ ], o3 f
                    系统存储区:                0x1FFF0000        30kbytes
7 \& o4 U5 K8 f6 n: n                    一次性编程区:            0x1FFF7800        528bytes
3 V! f% E: H4 S; F: [' i. }                    Flash配置字节:            0x1FFFC000        16bytes
# n) w& G; w* k! o, _3 ?% S+ ~$ t6 |. [) L5 Z' ^' V0 {6 s
CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。
( i" ^; k6 S8 \" R3 `! N! z5 F                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。
1 k" K6 S4 y. k+ |( J' C                          更改时钟频率的标准顺序:
& b( u4 I( m' Y1 k                                          1. 增加时钟频率:, U1 b4 B2 z! ^" i" z
                                                  修改FLASH_ACR寄存器中的延时位LATENCY! E4 O6 y: I( m3 U- r
                                                  确认延时是否修改成功: d. S( b/ l' e7 y4 I& K' G
                                                  修改时钟源/预分频
) r4 [, H% X3 [* @& ~: E                                                  确认是否修改成功(看RCC_CFGR中SWS标志位)0 T3 e- z7 ?/ Y9 ?6 T
                                          2. 减小时钟频率:
  @* X8 Q+ r6 l) Q& L! Q                                                  修改时钟源/预分频
7 ]! {; K! s, t& `* W$ q                                                  修改延时位LATENCY
; D( O2 [; l3 |  W$ {                                                  确认延时是否修改成功
& U- w4 o) ^5 z! O! i1 O' w3 j, E) F# u- S9 v5 z5 J
FLASH寄存器:
' ~* y8 k2 z6 Y% v  j) j        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时) `+ C9 e, l: N( P, l* g2 `( o
        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁' a. \8 F) g3 s5 N# K( f- l# g. _
        FLASH_OPTKEYR:    配置字节密钥寄存器
. ]5 e7 C% |$ M% m# U8 O        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位6 f) ^1 m0 E) U0 r0 }3 z
        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置$ A/ X8 z$ U! d( _8 ]) |1 e
        FLASH_OPTCR:    配置字节控制寄存器
4 n3 ~9 R; s* L7 X
$ O" E/ {5 U& ^# ~7 kFLASH操作:+ v% F8 r2 V" u" ^# N, l0 _
        1. 解锁/上锁    / G) T) a/ n: ?3 e  g% ]
            对FLASH进行任何编程操作前都必须先进行解锁;
3 E! ?. B( H6 J# Z. X5 u            完成FLASH编程后建议上锁6 Y- U+ B  @! p! v4 H8 _7 b
        2. 写入单位设置; j/ x: z+ _8 s& g3 k1 `
            写入单位跟供电电压和Vpp有关,详见RM手册
- k# [5 r* C) _7 l2 O            此设置必须在任何擦除/编程操作前进行9 }8 ]% `- \2 ~5 |1 X
        3. 擦除
7 i: R" w+ r3 r9 S            扇擦除:; |; H, r" |- m& x: w& s, i- F2 F. l
                擦除前确认当前无FLASH操作
4 ?0 O  A8 d/ t' a  U# R; T& x                扇擦除位使能、选择擦除扇区' i' ^% p% m" S
                开始擦除; Q# b' |; g( c0 T
                等待擦除完毕5 l) m: ~3 E( A: X* o. [& r, P, J
            整块擦除:
! v/ b7 n% O% ~: Z0 W                擦除前确认当前无FLASH操作
. Z# j% e' A/ I. B6 e                块擦除位使能
" Y* N" d! @4 r7 v                开始擦除: e1 \2 x  x; t
                等待擦除完毕        / j# d) @5 u5 q+ l' C5 o& \' M( O3 e
        4. 写入( V# E6 t; s# U$ |$ Z$ G
            写入前确认当前FLASH无操作) p% `% E5 i0 E  {) F- K4 I6 E" o
            写入位使能/ C" V! [( `6 \0 |! L3 b8 ?
            根据写入单位设置执行写入
  _& j1 z5 p+ }/ v            等待写入完毕
" Y* `2 u# k, h7 m8 ]
% B* Z+ |% ^/ \# s
) S9 k( g+ G7 c  f! h8 `. o& o
9 {: `7 B' j1 k( z: I/********************************        EXTI        ***********************************/$ Y" v- C! I4 l- e+ z( B
主要特征:
6 ?' _) N8 z* f. v: f        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断
  n3 n7 j4 p& K4 ^. t3 |- \5 d2 g        可以检测脉冲宽度低于APB2时钟宽度的外部信号
% m1 e6 R1 I7 n% o5 J  `: {4 j
1 e9 A! y* r5 t# a0 |2 iEXTI寄存器:% \2 F9 J, n% d3 ]
        EXTI_IMR:     中断屏蔽寄存器, p6 m/ Q+ {, y+ J3 d8 {
        EXTI_EMR:     事件屏蔽寄存器0 H" s5 c, [% Z1 R" L& i
        EXTI_RTSR:    上升沿触发选择寄存器( N% I6 G8 c% I# F) X
        EXTI_FTSR:    下降沿触发选择寄存器
5 I* @# G" K' U/ p        EXTI_SWIER:    软件中断事件寄存器
- P7 l5 C$ n$ A" K* E9 {        EXTI_PR:    挂起寄存器
. g* ]. ^0 R- ]; O6 M* l
7 l' u- Y5 W4 y8 t; H9 i% K& D初始化流程:
9 ]0 u- z  D7 Y( o& G1 G  w( T        1. 使能GPIOx端口时钟3 r$ G1 J( t9 O
        2. 使能SYSCFG模块时钟
! S, P" E6 X' D' ^$ k( D        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)1 M; n  R. u* L) `: D# V
        4. 将EXTI的n号中断线跟管脚n相连" I  |! o: k# T4 q6 t- g$ |' r& z
        5. 配置EXTI的n号中断线9 o9 t5 @9 u6 {& \& @  P" r4 A
        6. 配置EXTI的n号中断的优先级并使能中断( N" H2 g+ ], m4 d

# [/ l! ?. c8 ]5 ]1 @: @8 \; }7 D1 k( G* u
赞 收藏 评论0 发布时间:2021-12-3 16:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版