
STM32F207笔记 /******************************** NVIC ***********************************/ . k" j0 Q& r- T/ N主要特征: 拥有81个中断源 //不包括16个内部异常;标准M3可最多拥有240个中断源8 b( G- Y1 [/ ~% b" W9 v 16级可编程优先级 //标准M3可最多拥有128级可编程优先级 _" g3 H% \% z! P0 K" V/ B 优先级又被分为抢占优先级和亚优先级两段 NVIC模块寄存器地址列表: //NVIC模块基址0xE000E100 地址偏移量 寄存器 0x000 NVIC_ISER0 //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满) 0x004 NVIC_ISER1 0x008 NVIC_ISER2 RESERVED, x- ]' B6 f( g0 D7 K 0x080 NVIC_ICER0 0x084 NVIC_ICER1 0x088 NVIC_ICER2 RESERVED1 v0 N% x+ V+ J 0x100 NVIC_ISPR0 //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)7 r2 M; j9 j5 E1 R 0x104 NVIC_ISPR1% |7 h u4 Y' [) q. L7 R 0x108 NVIC_ISPR24 \- l, H. d" e7 B RESERVED6 j) Y7 ]: m- j 0x180 NVIC_ICPR0# |5 A- o& q! j 0x184 NVIC_ICPR1# `. b3 W" X4 Q7 ~, ~ 0x188 NVIC_ICPR0 Z7 ]% |/ Y. t) ~$ {9 \. _ RESERVED7 t7 M3 Q, b9 M5 Y2 s5 K* f/ O 0x200 NVIC_IABR0 //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满) 0x204 NVIC_IABR1 0x208 NVIC_IABR2! k5 t8 f' b3 k8 s, V j" f RESERVED$ N+ @6 f. K/ N' _ `; K 0x300~0x320 NVIC_IPR0~NVIC_IPR80 //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个 1个特例寄存器:4 t1 J( Q" G$ ?5 @2 v4 R NVIC_STIR:软件触发中断寄存器 //地址:0xE000EF00,该功能需要在SCB->CCR中使能 //用于触发外部中断,[7:0]位有效,对应0~239号中断6 ^7 c0 l7 H- \/ C1 M, [; V) o 异常和中断优先级配置:3 f: R0 q% l% n$ \* f 1. 除了NMI,其余异常和中断的优先级均可自由编程 //标准M3还要除了复位、硬fault这两个异常$ Z4 R, t- {% C! D& w2 j, K 2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级: //标准M3最少使用3位,MSB对齐; m8 H; E" g8 X2 X! A 0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0/ o4 F% b/ G0 K+ D% B2 J# W7 h 3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM 4. 抢占优先级的方法即实现了中断嵌套机制1 _/ l" _9 s! d V 5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占4 e" I1 y# M" e Q- u 6. 异常和中断优先级寄存器都可按字节读写 7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值 8. 不同中断源优先级可以设为相同!!! /******************************** SCB ***********************************/) H5 K& o' L$ d% `2 m1 |) T+ ^. \' Z SCB模块寄存器地址列表: //SCB模块基址0xE000ED00$ G+ x, h+ W' A# ?! J 地址偏移量 寄存器7 ^; a9 S, W1 s- T+ d 0x00 SCB_CPUID ; ^5 Z, M. E, D/ R, F" F, D 0x04 SCB_ICSR //中断控制及状态寄存器,主要用于悬起/解悬系统异常* ]4 n# l0 D' C8 q 0x08 SCB_VTOR //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)6 `' z" Q, d5 d( |. e& c& R //STM32F2默认值为0x08000000,正好对在ROM基址上 0x0C SCB_AIRCR //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组( `: T c, {' \( _, E+ b5 M d% g 0x10 SCB_SCR //系统控制寄存器,跟睡眠/唤醒相关, D/ [, r6 o- W. g 0x14 SCB_CCR //配置和控制寄存器,主要跟异常响应相关 //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制 0x18 SCB_SHPR1 //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常 0x1C SCB_SHPR2 0x20 SCB_SHPR30 N- _5 H; w* V3 R5 J: X 0x24 SCB_SHCRS //系统异常控制和状态寄存器,功能类似于NVIC_IABRn 0x28 SCB_CFSR //以下几个暂时不管. w4 Q, W6 u! T+ X6 C" J) Q. I* u9 f 0x2C SCB_HFSR 0x34 SCB_MMAR9 h' Z9 g |! W6 l* z; I" P 0x38 SCB_BFAR. I' a+ V* r: ?0 O _' J7 _* \" } /******************************** 特殊功能寄存器组 ***********************************/' e+ H1 C$ q' R. o, { CONTROL:控制寄存器7 l- O- _! l$ G. m1 M6 o 仅当在特权级下操作时才允许写该寄存器 !!!7 r. T9 M& y( r+ [ 1. CONTROL[0]: 用于选择处理器模式为特权级/非特权级4 a" o# ?/ u& J* [2 ]5 o- x6 R 特权级非特权级切换流程如下: 特权级——————————>非特权级———————————————————————————————————>特权级# J; b' l( M# \) ? CONTROL寄存器 |= 0x01 调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式, - K+ ^5 _- f- Z 而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级 ; q' U8 j/ b( @2 H( l! |7 T 2. CONTROL[1]: 用于选择当前使用哪个堆栈指针 仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效 t6 L3 _. ]1 Q9 O: t/ A2 m MSP/PSP切换流程如下:6 d$ [$ `$ } J: j m2 ]* f1 }. I MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] / \ 线程模式下操作CONTROL[1]6 d: W% F# {, u9 g1 U9 y$ S / \ 操作CONTROL[0]/ \触发中断/异常7 f: z0 z: ^4 C9 s( ` / \ PSP(非特权级、线程模式) MSP(特权级、handler模式)/ v1 ]3 d0 _7 j& F+ M4 S0 y / \* }4 V2 j# _) c$ `3 n1 K 调用SVC,在handler下改写CONTROL[0]/ \ 中断/异常返回 / \ MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式) PSP(特权级、线程模式) ————————————> MSP(特权级、线程模式) " C$ {# g5 T& Y, c3 @: H8 R 线程模式下操作CONTROL[1] 线程模式下操作CONTROL[1] 操作模式总结:7 x6 I! v. `, } 1. 复位后处理器进入线程模式+特权级8 J* R' a: S0 @) N3 w5 N 2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外) ( Y n" O0 K$ K: l3 E: J /******************************** Flash ***********************************/ 主要特征: 1. 1Mbyte容量8 G3 Z- [* P0 c" |6 g4 _ 2. 128bits位宽读取1 b1 X+ U, j) c. F. N# L 3. 字节、半字、字、双字写入2 Y: F* _+ j) Q 4. 可按扇区/块擦除5 p2 g1 d. a$ [" n8 |( N$ ` 5. 存储区块架构: 主存储区: 扇区 基址 尺寸4 U# K$ W& ?( p Sector0 0x08000000 16kbytes8 t) q2 L6 A: @ Sector1 0x08004000 16kbytes: x; a* H* ~- @. M/ Z- w4 d: z! A. o Sector2 0x08008000 16kbytes6 t5 [8 ~/ Z, W$ D3 v8 R, g0 P" N Sector3 0x0800C000 16kbytes+ r. D# l% R# p3 M Sector4 0x08010000 64kbytes Sector5 0x08020000 128kbytes Sector6 0x08040000 128kbytes+ k* X% N; H) I1 T2 M4 a. m/ \ Sector7 0x08060000 128kbytes Sector8 0x08080000 128kbytes9 W$ o( Z9 W1 d2 m Sector9 0x080A0000 128kbytes Sector10 0x080C0000 128kbytes4 T& ^0 @! m7 W b Sector11 0x080E0000 128kbytes : C* `: p: X% W 系统存储区: 0x1FFF0000 30kbytes% j+ C6 W* ?: B/ @, j( v 一次性编程区: 0x1FFF7800 528bytes# |. h4 t+ U6 g r; h: R8 X1 X Flash配置字节: 0x1FFFC000 16bytes CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。4 [2 l7 i" e" F& h7 I4 U 复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。" W7 B% M4 M9 @9 V3 j0 b 更改时钟频率的标准顺序: 1. 增加时钟频率: 修改FLASH_ACR寄存器中的延时位LATENCY p. x4 G: H; K( n 确认延时是否修改成功- r0 A8 g, i" p. C5 y! s7 L 修改时钟源/预分频% r6 {- d$ g. T/ k1 K, U 确认是否修改成功(看RCC_CFGR中SWS标志位). @/ @ z6 `4 R8 Q9 x; ~ 2. 减小时钟频率: 修改时钟源/预分频 修改延时位LATENCY' @% q! f9 M& W0 ^ 确认延时是否修改成功! @ s$ P; J- c9 v; ~5 u0 O4 e FLASH寄存器: FLASH_ACR: FLASH访问控制寄存器 //用于设置访问延时: [; l7 k$ G+ \ FLASH_KEYR: 密钥寄存器 //用于FLASH解锁 FLASH_OPTKEYR: 配置字节密钥寄存器 M) y" F$ f; i% H4 j; \7 B S9 u FLASH_SR: FLASH状态寄存器 //FLASH相关标志位 FLASH_CR: FLASH控制寄存器 //FLASH上锁、编程设置 FLASH_OPTCR: 配置字节控制寄存器 FLASH操作: 1. 解锁/上锁 . {* b( T z7 u5 p0 @1 j4 H9 J 对FLASH进行任何编程操作前都必须先进行解锁;. `& D. M& s$ A" f9 M! [0 G, V 完成FLASH编程后建议上锁6 J) U- f9 M _% J 2. 写入单位设置* Z7 S% P6 J3 e( C! o$ { 写入单位跟供电电压和Vpp有关,详见RM手册1 I, F2 N# O. g! [( E 此设置必须在任何擦除/编程操作前进行# [( z' e: m* T2 V2 u: M) Q 3. 擦除7 R c8 {1 O ~2 i4 J- K- S 扇擦除:, L" o4 R/ g# z! | 擦除前确认当前无FLASH操作 扇擦除位使能、选择擦除扇区 开始擦除/ J1 C8 c( F/ ]1 {4 g; K) z 等待擦除完毕 \$ v ?: }( s& X/ H 整块擦除: 擦除前确认当前无FLASH操作- l8 B' S+ I' W, P0 H; k# B/ P 块擦除位使能 开始擦除# M" K/ g N2 _3 [: n6 j) D 等待擦除完毕 9 }0 U8 E# W: T3 l7 _* i0 r" G 4. 写入 写入前确认当前FLASH无操作 写入位使能 根据写入单位设置执行写入 等待写入完毕 6 w, N3 H/ a* u' P; ]2 c" {) o. K6 {( B4 ] " t1 `5 Y; \" c+ ?- j# _4 V2 q" c /******************************** EXTI ***********************************/ 主要特征:4 t; u! f' w! z5 o 拥有23个边沿检测中断/事件控制器 //该模块类似于I/O中断 可以检测脉冲宽度低于APB2时钟宽度的外部信号9 W2 J9 ?9 O/ `) ^, \4 I EXTI寄存器: EXTI_IMR: 中断屏蔽寄存器 EXTI_EMR: 事件屏蔽寄存器 EXTI_RTSR: 上升沿触发选择寄存器 EXTI_FTSR: 下降沿触发选择寄存器! b) r# `/ N9 n* A EXTI_SWIER: 软件中断事件寄存器 EXTI_PR: 挂起寄存器/ X( y5 a# e. y) h% Z 初始化流程: 1. 使能GPIOx端口时钟/ E5 [! Q$ l: `2 v6 k M, ?% p5 t; @ 2. 使能SYSCFG模块时钟+ `( u) }+ F2 C7 \ 3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉): j3 f" x/ P1 }# c% m) l# D' Q 4. 将EXTI的n号中断线跟管脚n相连1 c& _8 ]+ V- O/ J, H5 c! h. G- x 5. 配置EXTI的n号中断线1 {9 y0 R! T0 M, } 6. 配置EXTI的n号中断的优先级并使能中断' H2 A" z. G$ R4 g" e- P 1 N, L$ J) m1 m3 }- B; ]# c 1 `6 E, v' }6 ^ |
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 模拟