首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32总结(3)

STM32总结(3)

九、STM32 的时钟系统STM32 芯片为了实现低功耗,设计了一个功能完善但却非常复杂的时钟系统。普通的MCU,一般只要配置好 GPIO 的寄存器,就可以使用了,但 STM32还有一个步骤,就是开启外设时钟。
为什么 STM32 的时钟系统如此复杂,有倍频、分频及一系列的外设时钟的开关。需要倍频是考虑到电磁兼容性,如外部直接提供一个 72MHz 的晶振,太高的振荡频率可能会给制作电路板带来一定的难度。分频是因为STM32 既有高速外设又有低速外设,各种外设的工作频率不尽相同,如同pc 机上的南北桥,把高速的和低速的设备分开来管理。最后,每个外设都配备了外设时钟的开关,当我们不使用某个外设时,可以把这个外设时钟关闭,从而降低STM32的整体功耗。所以,当我们使用外设时,一定要记得开启外设的时钟。
十、一些库函数解析初始化库函数——GPIO_Init()


1. typedefstruct
2. {
3. uint16_t GPIO_Pin;/*指定将要进行配置的GPIO引脚*/
4. GPIOSpeed_TypeDefGPIO_Speed;/*指定GPIO引脚可输出的最高频率*/
5. GPIOMode_TypeDef GPIO_Mode;/*指定GPIO引脚将要配置成的工作状态*/
6. }GPIO_InitTypeDef;



1. #define GPIO_Pin_0 ((uint16_t)0x0001)/*!< Pin 0 selected */
2. #define GPIO_Pin_1 ((uint16_t)0x0002)/*!< Pin 1 selected */
3. #define GPIO_Pin_2 ((uint16_t)0x0004)/*!< Pin 2 selected */
4. #define GPIO_Pin_3 ((uint16_t)0x0008)/*!< Pin 3 selected */

这些宏的值,就是允许我们给结构体成员 GPIO_Pin 赋的值,如我们给 GPIO_Pin 赋值为宏GPIO_Pin_0,表示我们选择了GPIO 端口的第 0 个引脚,在后面会通过一个函数把这些宏的值进行处理,设置相应的寄存器,实现我们
对 GPIO 端口的配置。

1. typedefenum
2. {
3. GPIO_Speed_10MHz = 1, //枚举常量,值为1,代表输出速率最高为10MHz
4. GPIO_Speed_2MHz, //对不赋值的枚举变量,自动加1,此常量值为2
5. GPIO_Speed_50MHz //常量值为3
6. }GPIOSpeed_TypeDef;
这是一个枚举类型,定义了三个枚举常量,这些常量可用于标识 GPIO 引脚可以配置成的各个最高速度。所以我们在为结构体中的 GPIO_Speed赋值的时候,就可以直接用这些含义清晰的枚举标识符了。

1. typedef enum
2. { GPIO_Mode_AIN = 0x0, //模拟输入模式
3. GPIO_Mode_IN_FLOATING = 0x04, //浮空输入模式
4. GPIO_Mode_IPD = 0x28, //下拉输入模式
5. GPIO_Mode_IPU = 0x48, //上拉输入模式
6. GPIO_Mode_Out_OD = 0x14, //开漏输出模式
7. GPIO_Mode_Out_PP = 0x10, //通用推挽输出模式
8. GPIO_Mode_AF_OD = 0x1C, //复用功能开漏输出
9. GPIO_Mode_AF_PP = 0x18 //复用功能推挽输出
10. }GPIOMode_TypeDef;

于是,我们可以总结 GPIO_InitTypeDef类型结构体的作用,整个结构体包含 GPIO_PinGPIO_SpeedGPIO_Mode三个成员,我们对这三个成员赋予不同的数值可以对 GPIO 端口进行不同的配置,而这些可配置的数值,已经由 ST 的库文件封装成见名知义的枚举常量。这使我们编写代码变得非常简便。
当然,你也可以手动查数据手册一位位的赋值,但这样效率很低,而且不宜交流与查错。
十一、STM32 的中断和异常Cortex 内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(exception)中断(interrupt),并把它们用一个表管理起来,编号为0~15 的称为内核异常,而 16 以上的则称为外部中断(外,相对内核而言),这个表就称为中断向量表
而 STM32 对这个表重新进行了编排,把编号从-3 至 6 的中断向量定义为系统异常, 编号为负的内核异常不能被设置优先级,如复位(Reset)、不可屏蔽中断(NMI)、硬错误(Hardfault)。从编号7 开始的为外部中断,这些中断的优先级都是可以自行设置的。

NVIC中断控制器
STM32 的中断如此之多,配置起来并不容易,因此,我们需要一个强大而方便的中断控制器NVIC (Nested VectoredInterrupt Controller)。 NVIC 是属于 Cortex 内核的器件,不可屏蔽中断 (NMI)和外部中断都由它来处理,而 SYSTICK 不是由 NVIC 来控制的。

抢占优先级和响应优先级 STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高
抢占,是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断 (在执行中断服务函数 A 的过程中被中断 B 打断,执行完中断服务函数 B 再继续执行中断服务函数 A),抢占属性由NVIC_IRQChannelPreemptionPriority的参数配置。

而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达,则先处理响应优先级高的中断,响应属性由NVIC_IRQChannelSubPriority的参数配置。
NVIC的优先级组
在配置优先级的时候,还要注意一个很重要的问题,中断种类的数量。 NVIC 只可以配置 16 中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4 位的数字来决定, 把这个 4 位数字的位数分配成抢占优先级部分和响应优先级部分。有 5 组分配方式:
第 0 组: 所有 4 位用来配置抢占优先级,即 NVIC 配置的 24 =16种中断向量都是只有抢占属性,没有响应属性。
第 1 组:最高 1 位用来配置抢占优先级,低 3 位用来配置响应优先级。表示有 21=2种级别的抢占优先级(0级, 1 级),有 23=8种响应优先级,即在 16种中断向量之中,有8 种中断,其抢占优先级都为 0 级,而它们的响应优先级
分别为 0~7,其余 8 种中断向量的抢占优先级则都为 1 级,响应优先级别分别为 0~7。

第 2 组: 2 位用来配置抢占优先级, 2 位用来配置响应优先级。即 22=4种抢占优先级, 22=4种响应优先级。
第 3 组:高 3 位用来配置抢占优先级,最低 1 位用来配置响应优先级。即有 8 种抢占优先级, 2 种响应 2 优先级。
第 4 组:所有 4 位用来配置响应优先级。即 16 种中断向量具有都不相同的响应优先级。

STM2 单片机的所有 I/O 端口都可以配置为 EXTI 中断模式,用来捕捉外部信号,可以配置为下降沿中断,上升沿中断和上升下降沿中断这三种模式。
返回列表