2024年Go最新STM32—中断详解(配合按键中断代码,代码亲测)(4),2024年最新太爽了

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

/* 选择作为EXTI线的GPIO引脚 */
GPIO_EXTILineConfig( KEY1_GPIO_PORTSOURCE , KEY1_GPIO_PINSOURCE) ;
/* 配置中断or事件线 */
EXTI_InitStruct.EXTI_Line = KEY1_EXTI_LINE ;
/* 使能EXTI线 */
EXTI_InitStruct.EXTI_LineCmd = ENABLE ;
/* 配置模式:中断or事件 */
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt ;
/* 配置边沿触发 上升or下降 */
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising ;
EXTI_Init(&EXTI_InitStruct) ;

GPIO_EXTILineConfig( KEY2_GPIO_PORTSOURCE , KEY2_GPIO_PINSOURCE) ;
EXTI_InitStruct.EXTI_Line = KEY2_EXTI_LINE ;
EXTI_InitStruct.EXTI_LineCmd = ENABLE ;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt ;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling ;
EXTI_Init(&EXTI_InitStruct);

}


代码可大体分为三部分:  
 配置GPIO相应引脚、配置EXTI并连接GPIO引脚、传入NVIC\_Config()  
 **1.配置GPIO相应引脚**  
 该代码是通过按键产生一个电平信号,然后经EXTI处理传入NVIC产生中断的,所以要配置连接按键的GPIO引脚,**主要是设置相应的引脚模式为浮空输入** 。老规矩,先开启相应GPIO的时钟,然后配置引脚初始化结构体,再利用初始化函数将初始化结构体写入寄存器中。  
 **2.配置EXTI并连接GPIO引脚**  
 要操作外设,首先要打开相关的时钟,EXTI挂载在APB2总线上,并且开启时钟时要操作AFIO寄存器 ,准备工作就绪后连接GPIO相应的引脚到EXTI中,前面说了EXTI有20个接口,所以特定的引脚有特定的接口,所以要根据GPIO\_EXTILineConfig();函数选择用作EXTI线的GPIO引脚,函数说明如下



/**

  • @brief Selects the GPIO pin used as EXTI Line.
  • @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.
  • This parameter can be GPIO_PortSourceGPIOx where x can be (A…G).
  • @param GPIO_PinSource: specifies the EXTI line to be configured.
  • This parameter can be GPIO_PinSourcex where x can be (0…15).
  • @retval None
    /
    void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
    {
    uint32_t tmp = 0x00;
    /
    Check the parameters */
    assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));
    assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));

tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));
AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;
AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));
}


其实对应的EXTI线就对应GPIO引脚号,这样看起来还比较直观。  
 连接好GPIO引脚与EXTI后就该配置EXTI的初始化结构体了,结构体如下:



typedef struct
{
uint32_t EXTI_Line; // 中断/事件线
EXTIMode_TypeDef EXTI_Mode; // EXTI 模式
EXTITrigger_TypeDef EXTI_Trigger; // 触发类型
FunctionalState EXTI_LineCmd; // EXTI 使能
} EXTI_InitTypeDef;


配置此结构体主要是:选择相应的EXTI线 、选择触发模式、选择产生的结果(中断还是事件)、是否使能EXTI线。  
 **EXTI\_Line**:中断线选择,可选 EXTI\_0 至 EXTI\_19(一共20个)。既然刚才配置好了与GPIO引脚对应的EXTI线,所以初始化结构体中的EXTI线就是与GPIO连接的那个线。  
 **EXTI\_Mode**: EXTI 模式选择,可选为产生中断或者产生事件。就是决定信号的发展方向,是产生中断呢?还是产生事件呢?此处是中断。  
 **EXTI\_Trigger**: EXTI 边沿触发模式,可选上升沿触发、下降 沿 触 发 或 者 上 升 沿 和 下 降 沿 都 触 发。触发信号。  
 **EXTI\_LineCmd**:控制是否使能 EXTI 线,可选使能 EXTI 线或禁用。  
 初始化结构体配置完毕后交由初始化函数写入相应的寄存器中。  
 **3.传入NVIC\_Config()**  
 之后就自动传入NVIC中了。。。


## 编写中断服务函数


