STM32F207笔记 /******************************** NVIC ***********************************/ 主要特征: 拥有81个中断源 //不包括16个内部异常;标准M3可最多拥有240个中断源/ U& z# a8 e0 S) z v# X 16级可编程优先级 //标准M3可最多拥有128级可编程优先级 优先级又被分为抢占优先级和亚优先级两段 NVIC模块寄存器地址列表: //NVIC模块基址0xE000E100& o2 l. @( A, a3 o2 H0 n% |5 W! @ 地址偏移量 寄存器 0 V: X0 R" l u7 _, Z' Y2 W 0x000 NVIC_ISER0 //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)* L6 i, J7 M* D% ] 0x004 NVIC_ISER19 {, }+ @3 e, @8 o5 Q, `/ W/ r 0x008 NVIC_ISER22 f3 E7 F3 w+ M) I- ` RESERVED 0x080 NVIC_ICER0 0x084 NVIC_ICER1/ N& k" k* @" W- F _# H 0x088 NVIC_ICER2 RESERVED# B! ~7 {0 L y% i* E. J! w% t2 Z 0x100 NVIC_ISPR0 //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)0 ]* M4 _4 m/ F, O7 }; | 0x104 NVIC_ISPR1 0x108 NVIC_ISPR20 \$ n' q2 S& \, i, _: a; ?0 F RESERVED c0 K' f( B7 l4 o5 t# E 0x180 NVIC_ICPR0 0x184 NVIC_ICPR1+ T, ]5 C0 X* @, o 0x188 NVIC_ICPR0 RESERVED% P, b1 f, Q5 Z& a 0x200 NVIC_IABR0 //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满) 0x204 NVIC_IABR1+ s {& @$ V5 S: x4 B# x. }0 x: S 0x208 NVIC_IABR2 RESERVED 0x300~0x320 NVIC_IPR0~NVIC_IPR80 //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个 1个特例寄存器:- _$ t" k3 M& O" U) W7 ~7 e! y NVIC_STIR:软件触发中断寄存器 //地址:0xE000EF00,该功能需要在SCB->CCR中使能- }- n( Z* ~0 f2 w( k //用于触发外部中断,[7:0]位有效,对应0~239号中断 异常和中断优先级配置:$ a* S, I3 f9 g- |) F 1. 除了NMI,其余异常和中断的优先级均可自由编程 //标准M3还要除了复位、硬fault这两个异常- x. J: l) D+ h( ^# [. m5 b 2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级: //标准M3最少使用3位,MSB对齐 0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0# D) i! J( \! w. H$ r0 O2 ` 3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM . Q5 c( t3 O! m( Y* V5 W 4. 抢占优先级的方法即实现了中断嵌套机制 5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占 6. 异常和中断优先级寄存器都可按字节读写% x6 c5 ^" _+ r1 E$ Z; ~ z" h 7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值 8. 不同中断源优先级可以设为相同!!! /******************************** SCB ***********************************/9 k2 M6 |' I( L/ [3 z+ U+ E SCB模块寄存器地址列表: //SCB模块基址0xE000ED00 地址偏移量 寄存器2 S; P9 j# g; ^- y1 G; M 0x00 SCB_CPUID 0x04 SCB_ICSR //中断控制及状态寄存器,主要用于悬起/解悬系统异常 0x08 SCB_VTOR //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数) //STM32F2默认值为0x08000000,正好对在ROM基址上 0x0C SCB_AIRCR //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组 0x10 SCB_SCR //系统控制寄存器,跟睡眠/唤醒相关 0x14 SCB_CCR //配置和控制寄存器,主要跟异常响应相关5 r, o1 \% d6 r; D- p, u: } //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制' C* ~3 y6 s8 P& A; I: X 0x18 SCB_SHPR1 //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常) V8 H6 q, R# x" I p; i: |6 h 0x1C SCB_SHPR2 ) u0 |. `1 ~& z. u" \ 0x20 SCB_SHPR36 B( k# ?& d: V8 _( { 0x24 SCB_SHCRS //系统异常控制和状态寄存器,功能类似于NVIC_IABRn2 y6 y; _; ^) c/ c 0x28 SCB_CFSR //以下几个暂时不管# i& W4 x7 o2 K" P4 p- l 0x2C SCB_HFSR, ?) S) V9 m N# ^ 0x34 SCB_MMAR" h/ O2 I# J. n7 F( a 0x38 SCB_BFAR1 H& x/ i% O! m; x0 T% n/ |, O4 a 8 L1 S9 C0 H2 I4 O+ K! L* b: J /******************************** 特殊功能寄存器组 ***********************************/4 f- E( g, K! h0 r% q5 t$ e CONTROL:控制寄存器 仅当在特权级下操作时才允许写该寄存器 !!! 1. CONTROL[0]: 用于选择处理器模式为特权级/非特权级" B0 r4 ^% ] P* f% A 特权级非特权级切换流程如下: 特权级——————————>非特权级———————————————————————————————————>特权级$ ], d R& J* e4 R$ L CONTROL寄存器 |= 0x01 调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式, 而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级 ( m, I$ B2 v( c+ Q* E( m . K& l8 A$ V3 ^3 L) ]! l$ A1 V( Y8 X 6 d* O3 h! z; |7 u2 h: i 2. CONTROL[1]: 用于选择当前使用哪个堆栈指针9 C" ?9 b6 S' v; _& c4 H. l+ ~ 仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效 MSP/PSP切换流程如下: MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] / \ 线程模式下操作CONTROL[1] / \ 操作CONTROL[0]/ \触发中断/异常 B) L; W- Z" {/ c$ @ / \# E4 [+ {: o) V9 K1 K0 J PSP(非特权级、线程模式) MSP(特权级、handler模式)1 g& M* L0 F) R* h) C / \7 k- W& r4 W8 T2 O! U! z% u 调用SVC,在handler下改写CONTROL[0]/ \ 中断/异常返回 / \ MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式) PSP(特权级、线程模式) ————————————> MSP(特权级、线程模式) # ?1 d9 Y! M' m: h0 Y- A, I: D 线程模式下操作CONTROL[1] 线程模式下操作CONTROL[1] 操作模式总结: 1. 复位后处理器进入线程模式+特权级4 C/ P/ m& k) J! C3 X. Z: M 2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)+ B. {$ m/ b { 5 Q4 I8 Y g# Q3 V6 { /******************************** Flash ***********************************/2 }$ O* ?6 p9 p: A3 }/ b 主要特征: 1. 1Mbyte容量' w; V: G/ e6 f: m0 |& e 2. 128bits位宽读取 3. 字节、半字、字、双字写入; u7 q( f) p& `+ h$ _ 4. 可按扇区/块擦除 5. 存储区块架构:; b% @* M$ \ f& C! m' k 主存储区: 扇区 基址 尺寸 Sector0 0x08000000 16kbytes6 r7 [9 u2 V- z. G' I% E Sector1 0x08004000 16kbytes; B( t$ a1 O9 t* n% R& J7 ]: F Sector2 0x08008000 16kbytes1 l) e) a; j- N8 o; U4 v Sector3 0x0800C000 16kbytes7 N o/ G- L8 r5 \/ [7 z& ^ Sector4 0x08010000 64kbytes% B( @" F3 E% k y! C. O$ L8 ` Sector5 0x08020000 128kbytes Sector6 0x08040000 128kbytes Sector7 0x08060000 128kbytes Sector8 0x08080000 128kbytes Sector9 0x080A0000 128kbytes Sector10 0x080C0000 128kbytes Sector11 0x080E0000 128kbytes 系统存储区: 0x1FFF0000 30kbytes' ~6 l0 l9 A3 _8 V; m 一次性编程区: 0x1FFF7800 528bytes Flash配置字节: 0x1FFFC000 16bytes8 a: \, q+ ]# @; X CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。 复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。 更改时钟频率的标准顺序: B1 Y" i3 J6 T3 N5 n; \1 z 1. 增加时钟频率:: ?" c5 A4 I: j, n6 n8 o 修改FLASH_ACR寄存器中的延时位LATENCY* g+ |% C; G U8 @; |- z 确认延时是否修改成功! J; F0 h+ y9 x# m9 [ 修改时钟源/预分频, J, k# ]. f& | R. N 确认是否修改成功(看RCC_CFGR中SWS标志位)( E4 C) @3 O7 T$ f 2. 减小时钟频率: 修改时钟源/预分频 修改延时位LATENCY! \( \- j- G: J0 @6 Q 确认延时是否修改成功 4 ]* r% N- e0 U2 N FLASH寄存器:3 }3 k3 u# S) a8 T FLASH_ACR: FLASH访问控制寄存器 //用于设置访问延时$ }5 e* e9 d( E# I% Q3 R FLASH_KEYR: 密钥寄存器 //用于FLASH解锁 FLASH_OPTKEYR: 配置字节密钥寄存器 FLASH_SR: FLASH状态寄存器 //FLASH相关标志位/ M% r# \" ~9 h( B FLASH_CR: FLASH控制寄存器 //FLASH上锁、编程设置1 l5 ^9 f1 O8 h5 U5 g FLASH_OPTCR: 配置字节控制寄存器 - U/ o" |" c% H0 u8 G FLASH操作: 1. 解锁/上锁 对FLASH进行任何编程操作前都必须先进行解锁;# f6 k7 ?5 Z+ q, S3 P, V7 k 完成FLASH编程后建议上锁 2. 写入单位设置5 d9 n- T" k1 U/ s5 M2 ~7 A+ K 写入单位跟供电电压和Vpp有关,详见RM手册 此设置必须在任何擦除/编程操作前进行 3. 擦除% }. \8 q* j$ u/ Z 扇擦除: 擦除前确认当前无FLASH操作 扇擦除位使能、选择擦除扇区 开始擦除 等待擦除完毕 整块擦除:+ D& Z2 t/ X" h: u& B3 V 擦除前确认当前无FLASH操作 块擦除位使能( U4 {4 w4 g8 v: h1 d% u3 _2 J 开始擦除1 Z5 |" M( N+ T 等待擦除完毕 4. 写入" w4 j0 h- @. \$ a/ K 写入前确认当前FLASH无操作; ^( O2 S8 I* S1 N' x$ R 写入位使能 根据写入单位设置执行写入 等待写入完毕9 J. b( z( c6 B! G7 q 1 B( V" k; h2 x6 m1 u, p- S/ x5 X /******************************** EXTI ***********************************/ 主要特征: 拥有23个边沿检测中断/事件控制器 //该模块类似于I/O中断 可以检测脉冲宽度低于APB2时钟宽度的外部信号 2 q1 Z. w4 U% h% L: E EXTI寄存器:& E4 `, V+ e( a# c EXTI_IMR: 中断屏蔽寄存器- i; h5 C3 i& m" l P+ ~: c& M EXTI_EMR: 事件屏蔽寄存器4 c1 h$ s2 B8 z; g; Z; }6 D. A EXTI_RTSR: 上升沿触发选择寄存器 EXTI_FTSR: 下降沿触发选择寄存器* C6 t' W* K8 \ EXTI_SWIER: 软件中断事件寄存器( L( Q8 z$ W* O0 r! Y! D EXTI_PR: 挂起寄存器+ e) n! m: `1 I% P: A. e3 F# y ' S* R" y2 |& Q4 t f2 m' n( y 初始化流程:+ w$ A% p }! K, W; q( m1 J$ L 1. 使能GPIOx端口时钟 2. 使能SYSCFG模块时钟8 N) Q' ?: p$ m% p! F$ d 3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉) 4. 将EXTI的n号中断线跟管脚n相连 5. 配置EXTI的n号中断线 6. 配置EXTI的n号中断的优先级并使能中断& e! i/ k x" `7 I. u % ^3 O# L p. W0 @( w |
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 模拟