最详细STM32,cubeMX外部中断

举报
糖果罐子 发表于 2023/10/31 20:30:26 2023/10/31
【摘要】 > 这篇文章将详细介绍 cubeMX外部中断的配置,实现过程。@[TOC](文章目录)---# 前言- 实验开发板:STM32F103C8T6。- 所需软件:keil5 , cubeMX 。- 实验目的:外部中断的意义,cubeMX配置和实现 等 。---# 一、外部中断的基础知识。对于外部中断的基础知识,可以参考我之前的文章:[STM32 EXTI外部中断](https://blog.cs...

> 这篇文章将详细介绍 cubeMX外部中断的配置,实现过程。

@[TOC](文章目录)



---

# 前言

- 实验开发板:STM32F103C8T6。
- 所需软件:keil5 , cubeMX 。
- 实验目的:外部中断的意义,cubeMX配置和实现 等 。


---
# 一、外部中断的基础知识。
对于外部中断的基础知识,可以参考我之前的文章:[STM32 EXTI外部中断](https://blog.csdn.net/wuyiyu_/article/details/129267370)

# 二、cubeMX 配置外部中断
1. 选择芯片。
![在这里插入图片描述](https://img-blog.csdnimg.cn/26f7fa285db849358862607d5e0688c9.png)
2. 配置仿真。(如果不配置,程序将无法下载到板子上)
![在这里插入图片描述](https://img-blog.csdnimg.cn/42103c9f53d841cc8cc81531c3a2c3de.png)
3. 配置系统时钟,选择 HSE , 高速时钟。
![在这里插入图片描述](https://img-blog.csdnimg.cn/132ffbe9371346bda5800ad8cf6ed231.png)
4. 设置时钟树,这里直接填写最大频率 72MHZ,然后 enter 双击即可。(系统自动生成相应时钟)
![在这里插入图片描述](https://img-blog.csdnimg.cn/7da425f9e870404a807249d57f499ea9.png)
5. 设置工程的名字,路径,以及工具链。
![在这里插入图片描述](https://img-blog.csdnimg.cn/92658608b01241f18fe1a7d829f2eedf.png)
6. 设置自动生成 .c/.h 文件。
![在这里插入图片描述](https://img-blog.csdnimg.cn/57da49164d0d4d48bdeff4e919825c03.png)
7. 选择引脚设置成中断模式。(PA0 接的是按键)
![在这里插入图片描述](https://img-blog.csdnimg.cn/f8c20aec26564bbd8f306c3943660a39.png)
8. 设置上升/下降/双边沿触发,选择是否上拉/下拉 电阻。
(上拉/下拉 根据具体电路图确定。当电平发生变化时,触发中断,会调用中断回调函数。)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ca03657e01e34225858ea0785be921b7.png)
9. 使能中断。![在这里插入图片描述](https://img-blog.csdnimg.cn/0871434d81564f04b658b23a63fea1d3.png)
10. 生成工程。
![在这里插入图片描述](https://img-blog.csdnimg.cn/3a5fa60cac1145a99da9760d49265927.png) 
# 三、自动生成的代码解析
看过我之前文章的应该一眼就能看懂 cubeMX 自动生成的代码。5个步骤,我再来讲解一下。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e00e27ad260842cfaac02e5ea6d063bd.png)
1. 首先定义一个 `GPIO_InitTypeDef` 的结构体对象。
可以看到该结构包含了 引脚,工作模式,是否 上拉/下拉 电阻,速度 。通过这个结构体就可以对各个外设进行初始化设置。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d56860c691a94d2981c625227e41a7dc.png)
2. 第二步 是`使能 gpio 端口`。
根据外设的GPIO端口来分别使能。(这里按键对应的是 PA0 , 所以使能 GPIOA )
```c
__HAL_RCC_GPIOA_CLK_ENABLE();
```
3. 配置引脚。
就是对我们第一步 创建的结构体进行初始化。
分别 配置引脚端口号 GPIO_PIN_0 ,  设置上升沿触发中断 , 下拉电阻。最后调用 `HAL_GPIO_Init( )` 函数初始化 GPIO 。
```c
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
4. 设置 优先级。
优先级分为:抢占优先级,子优先级。都是 值越小,优先级越大。即 为0 时,优先级最大。

```c
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
```
也可以通过 cubeMX 配置。
![在这里插入图片描述](https://img-blog.csdnimg.cn/a7f2a3a1957b412b9ea7cdd35f8bdb64.png)

5. 使能中断。

```c
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
```

# 四、代码实现。
当触发中断时,会调用 中断回调函数来进行处理。
所以我们可以在 ==中断回调函数== 中实现想要的功能即可。

```c
/* 中断回调函数  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
}
```
`注意`:
我们在工程中编写代码时,尽量在 类似 ==BEGIN 0== 和 ==END 0== 之间写,这样当我们修改 cubeMX 中的配置,再次生成代码时,就不会将之前我们编写的代码清除。
```c
/* USER CODE BEGIN 0 */

int count = 0;

/*  每按下按键,触发一次中断,count 增加一次 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
count++;
}
}


/* USER CODE END 0 */

```
这里的 函数参数是某个引脚,当相应引脚的按键按下时,即执行里面的函数。

---

# 总结
下一篇文章为大家介绍如何不使用 cubeMX ,手动写一个外部中断的程序。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。