STMCU小助手
发布时间:2021-12-3 16:00
|
STM32F207笔记 /******************************** NVIC ***********************************/ 主要特征:" M# E; E/ _0 q& O3 { 拥有81个中断源 //不包括16个内部异常;标准M3可最多拥有240个中断源* q3 ?( }8 ?6 \ ? 16级可编程优先级 //标准M3可最多拥有128级可编程优先级* p3 N9 M/ S1 |* P. U 优先级又被分为抢占优先级和亚优先级两段 NVIC模块寄存器地址列表: //NVIC模块基址0xE000E1002 |. d! K/ \! g 地址偏移量 寄存器 : A I$ J& V1 r: h% U, m1 T 0x000 NVIC_ISER0 //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满) 0x004 NVIC_ISER15 u' A; y$ \, ^5 k5 k6 Z 0x008 NVIC_ISER23 U: l6 \2 f: _3 v8 X& Z# ] RESERVED" L. w8 G: d7 S6 x& I' B) X; v 0x080 NVIC_ICER0, S$ y! K: U+ x f( H 0x084 NVIC_ICER18 E9 p* U4 y; w5 ~* t/ k: C2 { e$ a+ c 0x088 NVIC_ICER2 RESERVED/ V8 v, [4 ]- B# I# ?* o4 ^ 0x100 NVIC_ISPR0 //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满) 0x104 NVIC_ISPR1+ M2 I* t) H& q8 ^" L) n 0x108 NVIC_ISPR2 RESERVED 0x180 NVIC_ICPR0- n8 n- n% K; ? F$ Q/ _. X) r 0x184 NVIC_ICPR1! ?% j* k( B" p4 W: f 0x188 NVIC_ICPR0 RESERVED 0x200 NVIC_IABR0 //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满) 0x204 NVIC_IABR19 p5 A6 D0 N% e6 n! b; R1 q% P 0x208 NVIC_IABR2+ j/ I0 h0 O4 f RESERVED) P. z, ~' y% u F" \% L8 ]6 v 0x300~0x320 NVIC_IPR0~NVIC_IPR80 //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个; M2 @4 d, @: b1 r( Q% q 1个特例寄存器: NVIC_STIR:软件触发中断寄存器 //地址:0xE000EF00,该功能需要在SCB->CCR中使能+ n9 t2 D& _0 Y9 A q0 q) Y //用于触发外部中断,[7:0]位有效,对应0~239号中断 异常和中断优先级配置: 1. 除了NMI,其余异常和中断的优先级均可自由编程 //标准M3还要除了复位、硬fault这两个异常 2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级: //标准M3最少使用3位,MSB对齐8 Y; l' ~% c1 F2 k- P! e% C 0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf0 3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM 4. 抢占优先级的方法即实现了中断嵌套机制 5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占 6. 异常和中断优先级寄存器都可按字节读写8 x3 W. p7 Q; A1 W 7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值' c, ]7 T/ F' b }+ k8 ? 8. 不同中断源优先级可以设为相同!!!' n& H2 \: ^7 d7 N" t2 O; @% I7 ` & N/ Q% G Z. N4 h6 j* w /******************************** SCB ***********************************/ SCB模块寄存器地址列表: //SCB模块基址0xE000ED007 M3 M) X% r) ~) U 地址偏移量 寄存器; U1 M/ U& o8 t 0x00 SCB_CPUID 5 @8 k. Z. |- i# I5 S 0x04 SCB_ICSR //中断控制及状态寄存器,主要用于悬起/解悬系统异常 0x08 SCB_VTOR //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数). l0 i! n" O U! ~3 L2 u1 J) l //STM32F2默认值为0x08000000,正好对在ROM基址上' J# N# c% Z% t" ?3 e 0x0C SCB_AIRCR //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组4 c; o9 s3 P' [; i& x8 {. h* O+ q 0x10 SCB_SCR //系统控制寄存器,跟睡眠/唤醒相关 0x14 SCB_CCR //配置和控制寄存器,主要跟异常响应相关4 v& y; J( J) @ Z, w# w1 F- W //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制1 i7 N+ B* D, m* Z 0x18 SCB_SHPR1 //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常 0x1C SCB_SHPR2 6 U. @+ v/ g# |+ E 0x20 SCB_SHPR3 0x24 SCB_SHCRS //系统异常控制和状态寄存器,功能类似于NVIC_IABRn 0x28 SCB_CFSR //以下几个暂时不管8 V- t' @- k# O+ S% Q6 M 0x2C SCB_HFSR 0x34 SCB_MMAR 0x38 SCB_BFAR0 S+ A& t! ~% j! Q) d , O# Y r1 Q4 ^* Q# e; H /******************************** 特殊功能寄存器组 ***********************************/ CONTROL:控制寄存器8 ~1 Q) S6 J, q- H6 p 仅当在特权级下操作时才允许写该寄存器 !!! 1. CONTROL[0]: 用于选择处理器模式为特权级/非特权级* e" R8 c/ o; {% q' S: _& Z) E 特权级非特权级切换流程如下:) w0 D" }6 j# x; O. R( z 特权级——————————>非特权级———————————————————————————————————>特权级 CONTROL寄存器 |= 0x01 调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式, ; X- B9 q X. A1 ^* A4 _- X7 k k. P 而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级 ) A/ r6 l+ J4 a6 T ?+ _+ C ! ?+ l( U4 V9 f) p% ? 2. CONTROL[1]: 用于选择当前使用哪个堆栈指针( d8 k4 s7 T1 ?( e" C$ V 仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效 MSP/PSP切换流程如下:0 I# m% [1 z3 h, { MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] / \ 线程模式下操作CONTROL[1]5 `( ~# O Z- _9 O$ k: }! q; Q / \ 操作CONTROL[0]/ \触发中断/异常 / \9 H9 l2 O" x7 ?7 b! }& \ PSP(非特权级、线程模式) MSP(特权级、handler模式) / \ 调用SVC,在handler下改写CONTROL[0]/ \ 中断/异常返回 / \% J2 r: h2 @) D! k MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式) PSP(特权级、线程模式) ————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] 线程模式下操作CONTROL[1] 操作模式总结: 1. 复位后处理器进入线程模式+特权级 2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外) 4 \5 d5 [9 j5 g& R! y7 { /******************************** Flash ***********************************/- S& F8 z5 \ {) l5 l! w; C' e 主要特征: 1. 1Mbyte容量# I, O% h' `9 G* n0 F" v 2. 128bits位宽读取" j' e3 q4 \- } 3. 字节、半字、字、双字写入 4. 可按扇区/块擦除- D! _, |# j' k# G 5. 存储区块架构:3 {% t2 B6 G/ F, V! _, y$ u4 S 主存储区: 扇区 基址 尺寸7 r$ l l% ~! Y$ }- z `1 Q$ C0 R0 z; b Sector0 0x08000000 16kbytes4 ~* A; h6 ` g$ s9 c Sector1 0x08004000 16kbytes8 B8 _* Y; S" J1 A7 b Sector2 0x08008000 16kbytes; g. @, D; h' @. C/ N8 Z Sector3 0x0800C000 16kbytes Sector4 0x08010000 64kbytes+ q+ x& [$ x3 h6 \9 f Sector5 0x08020000 128kbytes Sector6 0x08040000 128kbytes Sector7 0x08060000 128kbytes, T( j" o3 o) M' Q5 m Sector8 0x08080000 128kbytes Sector9 0x080A0000 128kbytes Sector10 0x080C0000 128kbytes% D" h+ N: E, K" J Sector11 0x080E0000 128kbytes 系统存储区: 0x1FFF0000 30kbytes 一次性编程区: 0x1FFF7800 528bytes Flash配置字节: 0x1FFFC000 16bytes5 K4 `$ I- z1 }9 P! v! {2 ?5 b7 V CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。 复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。 更改时钟频率的标准顺序:/ n- z& d' P& ?5 v 1. 增加时钟频率: 修改FLASH_ACR寄存器中的延时位LATENCY 确认延时是否修改成功+ p, R! o2 Z/ j Q3 K 修改时钟源/预分频 确认是否修改成功(看RCC_CFGR中SWS标志位) 2. 减小时钟频率:& G6 f8 B( x4 [& V& j 修改时钟源/预分频 修改延时位LATENCY 确认延时是否修改成功3 e4 j! ?2 U3 ~2 D FLASH寄存器:3 h# F1 p) A& V6 m$ @ FLASH_ACR: FLASH访问控制寄存器 //用于设置访问延时 G4 P6 r5 k3 r% m3 B FLASH_KEYR: 密钥寄存器 //用于FLASH解锁 FLASH_OPTKEYR: 配置字节密钥寄存器: j, X/ P# G! a/ V. @; X8 X, j FLASH_SR: FLASH状态寄存器 //FLASH相关标志位! i! t/ [5 ^7 j( u$ F FLASH_CR: FLASH控制寄存器 //FLASH上锁、编程设置 FLASH_OPTCR: 配置字节控制寄存器 , M& B; m# J! |- f- |) J4 s R" k& A FLASH操作:0 o/ ~$ Y4 \7 W, H. [. N4 `* n 1. 解锁/上锁 % t9 z! j4 r: g: W! l: r& P+ W 对FLASH进行任何编程操作前都必须先进行解锁; 完成FLASH编程后建议上锁 2. 写入单位设置' C, a1 y, G$ m w$ m# U 写入单位跟供电电压和Vpp有关,详见RM手册% f& l0 w# y6 F) @ 此设置必须在任何擦除/编程操作前进行% k$ t! Z* V4 @( {: y 3. 擦除; c9 D$ a: ?6 W# T9 u V+ N8 f0 J 扇擦除:$ d3 t @3 n' w! Z 擦除前确认当前无FLASH操作" J& K$ g9 w# \8 p1 e9 N+ N 扇擦除位使能、选择擦除扇区1 m5 _2 b Z5 B( q 开始擦除 等待擦除完毕 整块擦除:6 A0 H4 q, f W+ ] {" o 擦除前确认当前无FLASH操作8 h, \- |& u* S! ]: U) D* r! m9 M 块擦除位使能 开始擦除 @+ D3 U* l* b$ J% l9 F) i, w' v5 G) B 等待擦除完毕 4. 写入7 I/ S- u/ Q2 x" }) y. L/ H 写入前确认当前FLASH无操作; S, {0 B% `7 u$ e0 q3 d' X 写入位使能 根据写入单位设置执行写入+ ]: w) t4 R% u' k6 U1 S 等待写入完毕( w" r- d5 U( u /******************************** EXTI ***********************************/ 主要特征: 拥有23个边沿检测中断/事件控制器 //该模块类似于I/O中断# C# P, H+ Z1 D/ g T 可以检测脉冲宽度低于APB2时钟宽度的外部信号: @7 N$ g7 {$ z, U. R ; q: W; C; x0 z EXTI寄存器:& F# y1 d, h9 Q' [ N$ y4 l EXTI_IMR: 中断屏蔽寄存器 EXTI_EMR: 事件屏蔽寄存器 EXTI_RTSR: 上升沿触发选择寄存器 EXTI_FTSR: 下降沿触发选择寄存器 EXTI_SWIER: 软件中断事件寄存器- Y, L- L: P/ Q4 ^ ~; ] EXTI_PR: 挂起寄存器" t0 |+ q. N, E& w 4 n: p8 b0 F; y& D+ m8 w2 O; D 初始化流程: 1. 使能GPIOx端口时钟, g% @9 I4 R% L+ F; U4 E 2. 使能SYSCFG模块时钟 3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉)/ l. c7 a1 t3 ^& k4 [( n 4. 将EXTI的n号中断线跟管脚n相连9 |% g- a& f) R$ _+ U% C& A5 L8 Z& ~ 5. 配置EXTI的n号中断线 6. 配置EXTI的n号中断的优先级并使能中断 ]& S% a1 I+ b ' X: K8 @$ X/ z$ @ |
微信公众号
手机版