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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/    . k" j0 Q& r- T/ N
主要特征:
! w7 _/ [6 ^3 S& Q( T, Z        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源8 b( G- Y1 [/ ~% b" W9 v
        16级可编程优先级        //标准M3可最多拥有128级可编程优先级  _" g3 H% \% z! P0 K" V/ B
        优先级又被分为抢占优先级和亚优先级两段
4 d, f) }- P. J
8 \! {2 j7 B" K8 NNVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E100
# V6 o4 Y% x. y) |( m        地址偏移量        寄存器        
3 _* T5 z7 ~' U2 w1 M        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)
+ s6 }" F) b. j3 \9 `/ t. x# e        0x004            NVIC_ISER1
0 P* A* m# m; e$ C        0x008            NVIC_ISER2
) S8 T5 x4 Z2 Z5 v" e1 G0 H1 s        RESERVED, x- ]' B6 f( g0 D7 K
        0x080            NVIC_ICER0
' @$ `) E) A' k- ]  M        0x084            NVIC_ICER1
4 w; Y2 o* s" J% x4 i        0x088            NVIC_ICER2
8 F8 _, M3 Z- d6 c        RESERVED1 v0 N% x+ V+ J
        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)7 r2 M; j9 j5 E1 R
        0x104            NVIC_ISPR1% |7 h  u4 Y' [) q. L7 R
        0x108            NVIC_ISPR24 \- l, H. d" e7 B
        RESERVED6 j) Y7 ]: m- j
        0x180            NVIC_ICPR0# |5 A- o& q! j
        0x184            NVIC_ICPR1# `. b3 W" X4 Q7 ~, ~
        0x188            NVIC_ICPR0  Z7 ]% |/ Y. t) ~$ {9 \. _
        RESERVED7 t7 M3 Q, b9 M5 Y2 s5 K* f/ O
        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)
; S+ y" R4 s. E4 ]        0x204            NVIC_IABR1
: c7 }/ D6 U. [) |  g/ H# B: _1 V; J5 G        0x208            NVIC_IABR2! k5 t8 f' b3 k8 s, V  j" f
        RESERVED$ N+ @6 f. K/ N' _  `; K
        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个
- V- ^5 y5 ]9 l# x& u1个特例寄存器:4 t1 J( Q" G$ ?5 @2 v4 R
        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能
) l) ?, G- R! [3 Z                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断6 ^7 c0 l7 H- \/ C1 M, [; V) o
异常和中断优先级配置:3 f: R0 q% l% n$ \* f
        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常$ Z4 R, t- {% C! D& w2 j, K
        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐; m8 H; E" g8 X2 X! A
            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0/ o4 F% b/ G0 K+ D% B2 J# W7 h
        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM        
% P8 B9 g2 h$ B        4. 抢占优先级的方法即实现了中断嵌套机制1 _/ l" _9 s! d  V
        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占4 e" I1 y# M" e  Q- u
        6. 异常和中断优先级寄存器都可按字节读写
8 u; d! G* u, d; @9 ^        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值
; v% A+ f2 s4 |) |5 c1 Q        8. 不同中断源优先级可以设为相同!!!
2 U8 k8 y: a/ S
) z2 |8 V, s3 ?% S3 O
  m+ e$ n* x) \; T& L' H1 C2 S/********************************        SCB        ***********************************/) H5 K& o' L$ d% `2 m1 |) T+ ^. \' Z
SCB模块寄存器地址列表:                            //SCB模块基址0xE000ED00$ G+ x, h+ W' A# ?! J
        地址偏移量        寄存器7 ^; a9 S, W1 s- T+ d
        0x00            SCB_CPUID                ; ^5 Z, M. E, D/ R, F" F, D
        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常* ]4 n# l0 D' C8 q
        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)6 `' z" Q, d5 d( |. e& c& R
                                                //STM32F2默认值为0x08000000,正好对在ROM基址上
; g0 W7 W1 `, Q$ s        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组( `: T  c, {' \( _, E+ b5 M  d% g
        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关, D/ [, r6 o- W. g
        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关
0 H) J, t- L. r8 F, b* G  _                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制
: Z) J+ B2 c, ^( @. R! o% I        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常
' L8 N# j+ l% t# p' o        0x1C            SCB_SHPR2               
- C) U0 p, s" f) Q        0x20            SCB_SHPR30 N- _5 H; w* V3 R5 J: X
        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn
" m8 ]( W7 D4 |& z/ K        0x28            SCB_CFSR                //以下几个暂时不管. w4 Q, W6 u! T+ X6 C" J) Q. I* u9 f
        0x2C            SCB_HFSR
3 P) E7 u' }5 G  ?        0x34            SCB_MMAR9 h' Z9 g  |! W6 l* z; I" P
        0x38            SCB_BFAR. I' a+ V* r: ?0 O  _' J7 _* \" }

