
STM32F207笔记 /******************************** NVIC ***********************************/ 主要特征:( a0 i* t7 c( R# s/ I7 L 拥有81个中断源 //不包括16个内部异常;标准M3可最多拥有240个中断源 16级可编程优先级 //标准M3可最多拥有128级可编程优先级* m+ @- U3 L7 ~3 W) C2 ? 优先级又被分为抢占优先级和亚优先级两段2 Q; z* L1 n4 [" M' u$ [ ( Z9 E5 `/ g: \* X4 y' { NVIC模块寄存器地址列表: //NVIC模块基址0xE000E100 地址偏移量 寄存器 . F* E3 ?# }2 _7 R 0x000 NVIC_ISER0 //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满) 0x004 NVIC_ISER19 u: T: g' W1 J: H- z3 F 0x008 NVIC_ISER28 w* J g# j0 y" i RESERVED 0x080 NVIC_ICER0! p [$ z: @! v4 N+ k 0x084 NVIC_ICER1; ], a! W# g; |1 z! {% M* M0 ?2 r0 B 0x088 NVIC_ICER2 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 RESERVED 0x180 NVIC_ICPR0 0x184 NVIC_ICPR1 0x188 NVIC_ICPR0 RESERVED 0x200 NVIC_IABR0 //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满) 0x204 NVIC_IABR1 0x208 NVIC_IABR2 RESERVED 0x300~0x320 NVIC_IPR0~NVIC_IPR80 //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个 1个特例寄存器: NVIC_STIR:软件触发中断寄存器 //地址:0xE000EF00,该功能需要在SCB->CCR中使能9 y1 Z' b: B8 D //用于触发外部中断,[7:0]位有效,对应0~239号中断 异常和中断优先级配置: 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. 抢占优先级的方法即实现了中断嵌套机制 5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占 6. 异常和中断优先级寄存器都可按字节读写 7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值 8. 不同中断源优先级可以设为相同!!!- v, k2 T5 Z4 P* A3 r /******************************** SCB ***********************************/ SCB模块寄存器地址列表: //SCB模块基址0xE000ED00 地址偏移量 寄存器, s/ a8 y+ }$ [7 ^6 f5 ^2 H4 d 0x00 SCB_CPUID 7 v. L1 F. k/ G 0x04 SCB_ICSR //中断控制及状态寄存器,主要用于悬起/解悬系统异常 0x08 SCB_VTOR //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数) //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 //配置和控制寄存器,主要跟异常响应相关 //注意点,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 0x20 SCB_SHPR3 0x24 SCB_SHCRS //系统异常控制和状态寄存器,功能类似于NVIC_IABRn( H S- m3 i G6 M3 V! @ 0x28 SCB_CFSR //以下几个暂时不管 0x2C SCB_HFSR 0x34 SCB_MMAR 0x38 SCB_BFAR* q* _3 U' L- v /******************************** 特殊功能寄存器组 ***********************************/ CONTROL:控制寄存器 仅当在特权级下操作时才允许写该寄存器 !!!* ~3 z2 S, m0 u& m1 M 1. CONTROL[0]: 用于选择处理器模式为特权级/非特权级* `; S/ I9 B) L. D; s/ b 特权级非特权级切换流程如下: 特权级——————————>非特权级———————————————————————————————————>特权级& H" V8 E6 p, r9 D5 B0 ]0 J* K0 s# k CONTROL寄存器 |= 0x01 调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式, 而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级 / w: ?( }! [6 ]- { . Y, { Z9 `2 m0 _5 e- y! B 2. CONTROL[1]: 用于选择当前使用哪个堆栈指针 仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效 MSP/PSP切换流程如下:- Z+ k4 X: K: x/ h7 `& [" P' m MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] / \ 线程模式下操作CONTROL[1] / \ ; i6 I# ~) i: L3 N1 D" P 操作CONTROL[0]/ \触发中断/异常 / \ 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 ` / \ MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式) PSP(特权级、线程模式) ————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] 线程模式下操作CONTROL[1] 3 j9 \# G5 A% C3 m# l 操作模式总结:; J1 r' C1 G+ X4 a 1. 复位后处理器进入线程模式+特权级 2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外)+ k8 [; P6 Y. ^1 k: _ W6 } 3 ~! w7 J) ?* \ [5 t /******************************** Flash ***********************************/ 主要特征: 1. 1Mbyte容量 2. 128bits位宽读取 3. 字节、半字、字、双字写入, B y9 x% q0 a" ~3 b9 Z# C 4. 可按扇区/块擦除3 n" v3 ^( S( n7 b1 Y 5. 存储区块架构: 主存储区: 扇区 基址 尺寸 Sector0 0x08000000 16kbytes Sector1 0x08004000 16kbytes 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 Sector6 0x08040000 128kbytes0 i' a6 u$ |' A- z/ j$ W7 n6 f+ B Sector7 0x08060000 128kbytes Sector8 0x08080000 128kbytes Sector9 0x080A0000 128kbytes+ f* l% }9 q$ }6 R! Z. x4 E Sector10 0x080C0000 128kbytes Sector11 0x080E0000 128kbytes 系统存储区: 0x1FFF0000 30kbytes 一次性编程区: 0x1FFF7800 528bytes Flash配置字节: 0x1FFFC000 16bytes1 j$ F, M, r7 W( n+ T; o CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。. i- _. J; a9 c0 I 复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。 更改时钟频率的标准顺序: 1. 增加时钟频率: 修改FLASH_ACR寄存器中的延时位LATENCY1 Q+ }/ p# c- L7 Z1 O9 P) |4 L* v 确认延时是否修改成功/ F! R$ B- k7 v# E- E: d. S 修改时钟源/预分频 确认是否修改成功(看RCC_CFGR中SWS标志位) 2. 减小时钟频率: 修改时钟源/预分频 修改延时位LATENCY, W8 X) h# {# ]8 [ 确认延时是否修改成功% n5 r( @. |1 _- o. j5 ~3 I' h FLASH寄存器: FLASH_ACR: FLASH访问控制寄存器 //用于设置访问延时 FLASH_KEYR: 密钥寄存器 //用于FLASH解锁 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上锁、编程设置 FLASH_OPTCR: 配置字节控制寄存器" X4 _$ r) D5 |% r: ?" p FLASH操作:0 Y4 m+ c3 \0 I2 @- b A4 L 1. 解锁/上锁 对FLASH进行任何编程操作前都必须先进行解锁; `1 V( d9 B+ t 完成FLASH编程后建议上锁" n1 Z9 B5 A- R0 F& t* `9 d3 A# s9 F 2. 写入单位设置 写入单位跟供电电压和Vpp有关,详见RM手册" m2 Q$ y4 P6 l) x- X, H3 e2 h. w 此设置必须在任何擦除/编程操作前进行 3. 擦除" t% B5 [% R- W7 ], |: A$ M6 m 扇擦除: 擦除前确认当前无FLASH操作 扇擦除位使能、选择擦除扇区 开始擦除5 G# ?+ a+ ]! R7 I; X 等待擦除完毕% N% | Q% c1 W2 O; @2 y 整块擦除: 擦除前确认当前无FLASH操作 块擦除位使能3 ~2 Y* ^( f6 } 开始擦除) B7 ^+ L% Y9 `* J+ u: U- w 等待擦除完毕 4. 写入 写入前确认当前FLASH无操作$ `5 K [( w! C; \7 c) t 写入位使能 根据写入单位设置执行写入 等待写入完毕 . W7 I6 d- n% s3 X /******************************** EXTI ***********************************/ 主要特征:0 [! h5 l+ t$ o8 Z: a 拥有23个边沿检测中断/事件控制器 //该模块类似于I/O中断 可以检测脉冲宽度低于APB2时钟宽度的外部信号1 l2 e; j- G! }3 s EXTI寄存器: EXTI_IMR: 中断屏蔽寄存器: F7 z! O- t: o* c EXTI_EMR: 事件屏蔽寄存器 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: 挂起寄存器 . q3 I6 B9 x, A( F8 a1 ^ 初始化流程:& g' I3 u6 }% K0 J, z) E: |$ D" X 1. 使能GPIOx端口时钟 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号中断线 6. 配置EXTI的n号中断的优先级并使能中断 T2 w" i0 _ }. O# K |
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 模拟