当前位置: 首页 > news >正文

STM32不使用 cubeMX实现外部中断

这篇文章将介绍如何不使用 cubeMX完成外部中断的配置和实现。

文章目录

  • 前言
  • 一、文件加入工程
  • 二、代码解析
      • exti.c
      • exti.h
      • main.c
  • `注意`:
  • 总结


前言

  • 实验开发板:STM32F103C8T6。
  • 所需软件:keil5 , cubeMX 。
  • 实验目的:如何不使用 cubeMX实现外部中断 。
  • 实验:使用外部中断控制 key 点亮 led.

如果大家想了解如何 cubeMX实现外部中断,可以参考我之前的文章:最详细STM32,cubeMX外部中断

一、文件加入工程

这里采用封装的思想,将编写的两个文件 exti.c 和 exti.h 放到自己创建的文件夹 user 中。

  1. 将文件夹加入工程。
    点击 KEY 文件夹,右击选择 Manage Project Items.
    在这里插入图片描述
    这里点击新建,命名后,点击 OK 即可。
    在这里插入图片描述
  2. 将 .c 文件加入工程。(双击刚刚创建的文件夹,即可将 .c 文件加入工程)
    在这里插入图片描述
  3. 添加头文件路径。(选择“魔法棒”,选择 C/C++, 点击 “…”)
    在这里插入图片描述
    这里点击 新建,即可加入头文件路径。
    在这里插入图片描述

二、代码解析

exti.c

  1. 首先创建一个 GPIO_InitTypeDef 结构体,这个结构体中包含了 端口号,工作模式,是否上拉/下拉电阻等。
  2. 调用 __HAL_RCC_GPIOA_CLK_ENABLE 函数使能端口。(这里按键对应的是 PA0 ,led 对应 PB4, 所以使能 GPIOA ,GPIOB)
  3. 配置 GPIO_InitTypeDef 结构体,调用 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 函数完成初始化。
  4. 使用 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); 设置优先级。使用 HAL_NVIC_EnableIRQ(EXTI0_IRQn); 使能中断。
  5. 发生中断时,先调用 EXTI0_IRQHandler( ) , 执行里面的函数 HAL_GPIO_EXTI_IRQHandler 时,再会自动调用 中断回调函数 HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
#include "exti.h"


/* exti 初始化函数  */
void exti_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;					// 双边沿触发中断
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;									// 下拉电阻
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PB4 */
  GPIO_InitStruct.Pin = GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}

/* 中断处理函数 */
void EXTI0_IRQHandler()
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

/* 中断回调函数 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_0)
	{
		key_value = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
	}
}

/* 获取按键的电平状态 */
uint8_t Get_key(void)
{
	return key_value;
}

exti.h

这里的 key_value 变量要设置为 静态 static 的,只能在本文件中使用。

#ifndef _EXTI_H_
#define _EXTI_H_


#include "main.h"


static int key_value = 0;


void exti_Init(void);
uint8_t Get_key(void);


#endif

main.c

当按键按下时 led 点亮,按键松开时 led 熄灭。

if(Get_key() == 0)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
}
else if(Get_key() == 1)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
}

注意

之前我们使用的是 延时函数 HAL_Delay(10); 这里为什么使用 外部中断控制 按键 点亮 led 呢?

前面我们使用 延时函数进行按键的消抖。但是延时函数在项目工程中最好是少使用,延时函数的大量使用会造成系统的卡顿。所以,这里我们使用外部中断来改进按键消抖

使用 延时函数消抖的文章我之前写过:最详细STM32,cubeMX 按键点亮 led


总结

下篇文章为大家介绍 STM32 的 定时器。

相关文章:

  • 全网最丑焊锡教程(仅排针焊接心得)
  • 【C++代码】二叉搜索树的最近公共祖先,二叉搜索树中的插入操作,删除二叉搜索树中的节点--代码随想录
  • react native 使用夜神模拟器开发调试 windows+android
  • Scala语言入门
  • Linux进阶-ipc共享内存
  • jdk9模块化
  • 深度学习学习笔记-模型的修改和CRUD
  • Spring IOC之@ComponentScan
  • LAXCUS分布式操作系统是怎么实现的?
  • 【广州华锐互动】利用AR进行野外地质调查学习,培养学生实践能力
  • 【算法教程】排列与组合的实现
  • 华为OD 绘图机器(100分)【java】A卷+B卷
  • 项目经理之识别项目干系人
  • 百分点科技受邀参加“一带一路”国际合作高峰论坛
  • Android 特权应用 privapp-permissions 权限解读
  • 华为数通方向HCIP-DataCom H12-831题库(多选题:1-20)
  • Ansible 的脚本 --- playbook 剧本
  • SSD算法学习(单步多框目标检测)
  • 美格智能出席无锡智能网联汽车生态大会,共话数字座舱新势力
  • 【数据结构】模拟实现无头单向非循环链表
  • 铁路上海站迎五一假期客流最高峰,今日预计发送77万人次
  • 十四届全国人大常委会举行第四十四次委员长会议
  • 建设银行南昌分行引金融“活水”,精准灌溉乡村沃土
  • 吴志朴当选福建德化县人民政府县长
  • 烟花秀、新航线、购物节......上海邮轮文化旅游节今日开幕
  • 东风着陆场做好各项搜救准备,迎接神舟十九号航天员天外归来