STM32F207笔记 /******************************** NVIC ***********************************/ 主要特征: 拥有81个中断源 //不包括16个内部异常;标准M3可最多拥有240个中断源 16级可编程优先级 //标准M3可最多拥有128级可编程优先级& Z: g& i( T2 }" d1 l7 |3 {. B, k 优先级又被分为抢占优先级和亚优先级两段 NVIC模块寄存器地址列表: //NVIC模块基址0xE000E1003 k/ Z0 D2 {* t) i6 }! l |% l 地址偏移量 寄存器 0x000 NVIC_ISER0 //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满) 0x004 NVIC_ISER1 0x008 NVIC_ISER27 n+ z$ L! {: | RESERVED; d+ v, j) P1 v/ D" V5 Y 0x080 NVIC_ICER0- |! w( U0 b& W; g: F 0x084 NVIC_ICER1( a3 @5 W0 P7 @& v/ Y9 z 0x088 NVIC_ICER2 RESERVED/ O8 o( G" T% T 0x100 NVIC_ISPR0 //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满) 0x104 NVIC_ISPR16 A7 Y8 K; s$ z D4 t8 J9 Q x 0x108 NVIC_ISPR2 RESERVED- _, S) p! d: s4 l 0x180 NVIC_ICPR0% m( T% o; {& r& \+ Q: J 0x184 NVIC_ICPR1. N1 }% e* R# A( U5 h 0x188 NVIC_ICPR0 RESERVED 0x200 NVIC_IABR0 //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)' G* A/ v! P8 o9 R) }. d& ?0 m0 q2 ` 0x204 NVIC_IABR1 0x208 NVIC_IABR2 RESERVED- z$ u* u3 a* {% Z+ O 0x300~0x320 NVIC_IPR0~NVIC_IPR80 //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个 1个特例寄存器:' Y4 ~8 \ F# y3 T# [# I. p NVIC_STIR:软件触发中断寄存器 //地址:0xE000EF00,该功能需要在SCB->CCR中使能/ \9 b- a' X4 J% ]& |# h" b1 m' q //用于触发外部中断,[7:0]位有效,对应0~239号中断 P6 G' @, J' @# K/ B5 M" q, ] 异常和中断优先级配置: 1. 除了NMI,其余异常和中断的优先级均可自由编程 //标准M3还要除了复位、硬fault这两个异常% g/ ^! o: l7 |- d$ V5 t' l. f 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 4. 抢占优先级的方法即实现了中断嵌套机制 5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占 6. 异常和中断优先级寄存器都可按字节读写 7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值- H9 v( ]3 m: w9 X- Q0 v 8. 不同中断源优先级可以设为相同!!!7 K7 ~3 A$ m' q8 d5 G5 h% f* P+ l( ?- F m c. M; y+ G! \5 R2 Y /******************************** SCB ***********************************/ SCB模块寄存器地址列表: //SCB模块基址0xE000ED00 地址偏移量 寄存器; @; N- v% t1 H! d# G; {) h" [ 0x00 SCB_CPUID 3 z$ R% o) B5 h; ? 0x04 SCB_ICSR //中断控制及状态寄存器,主要用于悬起/解悬系统异常 0x08 SCB_VTOR //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)! s' x* ~* l, N8 j/ O" \# X //STM32F2默认值为0x08000000,正好对在ROM基址上 0x0C SCB_AIRCR //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组3 W- ]7 q* ~8 {$ s, |# B" p 0x10 SCB_SCR //系统控制寄存器,跟睡眠/唤醒相关 0x14 SCB_CCR //配置和控制寄存器,主要跟异常响应相关3 {. y8 S$ S. s8 [9 i //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制 0x18 SCB_SHPR1 //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常' x8 e) b! j# I+ a 0x1C SCB_SHPR2 0x20 SCB_SHPR3 0x24 SCB_SHCRS //系统异常控制和状态寄存器,功能类似于NVIC_IABRn+ G1 n: ?$ ]* w/ T# A 0x28 SCB_CFSR //以下几个暂时不管7 {7 w5 f ~2 d4 r b 0x2C SCB_HFSR- K$ b" o4 c! ^/ X 0x34 SCB_MMAR7 ?, F7 ~3 [* x* V 0x38 SCB_BFAR - ]/ X' G* k+ k7 V( z( R' g; }7 u$ k1 W /******************************** 特殊功能寄存器组 ***********************************/ CONTROL:控制寄存器 仅当在特权级下操作时才允许写该寄存器 !!! 1. CONTROL[0]: 用于选择处理器模式为特权级/非特权级+ W7 X4 p7 Q; l) h5 |( g 特权级非特权级切换流程如下: 特权级——————————>非特权级———————————————————————————————————>特权级9 O6 }, A2 J3 V' O5 D* ~8 A5 d CONTROL寄存器 |= 0x01 调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式, % Z" K6 n+ y9 {# X 而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级 8 }/ U2 a: D& k ! }6 \2 w0 D9 n4 r1 x% l" Z, K 2. CONTROL[1]: 用于选择当前使用哪个堆栈指针 仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效 MSP/PSP切换流程如下: MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————> MSP(特权级、线程模式) ! ]1 w3 C E7 `! q 线程模式下操作CONTROL[1] / \ 线程模式下操作CONTROL[1] / \ 操作CONTROL[0]/ \触发中断/异常 / \ PSP(非特权级、线程模式) MSP(特权级、handler模式) / \ 调用SVC,在handler下改写CONTROL[0]/ \ 中断/异常返回 / \3 U O% s! e: I" d( Z0 L MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式) PSP(特权级、线程模式) ————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] 线程模式下操作CONTROL[1]+ M5 A& L/ t$ j- @0 x- F 操作模式总结:0 b+ Z8 j- ]* l1 h5 X9 \4 c 1. 复位后处理器进入线程模式+特权级! i+ K8 I3 c8 W: p& v0 [" s$ v- I' q 2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外) 9 [6 ~, P6 j$ q X. _ /******************************** Flash ***********************************/ 主要特征:( a1 i& z0 Y$ e7 \ 1. 1Mbyte容量) \! Q" a7 ?$ B7 ~3 N, H 2. 128bits位宽读取 3. 字节、半字、字、双字写入8 g0 T# D% O6 K' k4 a5 } 4. 可按扇区/块擦除, u/ ?0 D1 r6 e7 \' T% o. { 5. 存储区块架构: 主存储区: 扇区 基址 尺寸 Sector0 0x08000000 16kbytes Sector1 0x08004000 16kbytes Sector2 0x08008000 16kbytes6 R9 i2 }( f( A; s5 J0 S Sector3 0x0800C000 16kbytes. }7 d! [: Z. p( [1 s; ? w Sector4 0x08010000 64kbytes0 P( a; h4 ]0 ]0 ?) Y, r* ? Sector5 0x08020000 128kbytes# t7 q1 `5 k/ w6 O) b; m. q Sector6 0x08040000 128kbytes Sector7 0x08060000 128kbytes' Y) m) E- `- O! g; v Sector8 0x08080000 128kbytes1 n3 W0 j5 z; C, | Sector9 0x080A0000 128kbytes5 W7 Y0 F. v; G2 c Sector10 0x080C0000 128kbytes& A J, `1 H9 Y/ V1 f" r Sector11 0x080E0000 128kbytes 9 Q; G' e7 t( M6 S$ K) A- B$ I 系统存储区: 0x1FFF0000 30kbytes: S- }( t% W' V( @: s 一次性编程区: 0x1FFF7800 528bytes4 x2 }; M# v& j1 U Flash配置字节: 0x1FFFC000 16bytes/ S( h/ `$ q. }: ?1 M% M CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。 复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。$ d# c- ]7 a7 ]. S+ q 更改时钟频率的标准顺序: 1. 增加时钟频率:$ }+ Z) i4 T7 {! W0 o, _ 修改FLASH_ACR寄存器中的延时位LATENCY 确认延时是否修改成功 修改时钟源/预分频 确认是否修改成功(看RCC_CFGR中SWS标志位) 2. 减小时钟频率: 修改时钟源/预分频6 `6 @# o; k# f* u% Q 修改延时位LATENCY 确认延时是否修改成功1 n1 Z( y' c5 G Q FLASH寄存器:" p! j; l0 j1 ]8 ~8 u+ |+ o FLASH_ACR: FLASH访问控制寄存器 //用于设置访问延时 FLASH_KEYR: 密钥寄存器 //用于FLASH解锁 FLASH_OPTKEYR: 配置字节密钥寄存器: J4 e# l7 J8 y6 y1 K P4 @% | FLASH_SR: FLASH状态寄存器 //FLASH相关标志位 FLASH_CR: FLASH控制寄存器 //FLASH上锁、编程设置' c& I& _0 A/ @ FLASH_OPTCR: 配置字节控制寄存器# {( P8 z2 }9 R6 t% b. O( q' k& f 5 g: _: ?3 v0 H5 ~9 R5 p8 O FLASH操作:! C, G# N7 W6 M4 \/ v9 ]6 v 1. 解锁/上锁 ) J3 Z) M3 T u4 j4 @ 对FLASH进行任何编程操作前都必须先进行解锁; 完成FLASH编程后建议上锁9 [( `) |" _0 H1 g1 I+ D3 o 2. 写入单位设置 写入单位跟供电电压和Vpp有关,详见RM手册# j8 ]5 Z4 n$ A$ d 此设置必须在任何擦除/编程操作前进行 3. 擦除4 a# N S! t! G- Q3 _ n 扇擦除: 擦除前确认当前无FLASH操作' m }- D+ h' d6 } a 扇擦除位使能、选择擦除扇区# k$ J' v! s: A; l8 \$ I# ] 开始擦除4 \% n, H' B1 T. `% ?9 ]6 j9 L 等待擦除完毕+ ~( U: o% E- @4 ^: {% N9 q& _ 整块擦除:# Q5 b; a9 Q; c1 A 擦除前确认当前无FLASH操作% \" w; ]0 o5 {, Y 块擦除位使能 开始擦除 等待擦除完毕 $ g& X( q0 s6 j: X% w& I 4. 写入: M4 p* @" R5 l7 e 写入前确认当前FLASH无操作2 P" m2 h [7 W# R, J o 写入位使能 根据写入单位设置执行写入$ l( k5 w+ h$ m" Q* V- _' k 等待写入完毕 5 O( R* }9 V8 B& h0 p) q/ m /******************************** EXTI ***********************************/8 v& A7 v2 H# Y# s# ^ 主要特征:* R: b8 t( y7 H: Y' i/ ]& J 拥有23个边沿检测中断/事件控制器 //该模块类似于I/O中断 可以检测脉冲宽度低于APB2时钟宽度的外部信号7 G" e Y) u* ?, r) |3 U EXTI寄存器: EXTI_IMR: 中断屏蔽寄存器: g) `7 d; b: [- t7 @ EXTI_EMR: 事件屏蔽寄存器2 {& Z) S5 q, H1 s( g/ A% X EXTI_RTSR: 上升沿触发选择寄存器 EXTI_FTSR: 下降沿触发选择寄存器$ m8 |5 }8 @7 q" A1 J EXTI_SWIER: 软件中断事件寄存器# P- h; W9 r+ s3 s W EXTI_PR: 挂起寄存器$ U% V, [9 l3 j5 F' m, A0 f ) T: O) c: I8 J+ l/ B7 V9 | 初始化流程: 1. 使能GPIOx端口时钟 2. 使能SYSCFG模块时钟 3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉) k' l; z1 B5 E3 Z+ F2 c6 C q 4. 将EXTI的n号中断线跟管脚n相连 5. 配置EXTI的n号中断线 6. 配置EXTI的n号中断的优先级并使能中断1 r4 b6 Q7 h% Q' W $ {. O5 |7 u( [, j 3 Q" r a- u8 P' y, L/ y C; \$ Y |
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 模拟