标题:
STM32总结(3)
[打印本页]
作者:
look_w
时间:
2017-9-23 14:43
标题:
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_Pin
、
GPIO_Speed
、
GPIO_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 中断模式,用来捕捉外部信号,可以配置为下降沿中断,上升沿中断和上升下降沿中断这三种模式。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0