STM32F207笔记 /******************************** NVIC ***********************************/ 主要特征: 拥有81个中断源 //不包括16个内部异常;标准M3可最多拥有240个中断源 16级可编程优先级 //标准M3可最多拥有128级可编程优先级6 c9 |2 u4 o z. [/ w* f' @ 优先级又被分为抢占优先级和亚优先级两段 NVIC模块寄存器地址列表: //NVIC模块基址0xE000E100% t% } g; P" j1 G7 H 地址偏移量 寄存器 ; ?: F8 ~2 M; o+ q 0x000 NVIC_ISER0 //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满): I- s1 ~% i& M0 t- s0 i 0x004 NVIC_ISER1 0x008 NVIC_ISER2( }! ]& r6 }9 u RESERVED( R( N, H1 I! F# [% |7 l& G 0x080 NVIC_ICER0 0x084 NVIC_ICER1" j$ V. C5 h1 `/ b 0x088 NVIC_ICER2( @1 ~: ?. P% m# _/ j* P+ j5 M RESERVED. `+ T4 y9 {0 J4 q) F( b( k( R 0x100 NVIC_ISPR0 //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)* p1 Q! o' ?: X6 E 0x104 NVIC_ISPR1 0x108 NVIC_ISPR2" c9 r% r$ m. K7 Q" u RESERVED' Q. k& P" ~. ?/ r0 `$ K 0x180 NVIC_ICPR0 0x184 NVIC_ICPR1 0x188 NVIC_ICPR0/ {9 `( h. T* M `8 Y h RESERVED; G1 E' G5 w0 l# K) u( B( _ 0x200 NVIC_IABR0 //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满) 0x204 NVIC_IABR1+ Z' ^! v' M B1 t/ y 0x208 NVIC_IABR2 RESERVED 0x300~0x320 NVIC_IPR0~NVIC_IPR80 //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个/ p! s% w5 |. r/ j* v6 i, @! _ 1个特例寄存器:3 }; o6 ]% e7 R. A& ~ NVIC_STIR:软件触发中断寄存器 //地址:0xE000EF00,该功能需要在SCB->CCR中使能- j7 w9 v+ w7 f% w2 m L //用于触发外部中断,[7:0]位有效,对应0~239号中断 异常和中断优先级配置:* M/ C8 n) X% k: b3 }) Z3 a! Z 1. 除了NMI,其余异常和中断的优先级均可自由编程 //标准M3还要除了复位、硬fault这两个异常) {' N1 R+ w- c% Z 2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级: //标准M3最少使用3位,MSB对齐 0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0 3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM U' G- q' F& [: j- \ t' L$ Y 4. 抢占优先级的方法即实现了中断嵌套机制 5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占 6. 异常和中断优先级寄存器都可按字节读写" w' l7 |# p! k" H6 t 7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值: C4 @# f* i% c5 Y4 _. S, d 8. 不同中断源优先级可以设为相同!!! m2 X; P; \, _* V4 b5 z6 S' V. F /******************************** SCB ***********************************/ SCB模块寄存器地址列表: //SCB模块基址0xE000ED00! d! v4 a4 j( R, p 地址偏移量 寄存器+ }0 }. j3 x% _( n6 k, Z: P 0x00 SCB_CPUID 0x04 SCB_ICSR //中断控制及状态寄存器,主要用于悬起/解悬系统异常" G: e: [; k8 Y8 I1 | 0x08 SCB_VTOR //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)- `# {9 S+ n Z. X# ` //STM32F2默认值为0x08000000,正好对在ROM基址上+ `4 v7 E# \% E# D; K/ O5 [- |& d 0x0C SCB_AIRCR //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组- o0 E; u( |$ [: Q8 d4 w 0x10 SCB_SCR //系统控制寄存器,跟睡眠/唤醒相关& ^! c$ S5 O# M& b+ N( F. J* E8 u0 Z2 U 0x14 SCB_CCR //配置和控制寄存器,主要跟异常响应相关% c: |4 Y! n' u$ }$ h6 R3 I: K7 } //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制8 \: j( O8 h: U$ ^4 u 0x18 SCB_SHPR1 //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常* s4 y9 {! l; \2 {3 w6 d 0x1C SCB_SHPR2 0x20 SCB_SHPR3 0x24 SCB_SHCRS //系统异常控制和状态寄存器,功能类似于NVIC_IABRn 0x28 SCB_CFSR //以下几个暂时不管- }( }1 G/ z; f$ T 0x2C SCB_HFSR 0x34 SCB_MMAR 0x38 SCB_BFAR & q+ h7 ~$ c1 P [, N' n) o , L/ @1 y* g3 N+ l% C6 i/ x /******************************** 特殊功能寄存器组 ***********************************/' ], Z; H5 I6 M6 S) o) k CONTROL:控制寄存器 v* q7 P! J/ m( X' q, U2 A' c 仅当在特权级下操作时才允许写该寄存器 !!! 1. CONTROL[0]: 用于选择处理器模式为特权级/非特权级 特权级非特权级切换流程如下:' ?5 N2 @2 M6 A% f0 Y' J3 ]* q- }* W 特权级——————————>非特权级———————————————————————————————————>特权级2 K$ ?$ V, \/ R5 K+ m+ ~, C j4 C CONTROL寄存器 |= 0x01 调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式, G8 E8 w5 Q8 A8 |. Y" A# T 而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级 ' L6 d& O2 M |6 G) V1 h- K, a - ] k' u `$ ]" e* v' S 2. CONTROL[1]: 用于选择当前使用哪个堆栈指针 仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效 % A* x" O5 ?3 A. N2 J% q MSP/PSP切换流程如下:) F* Y/ o$ R* Y* Y' V MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] / \ 线程模式下操作CONTROL[1] / \ 操作CONTROL[0]/ \触发中断/异常 / \+ q; x8 x' ^' Y/ e. e PSP(非特权级、线程模式) MSP(特权级、handler模式)8 C9 ?6 Z3 `/ ^; j0 h' u r / \ 调用SVC,在handler下改写CONTROL[0]/ \ 中断/异常返回 / \$ M1 Q+ f- J6 T& l9 ? MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式) PSP(特权级、线程模式) ————————————> MSP(特权级、线程模式) ' ^, Q2 u3 j* r1 ~( V+ ?- @ 线程模式下操作CONTROL[1] 线程模式下操作CONTROL[1] : `( |+ ~& G4 X- e 操作模式总结:% `- u% }! G$ ^. y 1. 复位后处理器进入线程模式+特权级 2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)6 q9 ]. i1 s" B2 {7 w4 { /******************************** Flash ***********************************/, u! P: t, C% _' N) w N) W6 E 主要特征: 1. 1Mbyte容量: M9 Z8 j8 s! }" v 2. 128bits位宽读取 3. 字节、半字、字、双字写入 4. 可按扇区/块擦除 5. 存储区块架构: 主存储区: 扇区 基址 尺寸 Sector0 0x08000000 16kbytes0 F% g9 u' |; O8 G7 N7 ^* V$ a Sector1 0x08004000 16kbytes$ Q1 q' A+ e% k7 i Sector2 0x08008000 16kbytes Sector3 0x0800C000 16kbytes Sector4 0x08010000 64kbytes) P/ x% h/ k7 U Sector5 0x08020000 128kbytes/ c. D7 a* W& p% p& o Sector6 0x08040000 128kbytes Sector7 0x08060000 128kbytes Sector8 0x08080000 128kbytes Sector9 0x080A0000 128kbytes; }8 U, P1 F& c. W1 p+ z* z- m0 U Sector10 0x080C0000 128kbytes9 X+ P, ?& J/ l- y Sector11 0x080E0000 128kbytes 7 R; J9 m( @9 V: v2 R8 E0 l7 ^3 E 系统存储区: 0x1FFF0000 30kbytes 一次性编程区: 0x1FFF7800 528bytes Flash配置字节: 0x1FFFC000 16bytes CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。 复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。 更改时钟频率的标准顺序: 1. 增加时钟频率:; [0 l4 P! L+ O4 V l 修改FLASH_ACR寄存器中的延时位LATENCY 确认延时是否修改成功 修改时钟源/预分频" O: u$ e5 K1 |- u7 n7 A+ ~ 确认是否修改成功(看RCC_CFGR中SWS标志位) 2. 减小时钟频率: 修改时钟源/预分频& ^) j2 D6 {: h6 |$ F$ ]) I 修改延时位LATENCY) l% E, o7 V% V0 C 确认延时是否修改成功 FLASH寄存器: FLASH_ACR: FLASH访问控制寄存器 //用于设置访问延时 FLASH_KEYR: 密钥寄存器 //用于FLASH解锁 FLASH_OPTKEYR: 配置字节密钥寄存器 FLASH_SR: FLASH状态寄存器 //FLASH相关标志位 ]6 B3 s: X# x# Z, Q/ G. W FLASH_CR: FLASH控制寄存器 //FLASH上锁、编程设置 g, ^- F* J/ C7 D* L/ T9 ~ FLASH_OPTCR: 配置字节控制寄存器 . ?, Z! W3 ?( Y+ o FLASH操作:7 E& h% j4 H* g3 G 1. 解锁/上锁 对FLASH进行任何编程操作前都必须先进行解锁;0 o" h( a/ }9 H* k5 b 完成FLASH编程后建议上锁6 E0 A# L" y$ h8 o+ k! e& |' ~ 2. 写入单位设置7 p5 @5 m$ {. h 写入单位跟供电电压和Vpp有关,详见RM手册 此设置必须在任何擦除/编程操作前进行5 ~0 v% \+ K0 ]7 p) h- v" Q 3. 擦除 扇擦除:" P" j4 y& s2 F1 K5 h 擦除前确认当前无FLASH操作( s, y* I% f0 {9 k% j6 B1 s4 d 扇擦除位使能、选择擦除扇区 开始擦除" j9 }# d( Y, C, g' ^ 等待擦除完毕 整块擦除: 擦除前确认当前无FLASH操作 块擦除位使能% Y( {8 a5 r; l 开始擦除; O0 o6 M( S/ X4 u/ g 等待擦除完毕 # w7 L" i7 O' G4 {6 c; g4 \ 4. 写入# A% w1 H( h, Z% n. z5 s& T 写入前确认当前FLASH无操作 写入位使能 根据写入单位设置执行写入 等待写入完毕 2 d- q0 W9 S1 f$ T3 E# Y $ S% h& P/ B, r t3 C' Y /******************************** EXTI ***********************************/ k/ [7 ^0 s4 Z3 e6 H7 U8 c! z 主要特征:8 ?9 D* l: s- ]3 x$ y* ` 拥有23个边沿检测中断/事件控制器 //该模块类似于I/O中断 可以检测脉冲宽度低于APB2时钟宽度的外部信号 EXTI寄存器:+ _0 i( d% n* e8 S EXTI_IMR: 中断屏蔽寄存器5 p/ T: v; z$ p& M! F EXTI_EMR: 事件屏蔽寄存器/ U4 ^; z2 g. ~/ X' R. r" m EXTI_RTSR: 上升沿触发选择寄存器/ C7 s# ?+ S p/ p3 v. v, Y5 { EXTI_FTSR: 下降沿触发选择寄存器 EXTI_SWIER: 软件中断事件寄存器* R7 \9 j2 ?) j( v- z+ o EXTI_PR: 挂起寄存器% d1 ~& ]0 g3 O8 B! r/ T! \& b4 w% } 初始化流程:4 H1 T2 D+ J" d7 N0 v& q 1. 使能GPIOx端口时钟 2. 使能SYSCFG模块时钟 3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)# l `" @( W1 `: K, G t- V 4. 将EXTI的n号中断线跟管脚n相连1 h% p8 i7 A) D; w |( `+ Z! X 5. 配置EXTI的n号中断线) R% p) c' m Z$ t: K7 R" \ 6. 配置EXTI的n号中断的优先级并使能中断 |
stm32f207/stm32f407擦除内部flash讲解
【经验分享】STM32F2 中 DMA 的 FIFO 模式
STM32F2x7 通过以太网实现在应用中编程 (IAP)
STM32F2xx 微控制器中的 EEPROM 模拟
在 STM32 F0、 F2、 F3、 F4 和 L1 系列MCU 中使用硬件实时时钟 (RTC)
STM32F1xx、STM32F2xx、STM32F4xx、STM32L1xx、STM32F30/31/37/38x 定时器概览
使用 STM32F2xx 和 STM32F4xx 微控制器时如何提高 ADC 测量精度
使用 STM32F2 和 STM32F4 DMA 控制器
STM32F2x7 通过以太网实现在应用中编程 (IAP)
STM32F2xx 微控制器中的 EEPROM 模拟