STMCU小助手
发布时间:2021-12-3 16:00
|
STM32F207笔记 /******************************** NVIC ***********************************/ ( h+ o) |" o: y5 \主要特征: 拥有81个中断源 //不包括16个内部异常;标准M3可最多拥有240个中断源 16级可编程优先级 //标准M3可最多拥有128级可编程优先级 优先级又被分为抢占优先级和亚优先级两段 NVIC模块寄存器地址列表: //NVIC模块基址0xE000E100* ~1 f2 L( n" Z- s" m; u 地址偏移量 寄存器 0x000 NVIC_ISER0 //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满) 0x004 NVIC_ISER1 0x008 NVIC_ISER2 RESERVED 0x080 NVIC_ICER0- n1 }* o) F. ]8 h; [& N0 C 0x084 NVIC_ICER1 0x088 NVIC_ICER2 RESERVED6 G1 ~: p0 \1 i" d, k% T' N0 h( ` 0x100 NVIC_ISPR0 //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满) 0x104 NVIC_ISPR18 {/ C- \* S1 g5 T5 E 0x108 NVIC_ISPR22 r# L) L1 N, U3 u RESERVED 0x180 NVIC_ICPR01 h I. b8 l1 m2 Z0 ]4 v 0x184 NVIC_ICPR13 F9 g4 V3 J# b3 o* A& x 0x188 NVIC_ICPR0 RESERVED( j; ]+ U' u6 q! h# e 0x200 NVIC_IABR0 //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满)9 t2 J- y* a1 g. }0 h- _ 0x204 NVIC_IABR12 }8 \, o% }% o- ~" v- _ 0x208 NVIC_IABR2 RESERVED' M' T/ V+ i% k. w. |+ N, p 0x300~0x320 NVIC_IPR0~NVIC_IPR80 //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个 1个特例寄存器: NVIC_STIR:软件触发中断寄存器 //地址:0xE000EF00,该功能需要在SCB->CCR中使能 //用于触发外部中断,[7:0]位有效,对应0~239号中断9 q4 `- f: L5 e5 x4 n: l 异常和中断优先级配置:# o+ Z5 N, _( j6 S3 G$ e 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+ i4 K5 y1 _" T- n, J! B 3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM 4. 抢占优先级的方法即实现了中断嵌套机制: }# G' _, F) @. G, d2 c; R' T$ U 5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占 6. 异常和中断优先级寄存器都可按字节读写 W9 n. V& J w. ? 7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值 8. 不同中断源优先级可以设为相同!!! /******************************** SCB ***********************************/ SCB模块寄存器地址列表: //SCB模块基址0xE000ED00 地址偏移量 寄存器$ l ?2 R$ o, q @: {2 v9 i7 ~' \$ } 0x00 SCB_CPUID 0x04 SCB_ICSR //中断控制及状态寄存器,主要用于悬起/解悬系统异常5 J, }1 h. H# q& E2 t, d6 S 0x08 SCB_VTOR //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数) //STM32F2默认值为0x08000000,正好对在ROM基址上1 D/ S. R+ Q; W: d' [6 [6 \1 t 0x0C SCB_AIRCR //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组 0x10 SCB_SCR //系统控制寄存器,跟睡眠/唤醒相关 0x14 SCB_CCR //配置和控制寄存器,主要跟异常响应相关. B3 S8 S% K- B* _7 I l* F //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制 0x18 SCB_SHPR1 //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常 0x1C SCB_SHPR2 , _: k0 @( u7 _# s6 B) ~ 0x20 SCB_SHPR3 0x24 SCB_SHCRS //系统异常控制和状态寄存器,功能类似于NVIC_IABRn 0x28 SCB_CFSR //以下几个暂时不管 0x2C SCB_HFSR2 V) O" G: M$ _% x" V2 l 0x34 SCB_MMAR! R! u+ |" g" G+ D+ c0 @" a 0x38 SCB_BFAR $ R2 j7 |. d3 S' a /******************************** 特殊功能寄存器组 ***********************************/" B7 M6 [( j1 a* L; O" N CONTROL:控制寄存器. q' t, N7 p5 I 仅当在特权级下操作时才允许写该寄存器 !!! 1. CONTROL[0]: 用于选择处理器模式为特权级/非特权级" V# n& S5 i: g4 _# X3 O# f 特权级非特权级切换流程如下:; e4 N3 m! d* q 特权级——————————>非特权级———————————————————————————————————>特权级 CONTROL寄存器 |= 0x01 调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式, - P5 T: P% s! A8 i9 w& x4 z R 而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级 9 ]: C1 q/ m* M2 N" X 8 _) L" @# T+ T( T' Z" X6 u3 m/ W% a0 f 2. CONTROL[1]: 用于选择当前使用哪个堆栈指针 仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效 / S. c1 W+ P d( g' R0 T( {; x0 m MSP/PSP切换流程如下: MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] / \ 线程模式下操作CONTROL[1] / \ 操作CONTROL[0]/ \触发中断/异常, Q' w0 i& }1 J7 j* c( ^ / \ PSP(非特权级、线程模式) MSP(特权级、handler模式)5 \; b8 ^& `* u# H1 i8 u) T / \2 _, f5 T: w/ U1 n4 J( A' b( K/ X 调用SVC,在handler下改写CONTROL[0]/ \ 中断/异常返回 / \3 }& Q# e7 ?* u+ V% H1 r MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式) PSP(特权级、线程模式) ————————————> MSP(特权级、线程模式) 0 P1 f* D8 Y& B& g 线程模式下操作CONTROL[1] 线程模式下操作CONTROL[1], A5 `! `: h% s 操作模式总结:! @+ x; f. T- C9 P& `# Y7 ^ 1. 复位后处理器进入线程模式+特权级 2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外) * b) O+ r( y' `- Q- @ /******************************** Flash ***********************************/! T3 f: I3 `$ x 主要特征:3 [5 y) W" s$ h6 s ? 1. 1Mbyte容量 2. 128bits位宽读取 3. 字节、半字、字、双字写入+ I" O. M" q" ~3 I) G d( H a 4. 可按扇区/块擦除! m. l6 h3 o/ X' R) q 5. 存储区块架构: 主存储区: 扇区 基址 尺寸 Sector0 0x08000000 16kbytes Sector1 0x08004000 16kbytes Sector2 0x08008000 16kbytes Sector3 0x0800C000 16kbytes Sector4 0x08010000 64kbytes8 }. L% O* T! g Sector5 0x08020000 128kbytes Sector6 0x08040000 128kbytes Sector7 0x08060000 128kbytes Sector8 0x08080000 128kbytes Sector9 0x080A0000 128kbytes Sector10 0x080C0000 128kbytes! J7 c* H( H r p# ]" V% w4 C Sector11 0x080E0000 128kbytes 系统存储区: 0x1FFF0000 30kbytes 一次性编程区: 0x1FFF7800 528bytes Flash配置字节: 0x1FFFC000 16bytes CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。 复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。4 }( p* g4 v7 u& Z+ F) {9 \2 k 更改时钟频率的标准顺序: 1. 增加时钟频率:( I% i; \2 w% O8 y2 ]/ @ 修改FLASH_ACR寄存器中的延时位LATENCY7 X. w! j! j2 p W7 q 确认延时是否修改成功 修改时钟源/预分频 确认是否修改成功(看RCC_CFGR中SWS标志位)& y! o" L5 K$ U0 {. T 2. 减小时钟频率: 修改时钟源/预分频4 A/ W8 f& z9 L0 P E. V 修改延时位LATENCY1 l8 R( v; h: c2 x8 l 确认延时是否修改成功 & C' u. V" |& Z3 w FLASH寄存器: FLASH_ACR: FLASH访问控制寄存器 //用于设置访问延时 FLASH_KEYR: 密钥寄存器 //用于FLASH解锁# f3 M1 f7 m! |+ U3 W! u FLASH_OPTKEYR: 配置字节密钥寄存器3 H" s+ {3 n: @$ B FLASH_SR: FLASH状态寄存器 //FLASH相关标志位 FLASH_CR: FLASH控制寄存器 //FLASH上锁、编程设置+ [6 M3 _ X, l# R3 f FLASH_OPTCR: 配置字节控制寄存器$ ~# y9 B% `: k9 ^: J* R4 ` 9 h) \/ F' [' y) ? FLASH操作:0 M" A! i0 g A/ |: ~ 1. 解锁/上锁 - |$ d' M# p/ a* s" E3 ?7 ` 对FLASH进行任何编程操作前都必须先进行解锁; 完成FLASH编程后建议上锁1 a' F' P9 @+ O- ~% q 2. 写入单位设置; j/ ^2 P+ q5 c8 `, f- x 写入单位跟供电电压和Vpp有关,详见RM手册 此设置必须在任何擦除/编程操作前进行 3. 擦除 扇擦除: 擦除前确认当前无FLASH操作 扇擦除位使能、选择擦除扇区3 ?: S1 D/ b1 ^% ^8 q( f 开始擦除7 V& y- G' O4 v: v 等待擦除完毕 整块擦除: 擦除前确认当前无FLASH操作& J' J& v9 N' I0 \/ g0 E+ |. Y2 S 块擦除位使能* O: e3 c0 d! D2 c% B5 Z 开始擦除2 M( O y* E. n, ~- ] 等待擦除完毕 ( I' _! M' t# o" {- ~; Q/ l- o& p 4. 写入4 p8 w8 t, }- J( o r 写入前确认当前FLASH无操作2 E8 t& x! p& h; t7 H 写入位使能! \; z( I; ^. |" B6 |1 k4 E7 y 根据写入单位设置执行写入: J' X7 f2 K5 D/ ~* Y5 r# { 等待写入完毕: P& X. k7 F) n/ l3 q( }& T , e4 W! A, j; X3 Z3 C 5 V& m8 Y. {+ V) M; l /******************************** EXTI ***********************************/8 Q8 H+ p U& v" @0 G9 ]0 ? 主要特征: 拥有23个边沿检测中断/事件控制器 //该模块类似于I/O中断6 T, }( Z7 @. w$ z3 ] 可以检测脉冲宽度低于APB2时钟宽度的外部信号7 [4 I: r9 X8 q# j1 h& \! M , [9 J5 I' p+ R' A$ S! R EXTI寄存器:) a8 A& b% u: ^. g. { EXTI_IMR: 中断屏蔽寄存器 EXTI_EMR: 事件屏蔽寄存器) g* m6 w" p. t9 P+ x+ i EXTI_RTSR: 上升沿触发选择寄存器) u# J* Q% C* [ EXTI_FTSR: 下降沿触发选择寄存器5 f# P0 u8 ^ |* I& f4 c3 G3 _; a* h# P EXTI_SWIER: 软件中断事件寄存器* ^) V5 Q; ]) P) v, N0 _) r EXTI_PR: 挂起寄存器+ p! M' s5 j1 P2 ~' ^ 初始化流程:; B/ t4 I' \$ E+ t' Q 1. 使能GPIOx端口时钟 2. 使能SYSCFG模块时钟) C( x: l9 T. ?- q4 }' l2 m2 q! J( Q 3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉) 4. 将EXTI的n号中断线跟管脚n相连1 M, C& q5 ]; Z$ _* d: T7 j( [ 5. 配置EXTI的n号中断线2 m" g2 P2 v' h( S6 J2 Q 6. 配置EXTI的n号中断的优先级并使能中断: ^, e/ D7 p9 { |
微信公众号
手机版