STMCU小助手
发布时间:2021-12-3 16:00
|
STM32F207笔记 /******************************** NVIC ***********************************/ 5 }- S+ Q. f2 o" \% w0 \主要特征: 拥有81个中断源 //不包括16个内部异常;标准M3可最多拥有240个中断源$ P, N( x6 W ~0 q7 j2 F5 u 16级可编程优先级 //标准M3可最多拥有128级可编程优先级( L8 y& e, K h4 K- B/ ?# @& R 优先级又被分为抢占优先级和亚优先级两段& x1 ^7 x" m# e/ ` NVIC模块寄存器地址列表: //NVIC模块基址0xE000E100$ L2 }1 _% \4 v. c 地址偏移量 寄存器 3 H: v5 @; q$ V; [* B* J 0x000 NVIC_ISER0 //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满) N) b- [0 j; |8 l4 W7 S 0x004 NVIC_ISER18 M* w9 |1 h _ 0x008 NVIC_ISER28 O% @5 T- {/ Z+ {2 E0 m RESERVED 0x080 NVIC_ICER0 0x084 NVIC_ICER1 0x088 NVIC_ICER2& {) I, S/ N% Q( U! E5 I RESERVED 0x100 NVIC_ISPR0 //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)( _# a( X- N9 F# I8 } 0x104 NVIC_ISPR12 P7 C' E- g# b# \! R& G 0x108 NVIC_ISPR24 u' b6 d% ]9 X9 v RESERVED. f4 z0 _8 }7 L2 `& X8 a 0x180 NVIC_ICPR03 T3 W& R% Z! `9 E0 p/ ~' s 0x184 NVIC_ICPR1 0x188 NVIC_ICPR0 RESERVED 0x200 NVIC_IABR0 //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)% H0 b% l( w/ i9 h 0x204 NVIC_IABR1 0x208 NVIC_IABR24 @0 ]. N2 e( i' Y& c; c" | RESERVED 0x300~0x320 NVIC_IPR0~NVIC_IPR80 //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个 1个特例寄存器:$ H$ L% d, j) ~( ]8 D+ [ NVIC_STIR:软件触发中断寄存器 //地址:0xE000EF00,该功能需要在SCB->CCR中使能 //用于触发外部中断,[7:0]位有效,对应0~239号中断/ S7 n( x( b: | 异常和中断优先级配置: 1. 除了NMI,其余异常和中断的优先级均可自由编程 //标准M3还要除了复位、硬fault这两个异常 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 0 t# c3 n C/ H* U6 ? 4. 抢占优先级的方法即实现了中断嵌套机制) p% ~* o9 h9 {2 E( E7 U 5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占 6. 异常和中断优先级寄存器都可按字节读写 7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值: Q. d% C; x, V, |" W& R 8. 不同中断源优先级可以设为相同!!! /******************************** SCB ***********************************/7 u, P8 {* o- n' Z7 S7 c SCB模块寄存器地址列表: //SCB模块基址0xE000ED00* l. K1 n* |1 L( y$ s 地址偏移量 寄存器( h4 j9 y% E5 K4 F 0x00 SCB_CPUID 0x04 SCB_ICSR //中断控制及状态寄存器,主要用于悬起/解悬系统异常: o' ?+ O* Z- W 0x08 SCB_VTOR //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数) //STM32F2默认值为0x08000000,正好对在ROM基址上 0x0C SCB_AIRCR //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组 ~" @6 _! {* g7 l* Q( R4 S 0x10 SCB_SCR //系统控制寄存器,跟睡眠/唤醒相关7 k( c8 D6 y2 ^ o2 Z 0x14 SCB_CCR //配置和控制寄存器,主要跟异常响应相关) S+ e! ~, W: c7 a3 G+ c% {/ t0 X //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制 0x18 SCB_SHPR1 //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常6 M5 ?: a+ {% {1 n- L 0x1C SCB_SHPR2 W, }: s9 Y ^* T5 { 0x20 SCB_SHPR3 0x24 SCB_SHCRS //系统异常控制和状态寄存器,功能类似于NVIC_IABRn6 J1 b! }( c, e' W* B0 X$ ^1 }% u 0x28 SCB_CFSR //以下几个暂时不管. Z% t( B4 R8 q 0x2C SCB_HFSR( V) ~3 ~+ f6 @6 U2 N/ h7 l 0x34 SCB_MMAR$ s8 V8 D. B, ]. i& Q- g Q6 P 0x38 SCB_BFAR 9 G% P% o) T4 ~7 j4 U' } /******************************** 特殊功能寄存器组 ***********************************/: |( N7 E' ?5 K& G; A$ f CONTROL:控制寄存器9 b2 W% L6 o3 A7 C+ A 仅当在特权级下操作时才允许写该寄存器 !!! 1. CONTROL[0]: 用于选择处理器模式为特权级/非特权级. R- O6 G1 k' G! B: p8 ~& p 特权级非特权级切换流程如下: 特权级——————————>非特权级———————————————————————————————————>特权级0 |- H6 h7 y; {% u9 l6 M2 ] CONTROL寄存器 |= 0x01 调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式, 而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级 1 \& t( W$ ], J6 [8 S E5 D 2. CONTROL[1]: 用于选择当前使用哪个堆栈指针# n4 [+ ?3 o; U( A) p+ j& h3 g 仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效 MSP/PSP切换流程如下: MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] / \ 线程模式下操作CONTROL[1]4 G7 w ~) J0 n: W; K7 q# X1 g / \ ! D3 ~, H8 T9 i% H" k1 ] 操作CONTROL[0]/ \触发中断/异常, T0 W; ?( g9 Y; M! K / \7 _+ X' I) z: P* C' ^% c1 f PSP(非特权级、线程模式) MSP(特权级、handler模式)5 g% S ?2 E* O / \$ k& ^5 _& J3 K: x 调用SVC,在handler下改写CONTROL[0]/ \ 中断/异常返回7 k( w" K9 H! m / \0 C a1 x/ e o- @% e MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式) PSP(特权级、线程模式) ————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] 线程模式下操作CONTROL[1]# D% }) }' j: u9 w Y7 Z; m: B0 v 操作模式总结:7 j4 A$ _% ^- @" c7 a' B 1. 复位后处理器进入线程模式+特权级 2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外) /******************************** Flash ***********************************/0 t& u0 f1 y9 F% F* m6 d. n 主要特征:, i$ h7 g) ]3 |& R" G 1. 1Mbyte容量$ j& r( k! c* v: c 2. 128bits位宽读取 3. 字节、半字、字、双字写入 4. 可按扇区/块擦除 5. 存储区块架构: 主存储区: 扇区 基址 尺寸" M3 w; x- p3 d. d% o! R" `2 w Sector0 0x08000000 16kbytes Sector1 0x08004000 16kbytes" L( C. @9 f. C; s Sector2 0x08008000 16kbytes Sector3 0x0800C000 16kbytes Sector4 0x08010000 64kbytes: _$ E( G4 q6 t5 [+ x4 s Sector5 0x08020000 128kbytes Sector6 0x08040000 128kbytes3 D8 K( w) S+ c Sector7 0x08060000 128kbytes Sector8 0x08080000 128kbytes" O9 f( u& Z$ P: D4 \5 V0 b7 | Sector9 0x080A0000 128kbytes) k! O+ v" l3 U- l$ F$ F( v Sector10 0x080C0000 128kbytes Sector11 0x080E0000 128kbytes 系统存储区: 0x1FFF0000 30kbytes/ q8 z9 a1 Y: e: O0 ^; b 一次性编程区: 0x1FFF7800 528bytes Flash配置字节: 0x1FFFC000 16bytes CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。 复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。 更改时钟频率的标准顺序: 1. 增加时钟频率: 修改FLASH_ACR寄存器中的延时位LATENCY% {- N9 s( G% {# C, d( H. R$ m, Q 确认延时是否修改成功6 V, A* V/ Z% B! E4 W5 f3 G 修改时钟源/预分频9 R- r" o4 W9 c- U( M 确认是否修改成功(看RCC_CFGR中SWS标志位)2 f; ?# R. C4 _" m6 l 2. 减小时钟频率:- N$ z+ t& k4 [' T v; y2 P 修改时钟源/预分频3 b c0 h* R' T7 K0 } 修改延时位LATENCY: Q2 E) b% Q* K! B; l3 Y8 i 确认延时是否修改成功 FLASH寄存器: FLASH_ACR: FLASH访问控制寄存器 //用于设置访问延时9 c$ c' `/ X; W- a FLASH_KEYR: 密钥寄存器 //用于FLASH解锁 FLASH_OPTKEYR: 配置字节密钥寄存器) @& H4 A: t+ }- \; Y5 W FLASH_SR: FLASH状态寄存器 //FLASH相关标志位( j5 ]3 C! }# H# k% d' u FLASH_CR: FLASH控制寄存器 //FLASH上锁、编程设置 FLASH_OPTCR: 配置字节控制寄存器6 j" L }* P! A0 Y # w+ { l/ \8 I FLASH操作:0 D; s s# t# @: J7 ?* [5 G 1. 解锁/上锁 对FLASH进行任何编程操作前都必须先进行解锁;9 s) [" W( s3 R- ] 完成FLASH编程后建议上锁) _/ O! O; p8 G 2. 写入单位设置) w/ r k4 v3 w; p 写入单位跟供电电压和Vpp有关,详见RM手册% c, {0 [1 b& X" j% d3 {$ T5 q7 g+ { 此设置必须在任何擦除/编程操作前进行 3. 擦除 扇擦除: 擦除前确认当前无FLASH操作 扇擦除位使能、选择擦除扇区& u ?' f6 ^ }+ j% i; j 开始擦除 等待擦除完毕 整块擦除:. f5 ^/ u0 |3 m6 v V1 } 擦除前确认当前无FLASH操作 块擦除位使能- e" a u5 n8 G. D" N7 l 开始擦除, |* M& {% O5 q7 @ k: B5 Z 等待擦除完毕 4. 写入3 a& w1 `8 ]& r0 d 写入前确认当前FLASH无操作 写入位使能 根据写入单位设置执行写入 等待写入完毕 1 c( q" t6 X+ [ E- ]2 W. P4 G /******************************** EXTI ***********************************/ 主要特征: 拥有23个边沿检测中断/事件控制器 //该模块类似于I/O中断 H, B5 W: x, ~/ e$ T 可以检测脉冲宽度低于APB2时钟宽度的外部信号5 B5 P5 d# x3 C3 ^ EXTI寄存器: EXTI_IMR: 中断屏蔽寄存器 EXTI_EMR: 事件屏蔽寄存器 EXTI_RTSR: 上升沿触发选择寄存器- V4 i# Z7 i1 \, N" E9 K EXTI_FTSR: 下降沿触发选择寄存器6 q9 `8 B- J+ u& q6 M3 t EXTI_SWIER: 软件中断事件寄存器. c& y8 p# I6 k EXTI_PR: 挂起寄存器 9 k" I, P; K, D2 O1 O5 [ 初始化流程: 1. 使能GPIOx端口时钟 2. 使能SYSCFG模块时钟 3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉) 4. 将EXTI的n号中断线跟管脚n相连 5. 配置EXTI的n号中断线 6. 配置EXTI的n号中断的优先级并使能中断( ?9 t# H9 b' s! D% M( ]5 E . ~( z8 ~$ w; V' ^3 p |
微信公众号
手机版