STMCU小助手
发布时间:2021-12-3 16:00
|
STM32F207笔记 /******************************** NVIC ***********************************/ 6 {; E3 _2 h9 V" a: w- n' Y3 G- _, z4 U! C g主要特征:7 X( }8 _/ p+ K$ W+ N$ ?8 j% n2 h; t 拥有81个中断源 //不包括16个内部异常;标准M3可最多拥有240个中断源 16级可编程优先级 //标准M3可最多拥有128级可编程优先级 优先级又被分为抢占优先级和亚优先级两段 NVIC模块寄存器地址列表: //NVIC模块基址0xE000E100- C: s" E w% ~( J! j/ [" v 地址偏移量 寄存器 ' P" P7 L& L* o9 [" Y5 b6 m. z: T 0x000 NVIC_ISER0 //中断使能/除能寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)* A$ Y5 e5 W3 {* I9 i- ]' V u0 {# x 0x004 NVIC_ISER1' r* s# K5 F# P7 ~! x1 s 0x008 NVIC_ISER2! k) N( | b: {0 j0 z RESERVED 0x080 NVIC_ICER0 0x084 NVIC_ICER1$ n% z+ l+ U @' Z 0x088 NVIC_ICER2 RESERVED, Z- H# @/ Y# A- b: e 0x100 NVIC_ISPR0 //中断悬起/解悬寄存器数组,标准M3共有8对(32*8=256)(不用满),STM32F2只用3对(32*3=96)(不用满)9 P$ h Q6 ~5 Q; P 0x104 NVIC_ISPR1 0x108 NVIC_ISPR28 }. H0 W/ J& j1 l, l RESERVED 0x180 NVIC_ICPR0: J, C: u$ s4 A/ }2 ]+ I9 h! o 0x184 NVIC_ICPR1 0x188 NVIC_ICPR0* R2 k2 e! }: d/ a2 M RESERVED, E% F3 r. w* a3 G 0x200 NVIC_IABR0 //中断活动状态寄存器数组,标准M3共有8个(32*8=256)(不用满),STM32F2只用3个(32*3=96)(不用满) 0x204 NVIC_IABR1 0x208 NVIC_IABR2 RESERVED 0x300~0x320 NVIC_IPR0~NVIC_IPR80 //中断优先级寄存器数组,标准M3共有240个,STM32F2只有81个 1个特例寄存器: NVIC_STIR:软件触发中断寄存器 //地址:0xE000EF00,该功能需要在SCB->CCR中使能# C% C/ i" K( s0 _: V0 r5 S //用于触发外部中断,[7:0]位有效,对应0~239号中断2 b; i0 i) I5 Z! U 异常和中断优先级配置: 1. 除了NMI,其余异常和中断的优先级均可自由编程 //标准M3还要除了复位、硬fault这两个异常1 o. v1 J, m5 H+ P' `* O. y 2. 异常和中断优先级寄存器NVIC_IPRn只使用高4位,所以拥有16级可编程优先级: //标准M3最少使用3位,MSB对齐 0x00;0x10;0x20;0x30;0x40;0x50;0x60;0x70;0x80;0x90;0xa0;0xb0;0xc0;0xd0;0xe0;0xf00 r: r) _0 G$ h" S4 T: M% i 3. 16级优先级又被分为抢占优先级和亚优先级,分法跟SCB模块中AIRCR寄存器内的“优先级组”段位设置有关,详见PM 6 e% |! a# T, v3 I) ` 4. 抢占优先级的方法即实现了中断嵌套机制 5. 当抢占优先级相同时,响应亚优先级最高的异常或中断,但不会再发生抢占0 e; f$ \' K; N1 k# s, }/ K# T 6. 异常和中断优先级寄存器都可按字节读写 7. 固件库中misc.c中NVIC_Init()函数存在小BUG:由于SCB_AIRCR寄存器中“优先级分组”段复位值为0b000,所以调用该函数前必须先设定优先级分组值$ }$ d2 l" f6 b% d2 g% W- b# l& U 8. 不同中断源优先级可以设为相同!!!& }8 D8 o2 C, V9 o: W; [1 g3 J $ H( h1 M6 G v" G/ ]/ b$ G 5 m% O/ p6 f6 S3 k& @ /******************************** SCB ***********************************/* X1 }# O2 B* G8 k SCB模块寄存器地址列表: //SCB模块基址0xE000ED00 地址偏移量 寄存器 0x00 SCB_CPUID ) A* Y, d4 |/ B( g& r. R) j 0x04 SCB_ICSR //中断控制及状态寄存器,主要用于悬起/解悬系统异常 0x08 SCB_VTOR //向量表偏移量寄存器,包含向量表基址(也就是RAM/ROM地址中选择) + 偏移值(必须确保是0x200的倍数)1 |* j! r& R6 i! e+ A" X //STM32F2默认值为0x08000000,正好对在ROM基址上$ H9 e, s& e0 r+ E2 p; [ u 0x0C SCB_AIRCR //中断和复位控制寄存器,任何对该寄存器的写入,都必须同时写入0x05FA(访问钥匙)主要用于配置优先级分组5 [7 P( `% @9 Q: m' [3 A 0x10 SCB_SCR //系统控制寄存器,跟睡眠/唤醒相关 0x14 SCB_CCR //配置和控制寄存器,主要跟异常响应相关+ P1 {& f K8 ]5 s //注意点,STM32F2此处跟F1存在区别:复位值为0x00000200,即默认开启双字对齐管理机制 0x18 SCB_SHPR1 //系统异常优先级寄存器1~3,STM32F2使用了6个系统异常 0x1C SCB_SHPR2 ' D# c3 e. W5 F 0x20 SCB_SHPR36 l8 B* V' ^! P 0x24 SCB_SHCRS //系统异常控制和状态寄存器,功能类似于NVIC_IABRn0 v7 G3 r# b4 I$ P. ^ 0x28 SCB_CFSR //以下几个暂时不管 0x2C SCB_HFSR 0x34 SCB_MMAR( |- h) f; b$ [" H 0x38 SCB_BFAR* D: ?* w% i- A5 \* ~9 L' b % Z/ J3 Z0 f: p8 O4 ^ /******************************** 特殊功能寄存器组 ***********************************/ CONTROL:控制寄存器- Z8 Q$ H1 _+ C0 m; I. O; m! M 仅当在特权级下操作时才允许写该寄存器 !!! 1. CONTROL[0]: 用于选择处理器模式为特权级/非特权级0 t! g4 H2 q+ Z# Z2 ~: Z! S9 @ 特权级非特权级切换流程如下:, E$ r3 p* |+ l5 E 特权级——————————>非特权级———————————————————————————————————>特权级- O; G' o& g: T0 I$ j CONTROL寄存器 |= 0x01 调用系统服务呼叫指令SVC产生一个SVC异常,从而从thread模式进入handler模式, 而handler模式永远是特权级,也就可以改写CONTROL寄存器,真正回到特权级 + z. V, V( j( r 7 D% N* V7 Z( d7 Y+ { 2. CONTROL[1]: 用于选择当前使用哪个堆栈指针( v4 c. x2 U. ]" t0 u; e: R 仅当在线程模式下操作时才允许写该位,而handler模式永远是MSP堆栈,该位写入无效 " Y* d @; s; I# e MSP/PSP切换流程如下: MSP(特权级、线程模式)——————————————>PSP(特权级、线程模式)——————————————> MSP(特权级、线程模式) 线程模式下操作CONTROL[1] / \ 线程模式下操作CONTROL[1]2 C% a, A' X) o W0 A& ~# C / \ 操作CONTROL[0]/ \触发中断/异常 / \1 W- a$ I8 K2 X3 g# P% X! J9 \- f PSP(非特权级、线程模式) MSP(特权级、handler模式) / \ 调用SVC,在handler下改写CONTROL[0]/ \ 中断/异常返回 / \. V* [7 M' N! j( t MSP(特权级、线程模式)<——————————————PSP(特权级、线程模式) PSP(特权级、线程模式) ————————————> MSP(特权级、线程模式) 9 B! h0 ~5 a/ }2 m 线程模式下操作CONTROL[1] 线程模式下操作CONTROL[1]. D" r# w( h- z4 f/ \, a 4 G% w- C' p; w, K- G 操作模式总结: 1. 复位后处理器进入线程模式+特权级 2. 线程模式+非特权级下,对SCB、NVIC、Systick、MPU模块的访问被拒绝;同时不能用MSR访问特殊功能寄存器(APSR例外) . g8 i8 N* _% u n4 \' r 8 Q" _, Z4 ?+ q /******************************** Flash ***********************************/ 主要特征:# s. x8 [% G+ {7 |0 m8 y) \ 1. 1Mbyte容量* }8 B# K8 t7 o+ b2 J9 |9 `- x5 _% a- H 2. 128bits位宽读取 3. 字节、半字、字、双字写入 4. 可按扇区/块擦除3 C' {9 I. E$ d* H: o 5. 存储区块架构: 主存储区: 扇区 基址 尺寸 Sector0 0x08000000 16kbytes3 h2 t1 I- k2 d. E7 h. {* g, J Sector1 0x08004000 16kbytes* b1 w/ D- q" y" Z i# Q5 K( x8 d Sector2 0x08008000 16kbytes6 z) _ X7 ^& T! m/ t Sector3 0x0800C000 16kbytes0 g& t( O7 |, A7 R Sector4 0x08010000 64kbytes Sector5 0x08020000 128kbytes) i6 ~& o t z7 T) d9 ?! i) e+ ~ Sector6 0x08040000 128kbytes/ Z5 v1 {1 v; W Sector7 0x08060000 128kbytes1 t! W, [2 ?/ _ Sector8 0x08080000 128kbytes Sector9 0x080A0000 128kbytes8 V& E: | R6 _7 M/ V Sector10 0x080C0000 128kbytes/ F' w; \7 S$ H2 k( W! v Sector11 0x080E0000 128kbytes 系统存储区: 0x1FFF0000 30kbytes1 F. R O! V. w; A 一次性编程区: 0x1FFF7800 528bytes, N$ w3 K5 N- v' T" p4 Q Flash配置字节: 0x1FFFC000 16bytes' w3 s+ O2 E5 {1 M) j" f9 ]1 f- t CPU时钟和Flash读取延时关系:根据时钟频率和供电电压需要在FLASH_ACR寄存器配置相应的延迟LATENCY,详见RM手册。 复位时FLASH_ACR中默认配置为16MHZ时钟和0延迟。 更改时钟频率的标准顺序: 1. 增加时钟频率:% X' k% h& ~3 Z# B0 _! h7 q) } 修改FLASH_ACR寄存器中的延时位LATENCY 确认延时是否修改成功9 O/ U; t5 i. G' U. p1 n& ^- { 修改时钟源/预分频+ s( f* [3 `8 x/ \( l 确认是否修改成功(看RCC_CFGR中SWS标志位)/ q# x, O1 T1 R' p4 t 2. 减小时钟频率: 修改时钟源/预分频 修改延时位LATENCY 确认延时是否修改成功 5 }) g. O5 |8 g. N/ ` FLASH寄存器: FLASH_ACR: FLASH访问控制寄存器 //用于设置访问延时 FLASH_KEYR: 密钥寄存器 //用于FLASH解锁 _7 m* r& A# f: N FLASH_OPTKEYR: 配置字节密钥寄存器 FLASH_SR: FLASH状态寄存器 //FLASH相关标志位 FLASH_CR: FLASH控制寄存器 //FLASH上锁、编程设置8 w8 a, G+ j2 d FLASH_OPTCR: 配置字节控制寄存器 , a9 W; p( u) |8 M$ N& E- B FLASH操作:! G3 q7 ]) s+ a" r 1. 解锁/上锁 5 ^, W6 \6 V# B5 o- N' i 对FLASH进行任何编程操作前都必须先进行解锁; _! m; R! `& F: C5 \' W+ ?6 g 完成FLASH编程后建议上锁 2. 写入单位设置 写入单位跟供电电压和Vpp有关,详见RM手册 此设置必须在任何擦除/编程操作前进行4 P% \' ~' q2 l3 ?; f4 Q1 w5 B. U 3. 擦除" k: n! M0 @% _ { 扇擦除: 擦除前确认当前无FLASH操作 扇擦除位使能、选择擦除扇区$ {9 a' c8 }/ }7 o( ~, f 开始擦除! l: T: N0 W+ t) X 等待擦除完毕7 C8 w+ i/ y$ X3 s0 ] 整块擦除: 擦除前确认当前无FLASH操作 块擦除位使能 开始擦除 等待擦除完毕 2 D# Z) S3 `4 S1 J* M 4. 写入 写入前确认当前FLASH无操作 写入位使能 根据写入单位设置执行写入 等待写入完毕# R' a# l c# G& ?/ v9 ^( j ) S4 E2 n, z# T7 Q /******************************** EXTI ***********************************/% T: b, A- O7 C/ f 主要特征:) Y$ |9 v+ L! q! K1 ]* ~5 m9 \1 ? 拥有23个边沿检测中断/事件控制器 //该模块类似于I/O中断 可以检测脉冲宽度低于APB2时钟宽度的外部信号 . k/ ]) X9 I# F2 g7 T6 k0 q, N EXTI寄存器: EXTI_IMR: 中断屏蔽寄存器1 K9 D9 Y7 r' I5 {) V EXTI_EMR: 事件屏蔽寄存器 EXTI_RTSR: 上升沿触发选择寄存器7 n/ E+ j9 D: a+ v' p( k% u8 P EXTI_FTSR: 下降沿触发选择寄存器3 R) F- ]0 t* T. ?1 G* C8 v EXTI_SWIER: 软件中断事件寄存器& s& Z( J/ I) G& @3 J1 |& x EXTI_PR: 挂起寄存器* Z& V( C! e" O % Y- H6 _+ i* T# P/ V( } 初始化流程:6 E( f' ]" D- @: j7 U4 z0 ] 1. 使能GPIOx端口时钟 2. 使能SYSCFG模块时钟 3. 配置GPIOx的某个管脚n(n:0~15)为输入模式(无上下拉) 4. 将EXTI的n号中断线跟管脚n相连0 C5 }! ~$ Z4 S$ |3 Z7 z: K 5. 配置EXTI的n号中断线3 {- F# D* E* W& _2 V 6. 配置EXTI的n号中断的优先级并使能中断9 H1 x4 A$ [- [9 }: o . s2 J( q- f. I |
微信公众号
手机版