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

【经验分享】STM32F207笔记

[复制链接]
STMCU小助手 发布时间:2021-12-3 16:00
STM32F207笔记
/********************************        NVIC        ***********************************/   
+ |- \3 s% r* P0 k" ]主要特征:( a0 i* t7 c( R# s/ I7 L
        拥有81个中断源        //不包括16个内部异常;标准M3可最多拥有240个中断源
/ A# X: z# U1 m# H        16级可编程优先级        //标准M3可最多拥有128级可编程优先级* m+ @- U3 L7 ~3 W) C2 ?
        优先级又被分为抢占优先级和亚优先级两段2 Q; z* L1 n4 [" M' u$ [
( Z9 E5 `/ g: \* X4 y' {
NVIC模块寄存器地址列表:                            //NVIC模块基址0xE000E100
- k+ Q  r* d% Q7 h$ U        地址偏移量        寄存器        . F* E3 ?# }2 _7 R
        0x000            NVIC_ISER0                //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)
; b: t. O& S, G) z3 |+ ^+ }8 P        0x004            NVIC_ISER19 u: T: g' W1 J: H- z3 F
        0x008            NVIC_ISER28 w* J  g# j0 y" i
        RESERVED
& I: r3 I8 l4 Z3 a        0x080            NVIC_ICER0! p  [$ z: @! v4 N+ k
        0x084            NVIC_ICER1; ], a! W# g; |1 z! {% M* M0 ?2 r0 B
        0x088            NVIC_ICER2
. ~4 N7 F4 u1 m4 k5 \6 b        RESERVED- q( h8 |+ [) Y# j
        0x100            NVIC_ISPR0                //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)* |7 }6 [$ |1 P% x9 f* r' k
        0x104            NVIC_ISPR1$ Z, k, ?7 H4 M4 \
        0x108            NVIC_ISPR2
9 w5 {/ [3 P( }- y) D+ D% t0 r        RESERVED
' ?$ r4 ~8 l  |1 V5 [/ a: d        0x180            NVIC_ICPR0
+ g/ C* y3 P# X* D4 O1 q        0x184            NVIC_ICPR1
' t1 O; B: \5 k  I6 s0 M1 H; p8 E        0x188            NVIC_ICPR0
& J3 @0 b/ Q4 ?& L- k$ J        RESERVED
3 a, U3 H" y- D' E8 Z/ f        0x200            NVIC_IABR0                //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)
0 r2 P+ m3 T& J4 {        0x204            NVIC_IABR1
9 o5 n1 t0 C6 m1 l7 p+ l; N        0x208            NVIC_IABR2
; O5 Z! F  S4 z( u# A' i; l        RESERVED
; k, h6 k& M; g5 F        0x300~0x320        NVIC_IPR0~NVIC_IPR80    //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个
( {4 l- F" }  s1 ^' k1个特例寄存器:
; X& U+ c8 |0 h3 l4 |        NVIC_STIR:软件触发中断寄存器                //地址:0xE000EF00,该功能需要在SCB->CCR中使能9 y1 Z' b: B8 D
                                                //用于触发外部中断,[7:0]位有效,对应0~239号中断
) m  [0 O6 C- H6 P: |6 V异常和中断优先级配置:
) t5 V8 c' \1 l0 K: g/ a# g% z        1. 除了NMI,其余异常和中断的优先级均可自由编程                            //标准M3还要除了复位、硬fault这两个异常& k- Y' N( O* w
        2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级:    //标准M3最少使用3位,MSB对齐7 l& @4 v! i) V3 y; k! D
            0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0" c8 t8 |+ h, [. Q
        3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM        . ]. e' t+ g5 b  ^9 R9 I
        4. 抢占优先级的方法即实现了中断嵌套机制
9 W; Y7 }0 \  j        5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占
: p. M: u" Q+ m; i8 Q4 j        6. 异常和中断优先级寄存器都可按字节读写
, l4 F1 z# M" [5 }8 {4 D4 Q) j( Y% Z        7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值
/ A: z8 R. |, {2 M        8. 不同中断源优先级可以设为相同!!!- v, k2 T5 Z4 P* A3 r

" W# P8 h, T, V) \0 N5 T# u
* O; C% Z5 d; O  x' f( a/********************************        SCB        ***********************************/
4 I9 \- t0 f! c6 pSCB模块寄存器地址列表:                            //SCB模块基址0xE000ED00
# a8 z  b7 v9 M2 q        地址偏移量        寄存器, s/ a8 y+ }$ [7 ^6 f5 ^2 H4 d
        0x00            SCB_CPUID                7 v. L1 F. k/ G
        0x04            SCB_ICSR                //中断控制及状态寄存器,主要用于悬起/解悬系统异常
* [* c  [, }; V' b( A        0x08            SCB_VTOR                //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)
/ F2 d2 O8 \( y8 K                                                //STM32F2默认值为0x08000000,正好对在ROM基址上# t& {  s  F6 C4 S1 K7 o
        0x0C            SCB_AIRCR                //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组* J% {& P8 k+ l. g5 D1 d# o7 ]
        0x10            SCB_SCR                    //系统控制寄存器,跟睡眠/唤醒相关6 p7 X3 x! F5 n7 ?% N5 T8 j* D
        0x14            SCB_CCR                    //配置和控制寄存器,主要跟异常响应相关
! s- y; q1 Q1 ~2 f, }1 \                                                //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制5 w6 V2 O3 ^7 P5 {8 c( J  R- ]3 m
        0x18            SCB_SHPR1                //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常( C9 I0 r5 `4 b. T& B" o
        0x1C            SCB_SHPR2               
  V3 [& F4 k, b! S        0x20            SCB_SHPR3
/ y- c2 P9 f9 r/ z& x4 O% N% @) D- t        0x24            SCB_SHCRS                //系统异常控制和状态寄存器,功能类似于NVIC_IABRn( H  S- m3 i  G6 M3 V! @
        0x28            SCB_CFSR                //以下几个暂时不管
' z* C8 I1 Q! z& E1 w        0x2C            SCB_HFSR
; q2 e' M+ U3 `* n5 {3 \7 I' L( ~4 p        0x34            SCB_MMAR
" a9 E3 b2 q. p2 D5 @        0x38            SCB_BFAR* q* _3 U' L- v

6 |/ l' q" B$ k8 C) A; z; j
4 Y( r9 G; B( f/********************************        特殊功能寄存器组        ***********************************/
! Q& z) u" Q6 h) }7 a7 A6 MCONTROL:控制寄存器
. D2 K: X& t' B* z/ R) _" F    仅当在特权级下操作时才允许写该寄存器 !!!* ~3 z2 S, m0 u& m1 M
        1. CONTROL[0]:     用于选择处理器模式为特权级/非特权级* `; S/ I9 B) L. D; s/ b
                        特权级非特权级切换流程如下:
  q' @9 \$ H3 Y                特权级——————————>非特权级———————————————————————————————————>特权级& H" V8 E6 p, r9 D5 B0 ]0 J* K0 s# k
                    CONTROL寄存器 |= 0x01        调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式,               
1 v7 B6 |9 W4 S* N' H% B+ n- t7 n0 Q: }                                                而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级    / w: ?( }! [6 ]- {
. Y, {  Z9 `2 m0 _5 e- y! B

" j; g2 Q2 B$ s2 c. _7 w        2. CONTROL[1]:     用于选择当前使用哪个堆栈指针
0 b1 l$ R- w( q; F+ v+ {                        仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效   
0 j, X3 }1 K- f5 D                        MSP/PSP切换流程如下:- Z+ k4 X: K: x/ h7 `& [" P' m
                        MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————>    MSP(特权级、线程模式)                                                                        
' X. z; b# ?" m6 B  W5 p. f                                            线程模式下操作CONTROL[1]            /         \        线程模式下操作CONTROL[1]
( A2 [1 ~! e$ i6 r) R                                                                             /         \    ; i6 I# ~) i: L3 N1 D" P
                                                            操作CONTROL[0]/                \触发中断/异常
, v. [- j# M( P% ~5 S                                                                         /                  \
* i7 R4 e9 K7 [0 p/ d                                                        PSP(非特权级、线程模式)          MSP(特权级、handler模式)9 h8 I3 q8 G: Q. V" U
                                                                         /                 \$ `2 t) R. w- Z- n" g& S
                                     调用SVC,在handler下改写CONTROL[0]/                      \    中断/异常返回% i0 @: E6 W/ h  Q3 t% x4 `
                                                                       /                       \
3 t% y% u2 f% T3 X        MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式)          PSP(特权级、线程模式)    ————————————>    MSP(特权级、线程模式)   
' I6 H4 ^4 ^0 T" T                              线程模式下操作CONTROL[1]                                                  线程模式下操作CONTROL[1]
: z/ j) `5 R; N' m3 j9 \# G5 A% C3 m# l
操作模式总结:; J1 r' C1 G+ X4 a
        1. 复位后处理器进入线程模式+特权级
3 ~' M4 p2 S4 }$ D# Y        2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)+ k8 [; P6 Y. ^1 k: _  W6 }

' l, I% _: p$ g3 K/ Y3 ~! w7 J) ?* \  [5 t
/********************************        Flash        ***********************************/
5 t2 `1 O$ V; T% ]$ Q. P3 r主要特征:
& v4 L2 H) y' W, l. F: ~        1. 1Mbyte容量
3 h; F  v7 a" c/ c( \" e: v        2. 128bits位宽读取
- ^+ y1 _7 t, Y( T% v        3. 字节、半字、字、双字写入, B  y9 x% q0 a" ~3 b9 Z# C
        4. 可按扇区/块擦除3 n" v3 ^( S( n7 b1 Y
        5. 存储区块架构:
! Z2 A7 U! L6 D% [                    主存储区:     扇区        基址                尺寸
/ b1 Q8 g* X" j4 p                                Sector0        0x08000000        16kbytes
! I' ~0 ^" n7 a                                Sector1        0x08004000        16kbytes
  C$ b; p4 e2 |  w! v                                Sector2        0x08008000        16kbytes2 |2 ]' n( K$ O  [9 G, g; t2 U1 n
                                Sector3        0x0800C000        16kbytes7 J, ]: e2 Y. _2 Y4 A- p9 q: U
                                Sector4        0x08010000        64kbytes9 Z7 M* ~* ^, s( U" b, _
                                Sector5        0x08020000        128kbytes
1 I4 d% A0 w; _1 v4 m1 \$ A) F                                Sector6        0x08040000        128kbytes0 i' a6 u$ |' A- z/ j$ W7 n6 f+ B
                                Sector7        0x08060000        128kbytes
) x7 m$ A) G. ^8 J1 J0 o                                Sector8        0x08080000        128kbytes
; y8 q; }! `, B/ P9 k; A                                Sector9        0x080A0000        128kbytes+ f* l% }9 q$ }6 R! Z. x4 E
                                Sector10    0x080C0000        128kbytes
( f9 G5 A; T- U, k  \7 N. i                                Sector11    0x080E0000        128kbytes        
1 Y+ w& i6 z8 t7 i# t                    系统存储区:                0x1FFF0000        30kbytes
' X9 s$ B: n6 \1 N8 a. ?2 i% ?! B                    一次性编程区:            0x1FFF7800        528bytes
$ X9 f! u6 E4 m                    Flash配置字节:            0x1FFFC000        16bytes1 j$ F, M, r7 W( n+ T; o

. X6 s8 s! w. y4 v  ECPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。. i- _. J; a9 c0 I
                          复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。
( O: ~4 g; X  n/ F/ s: t                          更改时钟频率的标准顺序:
. h* D# r) i1 X) c3 Z                                          1. 增加时钟频率:
8 _0 q) v; A3 `. C% e9 f                                                  修改FLASH_ACR寄存器中的延时位LATENCY1 Q+ }/ p# c- L7 Z1 O9 P) |4 L* v
                                                  确认延时是否修改成功/ F! R$ B- k7 v# E- E: d. S
                                                  修改时钟源/预分频
; T% Y9 v2 f' n$ O                                                  确认是否修改成功(看RCC_CFGR中SWS标志位)
' B  i2 A( e7 \9 c3 J: W7 |                                          2. 减小时钟频率:
, P* _3 d' b9 q: P% ]* E% b/ s9 w                                                  修改时钟源/预分频
# h0 u! f/ b: e" f2 b/ J& O  y% L                                                  修改延时位LATENCY, W8 X) h# {# ]8 [
                                                  确认延时是否修改成功% n5 r( @. |1 _- o. j5 ~3 I' h

: J6 b2 N' n, Z; }FLASH寄存器:
  T$ L" J- L& `* h0 V8 B8 c        FLASH_ACR:        FLASH访问控制寄存器    //用于设置访问延时
% c2 Y& e  h6 D+ I" T        FLASH_KEYR:        密钥寄存器            //用于FLASH解锁
2 |( E, y3 {1 a" Z* H/ o0 V        FLASH_OPTKEYR:    配置字节密钥寄存器% h5 V1 B9 v3 m; V9 L, l
        FLASH_SR:        FLASH状态寄存器        //FLASH相关标志位. d. U) Z# a/ ^4 j+ G5 o
        FLASH_CR:        FLASH控制寄存器        //FLASH上锁、编程设置
- u1 S% Y# g& m6 W        FLASH_OPTCR:    配置字节控制寄存器" X4 _$ r) D5 |% r: ?" p

5 D. b6 s. U! l& E: D$ {8 QFLASH操作:0 Y4 m+ c3 \0 I2 @- b  A4 L
        1. 解锁/上锁   
0 F8 E" L5 y/ `1 X            对FLASH进行任何编程操作前都必须先进行解锁;  `1 V( d9 B+ t
            完成FLASH编程后建议上锁" n1 Z9 B5 A- R0 F& t* `9 d3 A# s9 F
        2. 写入单位设置
- n4 U& H8 A- A- K" u            写入单位跟供电电压和Vpp有关,详见RM手册" m2 Q$ y4 P6 l) x- X, H3 e2 h. w
            此设置必须在任何擦除/编程操作前进行
) t1 i5 \: A7 M        3. 擦除" t% B5 [% R- W7 ], |: A$ M6 m
            扇擦除:
5 h' H, _: m5 J                擦除前确认当前无FLASH操作
3 ^2 Z% ], Q& C1 R/ a                扇擦除位使能、选择擦除扇区
! d1 S: Q! K' P' Z( X( h                开始擦除5 G# ?+ a+ ]! R7 I; X
                等待擦除完毕% N% |  Q% c1 W2 O; @2 y
            整块擦除:
: M* h/ C, j7 z$ q: E                擦除前确认当前无FLASH操作
8 `; J; J# `9 h8 ]                块擦除位使能3 ~2 Y* ^( f6 }
                开始擦除) B7 ^+ L% Y9 `* J+ u: U- w
                等待擦除完毕        
  s: M' E1 i1 _# p/ g) Z# N' {        4. 写入
  k* F0 M. I3 s( d2 Z; K! a# O            写入前确认当前FLASH无操作$ `5 K  [( w! C; \7 c) t
            写入位使能
3 A7 }) n- W6 S0 i8 ~: @& g            根据写入单位设置执行写入
6 Y0 ^0 f; |9 O; |! H; j            等待写入完毕
. L  u+ M" ~7 H$ F% q4 b. W7 I6 d- n% s3 X

& o. w! ]1 E0 R5 J4 s! {( g
" n- I& O9 s' {  d! d3 X/********************************        EXTI        ***********************************/
$ h" r2 s3 ^4 Q主要特征:0 [! h5 l+ t$ o8 Z: a
        拥有23个边沿检测中断/事件控制器                    //该模块类似于I/O中断
- o+ X3 x& J  v8 o5 s6 d! i        可以检测脉冲宽度低于APB2时钟宽度的外部信号1 l2 e; j- G! }3 s

4 t3 A( |8 s2 p! JEXTI寄存器:
- T4 c  i, P4 l        EXTI_IMR:     中断屏蔽寄存器: F7 z! O- t: o* c
        EXTI_EMR:     事件屏蔽寄存器
: b: M5 ^. H- L: G        EXTI_RTSR:    上升沿触发选择寄存器$ A; X9 K% ~6 k2 }# L
        EXTI_FTSR:    下降沿触发选择寄存器# S+ C" J& b' ~' I
        EXTI_SWIER:    软件中断事件寄存器0 ~& h- r2 U; ?% k) W" K
        EXTI_PR:    挂起寄存器
( d7 |' i9 P) E$ i9 d. q3 I6 B9 x, A( F8 a1 ^
初始化流程:& g' I3 u6 }% K0 J, z) E: |$ D" X
        1. 使能GPIOx端口时钟
. K- ~5 t1 C: I8 `# W        2. 使能SYSCFG模块时钟6 i% `7 g! t, x; G+ ^& O  a
        3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉). {7 D" g% H4 S" n* E3 k# C% Y
        4. 将EXTI的n号中断线跟管脚n相连( J* }4 M/ p2 m# o+ u5 C( v/ k
        5. 配置EXTI的n号中断线
# q% l4 ^2 w) D/ ^% o8 J6 I2 u9 [& C        6. 配置EXTI的n号中断的优先级并使能中断
. g+ |6 y. y' ?' W
, n7 k2 o- V4 V+ e" A" r% L/ D  T2 w" i0 _  }. O# K
收藏 评论0 发布时间:2021-12-3 16:00

举报

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