打印
[开发工具]

STM32CubeMX_05 | 使用EXIT中断检测按键

[复制链接]
1004|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本篇**主要介绍如何使用STM32CubeMX初始化STM32L431RCT6的EXIT检测按键,讲述了一些NVIC的小知识,并一步一步探索了HAL库的中断处理机制。

使用特权

评论回复
沙发
deadtime|  楼主 | 2020-3-29 18:53 | 只看该作者
1. 准备工作
硬件准备
开发板
首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):

使用特权

评论回复
板凳
deadtime|  楼主 | 2020-3-29 18:54 | 只看该作者
软件准备
需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;

Keil MDK和串口助手Serial Port Utility 的安装包都可以在文末关注公众号获取,回复关键字获取相应的安装包:

使用特权

评论回复
地板
deadtime|  楼主 | 2020-3-29 18:55 | 只看该作者
2.生成MDK工程
选择芯片型号
打开STM32CubeMX,打开MCU选择器:

使用特权

评论回复
5
deadtime|  楼主 | 2020-3-29 18:56 | 只看该作者
搜索并选中芯片STM32L431RCT6:

使用特权

评论回复
6
deadtime|  楼主 | 2020-3-29 18:56 | 只看该作者
配置时钟源
如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
如果使用默认内部时钟(HSI),这一步可以略过;
这里我都使用外部时钟:

使用特权

评论回复
7
deadtime|  楼主 | 2020-3-29 18:57 | 只看该作者
配置LED的GPIO引脚
查看小熊派开发板的原理图,如下:

使用特权

评论回复
8
deadtime|  楼主 | 2020-3-29 18:58 | 只看该作者
所以接下来我们选择配置PC13引脚:

使用特权

评论回复
9
deadtime|  楼主 | 2020-3-29 18:59 | 只看该作者
设置用户标签为LED:

使用特权

评论回复
10
deadtime|  楼主 | 2020-3-29 19:00 | 只看该作者
给PC13引脚设置一个user_label:

使用特权

评论回复
11
deadtime|  楼主 | 2020-3-29 19:01 | 只看该作者
这里给PC13引脚添加一个user_label后,cubemx软件会在main.h文件中添加一个宏定义,如图,我们可以使用LED_GPIO_Port, LED_Pin来表示这个引脚,提高了程序的可移植性。如果没有该user_label,就需要使用GPIOC,GPIO_PIN_13 来表示这个引脚。

使用特权

评论回复
12
deadtime|  楼主 | 2020-3-29 19:01 | 只看该作者
配置GPIO引脚为外部中断引脚
查看小熊派开发板的原理图,如下:

使用特权

评论回复
13
deadtime|  楼主 | 2020-3-29 19:02 | 只看该作者
所以接下来我们选择配置PB2引脚和PB3引脚为外部中断引脚:

使用特权

评论回复
14
deadtime|  楼主 | 2020-3-29 19:03 | 只看该作者
因为没有设置硬件上拉,所以我们配置开启上拉电阻,并设置用户标签为KEY1和KEY2,接下来是最重要的一步:

开启下降沿触发中断:即在按下按键时电平由高变为低时触发
开启上升沿触发中断:即在按下按键后松开时电平由低变为高时触发
开启下降沿上升沿都触发中断:即在按下时触发,松开时再次触发

使用特权

评论回复
15
deadtime|  楼主 | 2020-3-29 19:04 | 只看该作者
这里我选择开启下降沿触发中断:

使用特权

评论回复
16
deadtime|  楼主 | 2020-3-29 19:04 | 只看该作者
配置NVIC设置中断优先级

知识小卡片 —— NVIC
NVIC全称Nested vectored interrupt controller,即嵌套向量中断控制器,用来决定中断的优先级。

NVIC在 ARM Conrtex-M 内核中,用一个 8 位的寄存器来配置,总共可以配置$2^8=256$级中断,但是 ST 公司在生产 STM32 的时候,发现一个小小的单片机根本用不了这么多,纯属浪费,所以将该寄存器的低 4 位 全部置0,只使用高 4 位来配置,这样一来 STM32 就只有$2^4=16$级中断啦。

使用特权

评论回复
17
deadtime|  楼主 | 2020-3-29 19:05 | 只看该作者
再次强调一下,这5种中断分组规则是人为的,用哪种规则,之后设置具体的优先级时对应就行,STM32默认使用的规则是 NVIC_PriorityGroup_0 。

STM32 的CPU判断优先级的方法如下:

先判断抢占优先级,数字越小,优先级越高;
若抢占优先级相同,判断子优先级,同样,数字越小,优先级越高;

知识小卡片结束啦~ 对NVIC有没有了解呢?

使用特权

评论回复
18
deadtime|  楼主 | 2020-3-29 19:06 | 只看该作者
接下来在STM32CubeMX中配置中断优先级:

配置优先级分组

这里我配置使用中断优先级分组规则 NVIC_PriorityGroup_2:

使用特权

评论回复
19
deadtime|  楼主 | 2020-3-29 19:07 | 只看该作者
配置具体的优先级大小
根据中断优先级分组规则 NVIC_PriorityGroup_2来设置具体的优先级大小:

使用特权

评论回复
20
deadtime|  楼主 | 2020-3-29 19:07 | 只看该作者
配置时钟树
STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

470

帖子

2

粉丝