" a$ J/ \/ @& H: D/ k  f
; M, K6 w2 g1 e, _/********************************        特殊功能寄存器组        ***********************************/' e+ H1 C$ q' R. o, {
CONTROL:控制寄存器7 l- O- _! l$ G. m1 M6 o
    仅当在特权级下操作时才允许写该寄存器 !!!7 r. T9 M& y( r+ [
        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级4 a" o# ?/ u& J* [2 ]5 o- x6 R
                        特权级非特权级切换流程如下:
$ {* o' ?7 N) z- F% V. L                特权级——————————>非特权级———————————————————————————————————>特权级# J; b' l( M# \) ?
                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,                - K+ ^5 _- f- Z
                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级   
4 G* }+ ]+ P+ ?. l5 K% k9 |, R
; d1 Q5 H! X- L2 r3 [8 R; q' U8 j/ b( @2 H( l! |7 T
        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针
% H1 ]) [7 E1 f! d                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效      t6 L3 _. ]1 Q9 O: t/ A2 m
                        MSP/PSP切换流程如下:6 d$ [$ `$ }  J: j  m2 ]* f1 }. I
                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        
. w- W" j$ F; h+ w6 d6 ~' C) o                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]6 d: W% F# {, u9 g1 U9 y$ S
                                                                             /         \   
4 f5 N: d  u4 [: ~9 R4 a! T                                                            操作CONTROL[0]/                \触发中断/异常7 f: z0 z: ^4 C9 s( `
                                                                         /                  \
& D4 e8 `/ v+ q" L6 g                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)/ v1 ]3 d0 _7 j& F+ M4 S0 y
                                                                         /                 \* }4 V2 j# _) c$ `3 n1 K
                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回
# }2 \' E1 w/ U% u                                                                       /                       \
" v* d" |* Y4 e5 E, k        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)   " C$ {# g5 T& Y, c3 @: H8 R
                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1]
, a7 V0 r) q- V, ]9 y6 F! b
4 R6 ]  o( K5 D# D操作模式总结:7 x6 I! v. `, }
        1. 复位后处理器进入线程模式+特权级8 J* R' a: S0 @) N3 w5 N
        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)
