搜索
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[开发工具] STM32CubeMX_05 | 使用EXIT中断检测按键

[复制链接]
254|36
 楼主 | 2020-3-29 18:52 | 显示全部楼层 |阅读模式
本篇文章主要介绍如何使用STM32CubeMX初始化STM32L431RCT6的EXIT检测按键,讲述了一些NVIC的小知识,并一步一步探索了HAL库的中断处理机制。

使用特权

评论回复
 楼主 | 2020-3-29 18:53 | 显示全部楼层
1. 准备工作
硬件准备
开发板
首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):
723495e807e2e136e8.png

使用特权

评论回复
 楼主 | 2020-3-29 18:54 | 显示全部楼层
软件准备
需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;

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

使用特权

评论回复
 楼主 | 2020-3-29 18:55 | 显示全部楼层
2.生成MDK工程
选择芯片型号
打开STM32CubeMX,打开MCU选择器:
269945e807e9307cfc.png

使用特权

评论回复
 楼主 | 2020-3-29 18:56 | 显示全部楼层
搜索并选中芯片STM32L431RCT6:

883885e807ebdee852.png

使用特权

评论回复
 楼主 | 2020-3-29 18:56 | 显示全部楼层
配置时钟源
如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
如果使用默认内部时钟(HSI),这一步可以略过;
这里我都使用外部时钟:
175835e807ee4e927a.png

使用特权

评论回复
 楼主 | 2020-3-29 18:57 | 显示全部楼层
配置LED的GPIO引脚
查看小熊派开发板的原理图,如下:
671385e807f121c993.png

使用特权

评论回复
 楼主 | 2020-3-29 18:58 | 显示全部楼层
所以接下来我们选择配置PC13引脚:
904275e807f4aceb31.png

使用特权

评论回复
 楼主 | 2020-3-29 18:59 | 显示全部楼层
设置用户标签为LED:

677615e807f7487581.png

使用特权

评论回复
 楼主 | 2020-3-29 19:00 | 显示全部楼层
给PC13引脚设置一个user_label:
459395e807facbfab2.png

使用特权

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

479375e807fe4db45b.png

使用特权

评论回复
 楼主 | 2020-3-29 19:01 | 显示全部楼层
配置GPIO引脚为外部中断引脚
查看小熊派开发板的原理图,如下:

641025e8080099ebe1.png

使用特权

评论回复
 楼主 | 2020-3-29 19:02 | 显示全部楼层
所以接下来我们选择配置PB2引脚和PB3引脚为外部中断引脚:
370565e8080325c753.png

使用特权

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

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

使用特权

评论回复
 楼主 | 2020-3-29 19:04 | 显示全部楼层
这里我选择开启下降沿触发中断:
921055e80809d40071.png

使用特权

评论回复
 楼主 | 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$级中断啦。

使用特权

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

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

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

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

使用特权

评论回复
 楼主 | 2020-3-29 19:06 | 显示全部楼层
接下来在STM32CubeMX中配置中断优先级:

配置优先级分组

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

使用特权

评论回复
 楼主 | 2020-3-29 19:07 | 显示全部楼层
配置具体的优先级大小
根据中断优先级分组规则 NVIC_PriorityGroup_2来设置具体的优先级大小:

545295e80814d6e10f.png

使用特权

评论回复
 楼主 | 2020-3-29 19:07 | 显示全部楼层
配置时钟树
STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:

29775e808179d0e9d.png

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表