STM32F207笔记 /******************************** NVIC ***********************************/ 主要特征:( Y- u! X" R( h8 a 拥有81个中断源 //不包括16个内部异常;标准M3可最多拥有240个中断源 16级可编程优先级 //标准M3可最多拥有128级可编程优先级 优先级又被分为抢占优先级和亚优先级两段 NVIC模块寄存器地址列表: //NVIC模块基址0xE000E100 地址偏移量 寄存器 0x000 NVIC_ISER0 //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)/ i) b% `6 F+ b0 Q$ _6 K! U' P5 P 0x004 NVIC_ISER1 0x008 NVIC_ISER25 ~% A1 t7 ^- _# s1 n; y RESERVED 0x080 NVIC_ICER0$ d. R& @" p4 x& F' ` 0x084 NVIC_ICER1 0x088 NVIC_ICER2 o; z0 @7 I; i# p- Y RESERVED 0x100 NVIC_ISPR0 //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满) 0x104 NVIC_ISPR1 0x108 NVIC_ISPR2 RESERVED& M" G U& G P 0x180 NVIC_ICPR07 @; s& Y& W: l$ y' K& C) Z 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 RESERVED8 \9 {" q. }; j I 0x300~0x320 NVIC_IPR0~NVIC_IPR80 //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个2 C8 l) s! n: r* M. u 1个特例寄存器:1 y& V1 B" t+ U# P% o NVIC_STIR:软件触发中断寄存器 //地址:0xE000EF00,该功能需要在SCB->CCR中使能1 G) c$ n3 `, H$ p6 }" O+ ~9 L //用于触发外部中断,[7:0]位有效,对应0~239号中断 异常和中断优先级配置: 1. 除了NMI,其余异常和中断的优先级均可自由编程 //标准M3还要除了复位、硬fault这两个异常# E9 T- }% s8 t# E) E$ I 2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级: //标准M3最少使用3位,MSB对齐 0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0& K7 F- k! u6 H; R& W6 M6 E9 k 3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM 4. 抢占优先级的方法即实现了中断嵌套机制- ?5 r8 O# ?5 d# ^1 n 5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占 6. 异常和中断优先级寄存器都可按字节读写 7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值" }3 d4 ]3 A& d* o k 8. 不同中断源优先级可以设为相同!!! + C- h+ K6 m% N, @* G /******************************** SCB ***********************************/ SCB模块寄存器地址列表: //SCB模块基址0xE000ED00 地址偏移量 寄存器" Y' Q7 p4 H/ a/ [ Z2 Z: g 0x00 SCB_CPUID 0x04 SCB_ICSR //中断控制及状态寄存器,主要用于悬起/解悬系统异常8 N, _' {/ R" ? 0x08 SCB_VTOR //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数) //STM32F2默认值为0x08000000,正好对在ROM基址上2 o9 J3 c7 }3 _$ z. f 0x0C SCB_AIRCR //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组; H# V0 z5 e7 v! J8 `8 j 0x10 SCB_SCR //系统控制寄存器,跟睡眠/唤醒相关0 X% b& h* R6 V2 i 0x14 SCB_CCR //配置和控制寄存器,主要跟异常响应相关 //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制 0x18 SCB_SHPR1 //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常- o5 S7 H, L. s$ y% i 0x1C SCB_SHPR2 - U& p% p" N1 ?0 M, N7 ` 0x20 SCB_SHPR3 0x24 SCB_SHCRS //系统异常控制和状态寄存器,功能类似于NVIC_IABRn 0x28 SCB_CFSR //以下几个暂时不管4 {" F d/ H, D" y 0x2C SCB_HFSR: c/ c3 \5 S! k- ~ 0x34 SCB_MMAR+ U' ~! }* g# N$ } 0x38 SCB_BFAR" Y N# y2 D( J7 p f$ Y/ Q, T ! i6 ]: d+ W" I$ u4 S1 O; i2 J/ v 1 J- \* {$ x- |0 x: v/ j+ H: h /******************************** 特殊功能寄存器组 ***********************************/7 f! A- e n, Y3 D* _; ~ CONTROL:控制寄存器$ B; z l' k: A; {# i( q 仅当在特权级下操作时才允许写该寄存器 !!! 1. CONTROL[0]: 用于选择处理器模式为特权级/非特权级 特权级非特权级切换流程如下: 特权级——————————>非特权级———————————————————————————————————>特权级 CONTROL寄存器 |= 0x01 调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式, 而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级 ' K! ~- S3 N/ T9 i/ d$ x2 U! ^ ^! ] 2. CONTROL[1]: 用于选择当前使用哪个堆栈指针 仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效 MSP/PSP切换流程如下: MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] / \ 线程模式下操作CONTROL[1]2 P7 W7 K0 N9 q+ F, W / \ 操作CONTROL[0]/ \触发中断/异常& s8 c4 @2 d7 y. K$ I / \ PSP(非特权级、线程模式) MSP(特权级、handler模式)2 E; ^3 i% h* N) y0 g% [) l. ~ / \ 调用SVC,在handler下改写CONTROL[0]/ \ 中断/异常返回5 ^" T+ d+ r. o' @+ E- L( ?8 h / \ MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式) PSP(特权级、线程模式) ————————————> MSP(特权级、线程模式) W$ ^& @1 n: g3 `4 B 线程模式下操作CONTROL[1] 线程模式下操作CONTROL[1]1 F! j) U. L& i. i$ q' ~0 e1 p ) a% Q) ?/ c$ c! o/ X/ ?& @ 操作模式总结:8 m: u$ k' H6 [$ A9 l 1. 复位后处理器进入线程模式+特权级+ A' r* Q' y2 q. h" |; k 2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外) ; ^' `, a! f4 h/ _ /******************************** Flash ***********************************/ 主要特征:$ g1 k, j5 U$ y ^- z. U! z 1. 1Mbyte容量 2. 128bits位宽读取# ^2 H) f4 M D5 g* q9 @: o0 y! r 3. 字节、半字、字、双字写入 4. 可按扇区/块擦除 5. 存储区块架构:/ x* i" G/ {" H+ j 主存储区: 扇区 基址 尺寸 Sector0 0x08000000 16kbytes Sector1 0x08004000 16kbytes Sector2 0x08008000 16kbytes Sector3 0x0800C000 16kbytes Sector4 0x08010000 64kbytes/ @& ^6 L. O# h8 d* _/ i5 w& H! _ Sector5 0x08020000 128kbytes$ `' [/ t3 a6 ~% _ Sector6 0x08040000 128kbytes Sector7 0x08060000 128kbytes) S( K/ M' m8 r Sector8 0x08080000 128kbytes Sector9 0x080A0000 128kbytes Sector10 0x080C0000 128kbytes Sector11 0x080E0000 128kbytes : N {* T2 i. P j q 系统存储区: 0x1FFF0000 30kbytes 一次性编程区: 0x1FFF7800 528bytes Flash配置字节: 0x1FFFC000 16bytes CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。 复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。# ~! E6 ?1 F/ _7 G 更改时钟频率的标准顺序: 1. 增加时钟频率: 修改FLASH_ACR寄存器中的延时位LATENCY 确认延时是否修改成功3 N) q* n" w" J 修改时钟源/预分频 确认是否修改成功(看RCC_CFGR中SWS标志位)6 F! Y8 L7 Z- d+ C 2. 减小时钟频率: 修改时钟源/预分频 修改延时位LATENCY 确认延时是否修改成功 FLASH寄存器:0 O. t. e" l) k! B FLASH_ACR: FLASH访问控制寄存器 //用于设置访问延时 FLASH_KEYR: 密钥寄存器 //用于FLASH解锁9 s: O' T$ A z# s* \/ v FLASH_OPTKEYR: 配置字节密钥寄存器 FLASH_SR: FLASH状态寄存器 //FLASH相关标志位: E6 K& A2 Z+ L- s5 a# e FLASH_CR: FLASH控制寄存器 //FLASH上锁、编程设置% F( H6 [6 z4 F* E- x FLASH_OPTCR: 配置字节控制寄存器% _- I3 ~& B1 y; R; a9 L FLASH操作: 1. 解锁/上锁 对FLASH进行任何编程操作前都必须先进行解锁;) |' N1 o- T/ Q- ` 完成FLASH编程后建议上锁 2. 写入单位设置' R* H$ D" j9 u/ } M& l 写入单位跟供电电压和Vpp有关,详见RM手册. v: B! x" o: s: v Z 此设置必须在任何擦除/编程操作前进行, Y% J- E+ p0 t. F& H9 D7 l- l8 v e 3. 擦除; ?* k2 c1 w/ k0 U6 R 扇擦除:# j) A+ q/ w0 j7 b- V 擦除前确认当前无FLASH操作8 ^$ X7 l$ C. K: V) c 扇擦除位使能、选择擦除扇区 开始擦除 等待擦除完毕( M0 F. L4 }: C7 N3 \5 c7 q$ a 整块擦除:0 a. H" F4 C9 v9 n 擦除前确认当前无FLASH操作7 ^; @( r) c* L 块擦除位使能9 O; G6 g' d% O7 X8 u7 k 开始擦除( L b0 q* V4 o, h5 ] 等待擦除完毕 y% N( j/ r, ?! \' K* J6 d 4. 写入1 x# q3 I% [6 x! u, H/ h( h7 e! f 写入前确认当前FLASH无操作 写入位使能3 I' w! }1 D- Z" ] 根据写入单位设置执行写入 等待写入完毕 ' i; z7 s$ B5 A- v1 B3 v2 w# f 1 p; [" t2 Z" ? /******************************** EXTI ***********************************/7 v- i2 s; t- p& g' \* L. V 主要特征: 拥有23个边沿检测中断/事件控制器 //该模块类似于I/O中断 可以检测脉冲宽度低于APB2时钟宽度的外部信号 EXTI寄存器: EXTI_IMR: 中断屏蔽寄存器 EXTI_EMR: 事件屏蔽寄存器 EXTI_RTSR: 上升沿触发选择寄存器 EXTI_FTSR: 下降沿触发选择寄存器( v, L A! k7 m' a6 R EXTI_SWIER: 软件中断事件寄存器 EXTI_PR: 挂起寄存器 + e( F" C9 I% @7 p 初始化流程:' y# e6 j+ e6 d _8 j( Z 1. 使能GPIOx端口时钟2 v1 W7 s7 [0 B2 e0 [4 t2 S- H 2. 使能SYSCFG模块时钟 3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉) 4. 将EXTI的n号中断线跟管脚n相连' P/ C$ b* T, ^6 m3 C 5. 配置EXTI的n号中断线 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 模拟