( g0 _1 `7 B! P/ p( Y  n" O0 K$ K: l3 E: J

5 `3 W! q! ]9 [! y; g* H/ o/********************************        Flash        ***********************************/
: h0 \1 H! {4 l  X5 s. [% e主要特征:
. `9 ~  B( h# T5 ]  U        1. 1Mbyte容量8 G3 Z- [* P0 c" |6 g4 _
        2. 128bits位宽读取1 b1 X+ U, j) c. F. N# L
        3. 字节、半字、字、双字写入2 Y: F* _+ j) Q
        4. 可按扇区/块擦除5 p2 g1 d. a$ [" n8 |( N$ `
        5. 存储区块架构:
! ^% |& T1 S) ~2 ^: P! P                    主存储区:     扇区        基址                尺寸4 U# K$ W& ?( p
                                Sector0        0x08000000        16kbytes8 t) q2 L6 A: @
                                Sector1        0x08004000        16kbytes: x; a* H* ~- @. M/ Z- w4 d: z! A. o
                                Sector2        0x08008000        16kbytes6 t5 [8 ~/ Z, W$ D3 v8 R, g0 P" N
                                Sector3        0x0800C000        16kbytes+ r. D# l% R# p3 M
                                Sector4        0x08010000        64kbytes
/ I$ Q1 z: @6 N6 Y% v3 o% p5 s                                Sector5        0x08020000        128kbytes
/ M+ m* W8 q; @( G                                Sector6        0x08040000        128kbytes+ k* X% N; H) I1 T2 M4 a. m/ \
                                Sector7        0x08060000        128kbytes
. q* Q; d, \4 x' T" o0 g$ b                                Sector8        0x08080000        128kbytes9 W$ o( Z9 W1 d2 m
                                Sector9        0x080A0000        128kbytes
& @, ~. P) W+ g! u8 g( s8 x                                Sector10    0x080C0000        128kbytes4 T& ^0 @! m7 W  b
                                Sector11    0x080E0000        128kbytes        : C* `: p: X% W
                    系统存储区:                0x1FFF0000        30kbytes% j+ C6 W* ?: B/ @, j( v
                    一次性编程区:            0x1FFF7800        528bytes# |. h4 t+ U6 g  r; h: R8 X1 X
                    Flash配置字节:            0x1FFFC000        16bytes
2 I; I5 }! `1 w, r5 t, S
, y- i: y4 l/ j5 s0 i  |& e7 _* VCPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。4 [2 l7 i" e" F& h7 I4 U
                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。" W7 B% M4 M9 @9 V3 j0 b
                          更改时钟频率的标准顺序:
9 Y1 u- o- x+ Z0 Q$ ]  t                                          1. 增加时钟频率:
9 N) J$ t- D- z) u% L5 u( c                                                  修改FLASH_ACR寄存器中的延时位LATENCY  p. x4 G: H; K( n
                                                  确认延时是否修改成功- r0 A8 g, i" p. C5 y! s7 L
                                                  修改时钟源/预分频% r6 {- d$ g. T/ k1 K, U
                                                  确认是否修改成功(看RCC_CFGR中SWS标志位). @/ @  z6 `4 R8 Q9 x; ~
                                          2. 减小时钟频率:
0 u9 ~, ^) p( Y8 f                                                  修改时钟源/预分频
: q' s$ B& a8 i& v. \1 u! P2 i" e                                                  修改延时位LATENCY' @% q! f9 M& W0 ^
                                                  确认延时是否修改成功! @  s$ P; J- c9 v; ~5 u0 O4 e

7 p* j3 [) X" [! X+ N4 v9 r* rFLASH寄存器:
; Z( s8 x0 y; `9 }        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时: [; l7 k$ G+ \
        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁
; @+ j2 B% l3 p8 \        FLASH_OPTKEYR:    配置字节密钥寄存器  M) y" F$ f; i% H4 j; \7 B  S9 u
        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位
+ u; o6 }9 @9 B* [        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置
0 s0 \: x! \9 q: @. h! N7 d        FLASH_OPTCR:    配置字节控制寄存器
& g! k- R5 `1 n6 P4 B5 m! o
/ O4 y& L- d$ x- h1 tFLASH操作:
6 R) ~& q3 j- k5 M7 J# M- S        1. 解锁/上锁    . {* b( T  z7 u5 p0 @1 j4 H9 J
            对FLASH进行任何编程操作前都必须先进行解锁;. `& D. M& s$ A" f9 M! [0 G, V
            完成FLASH编程后建议上锁6 J) U- f9 M  _% J
        2. 写入单位设置* Z7 S% P6 J3 e( C! o$ {
            写入单位跟供电电压和Vpp有关,详见RM手册1 I, F2 N# O. g! [( E
            此设置必须在任何擦除/编程操作前进行# [( z' e: m* T2 V2 u: M) Q
        3. 擦除7 R  c8 {1 O  ~2 i4 J- K- S
            扇擦除:, L" o4 R/ g# z! |
                擦除前确认当前无FLASH操作
& U5 E& q$ }7 _+ x3 @                扇擦除位使能、选择擦除扇区
# h/ q$ Z, v" D1 k4 E                开始擦除/ J1 C8 c( F/ ]1 {4 g; K) z
                等待擦除完毕  \$ v  ?: }( s& X/ H
            整块擦除:
. r, [' S7 F# e* c$ h* [5 q9 M                擦除前确认当前无FLASH操作- l8 B' S+ I' W, P0 H; k# B/ P
                块擦除位使能
( d" B. V- b: Z1 o: B/ X& S" C4 `                开始擦除# M" K/ g  N2 _3 [: n6 j) D
                等待擦除完毕        9 }0 U8 E# W: T3 l7 _* i0 r" G
        4. 写入
! F/ Q1 V% }) M            写入前确认当前FLASH无操作
9 g, o) Q8 F7 c+ m+ U1 _) z            写入位使能
: ?, b! {' I  a% I. A: \            根据写入单位设置执行写入
9 F: o8 J: J( r' O            等待写入完毕
: X8 J- [0 P* t) Y9 `6 S( W6 w, N3 H/ a* u' P; ]2 c" {) o. K6 {( B4 ]
" t1 `5 Y; \" c+ ?- j# _4 V2 q" c

/ G/ M. I' [7 R" d/********************************        EXTI        ***********************************/
: B! u8 P- m: p6 B主要特征:4 t; u! f' w! z5 o
        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断
. |% U; {6 g# N        可以检测脉冲宽度低于APB2时钟宽度的外部信号9 W2 J9 ?9 O/ `) ^, \4 I

( i) i7 I! k7 @0 ^4 M2 aEXTI寄存器:
+ K8 j! L0 M) _4 d        EXTI_IMR:     中断屏蔽寄存器
8 q' I% A+ j/ K" g3 n2 J        EXTI_EMR:     事件屏蔽寄存器
" f! N1 P9 I3 o2 d0 y) i; z% Q8 F        EXTI_RTSR:    上升沿触发选择寄存器
  F& J' E5 l' Q! q' @$ h        EXTI_FTSR:    下降沿触发选择寄存器! b) r# `/ N9 n* A
        EXTI_SWIER:    软件中断事件寄存器
. z# A+ g2 E" k        EXTI_PR:    挂起寄存器/ X( y5 a# e. y) h% Z

, o3 L! n) G2 J* b: [/ _初始化流程:
7 [0 B3 e" D& l% q+ y2 T% r7 t+ c        1. 使能GPIOx端口时钟/ E5 [! Q$ l: `2 v6 k  M, ?% p5 t; @
        2. 使能SYSCFG模块时钟+ `( u) }+ F2 C7 \
        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉): j3 f" x/ P1 }# c% m) l# D' Q
        4. 将EXTI的n号中断线跟管脚n相连1 c& _8 ]+ V- O/ J, H5 c! h. G- x
        5. 配置EXTI的n号中断线1 {9 y0 R! T0 M, }
        6. 配置EXTI的n号中断的优先级并使能中断' H2 A" z. G$ R4 g" e- P
1 N, L$ J) m1 m3 }- B; ]# c
1 `6 E, v' }6 ^
收藏 评论0 发布时间:2021-12-3 16:00

举报

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