到这里就万事俱备只欠东风了,中断的触发与处理及优先级定义都已经安排上了,最后一步就是编写中断函数的内容了,只要进入中断就会执行中断函数中的代码,所以这是收尾工作。STM32的中断服务函数不同于51单片机中的中断服务函数,STM32的所有中断函数都被偷偷安排了,每个中断都有其固定的名字,只有找到这个名字,在这个固定的函数名下编写中断服务函数才是有效的,所有中断函数的编写都要在stm32f10x\_it.c 中,如示:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190725170127853.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzQzNzYy,size_16,color_FFFFFF,t_70)  
 从所给的信息可得知外设的中断服务函数的名字都存放在startup\_stm32f10x\_xx.s 中,而且是由汇编语言编写,如示:![在这里插入图片描述](https://img-blog.csdnimg.cn/20190725171048480.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzQzNzYy,size_16,color_FFFFFF,t_70)  
 可知EXTI线0到EXTI线4线都是单独的中断函数名、EXTI线5到EXTI线9共用一个中断函数名、EXTI线10线到EXTI线15线共用一个中断函数名。  
 我们要做的就是以相应的EXTI线的中断函数名字在stm32f10x\_it.c中编写中断函数 如下:



void EXTI0_IRQHandler(void)
{
if( EXTI_GetITStatus(KEY1_EXTI_LINE)!=RESET)
{
LED1_TOGGLE; //LED1的亮灭状态反转
}

EXTI_ClearITPendingBit(KEY1_EXTI_LINE);

}

void EXTI15_10_IRQHandler(void)
{
if( EXTI_GetITStatus(KEY2_EXTI_LINE)!=RESET)
{
LED2_TOGGLE; //LED2的亮灭状态反转
}

EXTI_ClearITPendingBit(KEY2_EXTI_LINE);

}


每次进入中断函数后,靠ITStatus EXTI\_GetITStatus(uint32\_t EXTI\_Line)读取中断是否执行 ,执行完之后要利用void EXTI\_ClearITPendingBit(uint32\_t EXTI\_Line)清除清除中断标志位,以免不断进入中断


## 大功告成


到此完整的中断系统就已经完成,主函数只需调用即可!!!  
 (附上主函数及俩个头文件)  
 希望可以一起交流学习  
 qq:2723808286



#include “stm32f10x.h”
#include “bsp_led.h”
#include “bsp_key.h”

int main(void)
{
LED_GPIO_Config();
EXTI_Config();

while(1) 
{
}

}



#ifndef __BSP_KEY_H
#define __BSP_KEY_H

#include “stm32f10x.h”

#define KEY1_EXTI_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY1_EXTI_GPIO_PORT GPIOA
#define KEY1_EXTI_GPIO_PIN GPIO_Pin_0
#define KEY1_EXTI_IRQN EXTI0_IRQn /* 对应着引脚号 /
#define KEY1_EXTI_LINE EXTI_Line0 /
中断、事件线对应引脚号 */
#define KEY1_GPIO_PORTSOURCE GPIO_PortSourceGPIOA
#define KEY1_GPIO_PINSOURCE GPIO_PinSource0
#define KEY1_EXTI_IRQHANDLER EXTI0_IRQHandler

#define KEY2_EXTI_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY2_EXTI_GPIO_PORT GPIOC
#define KEY2_EXTI_GPIO_PIN GPIO_Pin_13
#define KEY2_EXTI_IRQN EXTI15_10_IRQn
#define KEY2_EXTI_LINE EXTI_Line13
#define KEY2_GPIO_PORTSOURCE GPIO_PortSourceGPIOC
#define KEY2_GPIO_PINSOURCE GPIO_PinSource13
#define KEY2_EXTI_IRQHANDLER EXTI15_10_IRQHandler

void EXTI_Config(void);

#endif



#ifndef __BSP_LED_H
#define __BSP_LED_H

#include “stm32f10x.h”

#define LED1_GPIO_CLK RCC_APB2Periph_GPIOC /时钟/
#define LED1_GPIO_PORT GPIOC /端口/
#define LED1_GPIO_PIN GPIO_Pin_2 /引脚/

#define LED2_GPIO_PIN GPIO_Pin_3
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOC
#define LED2_GPIO_PORT GPIOC

#define digitalTOGGLE(p,i) {p->ODR ^=i;}
#define LED1_TOGGLE digitalTOGGLE(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2_TOGGLE digitalTOGGLE(LED2_GPIO_PORT,LED2_GPIO_PIN) /* LED状态反转 */
void LED_GPIO_Config(void);

#endif








![img](https://img-blog.csdnimg.cn/img_convert/0fc9c5e9b41ad67272e009947659a283.png)
![img](https://img-blog.csdnimg.cn/img_convert/39e754106333ba477587e43a99291aca.png)
![img](https://img-blog.csdnimg.cn/img_convert/ad6daae277354d1f55b6ee447d840bd5.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

g-oFcDfPkC-1715639970933)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值