C8T6超绝模块--EXTI

C8T6超绝模块--EXTI

大纲

  1. 控制流程
  2. 结构体分析
  3. EXTI实现按键

具体案例

控制流程

这里是流程框图,具体可以去看我STM32专栏的EXTI的具体分析

结构体分析

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

EXTI_Line: 选择中断线,可选 EXTI0 至 EXTI19,根据自己的需求来选择对应的中断线

EXTI_Mode: 选择模式,是产生事件还是产生中断

EXTI_Trigger: 选择触发类型,可选择上升沿触发,下降沿触发,上升沿和下降沿都触发

EXTI_LineCmd:控制是否使能 EXTI 线,可选使能 EXTI 线 (ENABLE) 或禁用 (DISABLE)

EXTI实现按键

前言

我们在前面使用读取按键的电压,根据返回值来执行小灯的系列操作,详情可见C8T6按键实现点亮小灯,而在这里,我们通过给按键配置一个EXTI中断,当产生中断时,就去中断服务函数里执行(注意:中断服务函数带有weak标签,可以直接进行重写,名字一定要写对,因为必须在中断服务列表当中)

LED初始化在本专栏前面细讲过,这里就不过多赘述,请见C8T6超绝模块-点亮LED

代码

LED.H
cpp 复制代码
#ifndef __BSP_LED_H
#define __BSP_LED_H

#include "stm32f10x.h"

#define LED_G_GPIO_PIN 			GPIO_Pin_13
#define LED_G_GPIO_PORT			GPIOC
#define LED_G_GPIO_CLK			RCC_APB2Periph_GPIOC


#define ON 1
#define  OFF 0

// \C语言里面的续航符,要求后面不能有任何东西
#define LED_G(a)	if(a)\
				GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); \
				else \
				GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);

#define LED_G_TOGGLE {LED_G_GPIO_PORT->ODR ^= GPIO_Pin_13;}

void LED_GPIO_Config(void);

#endif
LED.C
cpp 复制代码
void LED_GPIO_Config(void)
{
	RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);
	
}	
EXTI.H
cpp 复制代码
#ifndef __BSP_EXTI_H
#define __BSP_EXTI_H

#include "stm32f10x.h"

#define KEY_INT_GPIO_PIN			GPIO_Pin_0
#define KEY_INT_GPIO_PORT			GPIOA
#define KEY_INT_GPIO_CLK			RCC_APB2Periph_GPIOA

 void EXTI_NVIC_Config(void);
 void EXTI_KEY_Config(void);
#endif
EXTI.C
cpp 复制代码
#include "bsp_exti.h"

 void EXTI_NVIC_Config(void)
{
	// 初始化NVIC嵌套向量中断控制器
	NVIC_InitTypeDef NVIC_InitStruct;
	
	// 进行优先级分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	
	// 配置NVIC初始化结构体的成员
	NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;// 配置中断源(注意0-4有单独的,5-9,10-15是分别共享的)
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;// 配置主优先级(抢占优先级)
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;// 配置子优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;// 使能
	
	// 调用初始化函数
	NVIC_Init(&NVIC_InitStruct);
}

void EXTI_KEY_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStruct;
	
	// 配置中断优先级
	EXTI_NVIC_Config();
	
	// 配置GPIO的结构体成员
	// open the clock(GPIOA的时钟), 
	RCC_APB2PeriphClockCmd(KEY_INT_GPIO_CLK,ENABLE);
	
	// set the pin,mode
	GPIO_InitStruct.GPIO_Pin = KEY_INT_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	
	// 使用初始化函数写入寄存器
	
	GPIO_Init(KEY_INT_GPIO_PORT,&GPIO_InitStruct);
	
	// 初始化exti来产生中断
	// 选择输入线(端口,引脚)
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
	
	// 打开AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	// 初始化EXTI结构体
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line0;// 配置线
	EXTI_InitStruct.EXTI_Mode =EXTI_Mode_Interrupt;// 配置模式为中断
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;// 配置上升沿还是下降沿
	// 使能中断屏蔽寄存器,使其响应
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	
	// 调用函数写入到寄存器里面
	EXTI_Init(&EXTI_InitStruct);
	
}

讲解一下这一块EXTI的初始化,首先我们需要GPIO和EXTI的初始化结构体,GPIO初始化我们按键接入的GPIO端口,EXTI根据我们的按键的GPIO选择端口和引脚对应的数据线,对于按键GPIO的初始化,我们也就是先打开时钟,配置结构体的成员,然后进行初始化,而配置EXTI,在配置之前,我们需要进行中断的分组,然后配置过程中,需要选择输入线(根据GPIO的端口和引脚决定),然后打开AFIO的时钟,配置EXTI结构体的成员(中断线,中断模式,触发方式,是否使能),最后调用初始化函数进行初始化

这样初始化完成后,当我们按下按键时,就会产生中断,去调用我们对样应的中断服务函数,执行我们需要的效果(这里是点灯)

中断服务函数
cpp 复制代码
void EXTI0_IRQHandler()
{
	if(EXTI_GetITStatus(EXTI_Line0) != RESET)// 判断是否进入中断
	{
		LED_G_TOGGLE;
	}// 中断服务函数
	
	EXTI_ClearITPendingBit(EXTI_Line0);// 清除中断标志位,避免一直中断
}
main

主函数没什么好说的,这一块主要的处理还是EXTI

cpp 复制代码
# include "stm32f10x.h"

#include "bsp_led.h"
#include "bsp_exti.h"

void Delay( uint32_t count)
{
	for(;count != 0;count--);
}

int main(void)
{
	LED_GPIO_Config();
	EXTI_KEY_Config();
	while(1)
	{
		
	}
}
相关推荐
嗯嗯=20 分钟前
STM32单片机学习篇9
stm32·单片机·学习
小范馆5 小时前
ESP各模组的引脚图-小智接线图
stm32
松涛和鸣5 小时前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
想放学的刺客8 小时前
单片机嵌入式试题(第23期)嵌入式系统电源管理策略设计、嵌入式系统通信协议栈实现要点两个全新主题。
c语言·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆8 小时前
【Linux 驱动开发】五. 设备树
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·硬件工程
YouEmbedded9 小时前
解码内部集成电路(IIC)与OLED屏
stm32·0.96寸oled·硬件iic·软件模拟iic·图片取模·汉字取模
jghhh0110 小时前
基于上海钜泉科技HT7017单相计量芯片的参考例程实现
科技·单片机·嵌入式硬件
恶魔泡泡糖10 小时前
51单片机外部中断
c语言·单片机·嵌入式硬件·51单片机
意法半导体STM3210 小时前
【官方原创】如何基于DevelopPackage开启安全启动(MP15x) LAT6036
javascript·stm32·单片机·嵌入式硬件·mcu·安全·stm32开发
v_for_van10 小时前
STM32低频函数信号发生器(四通道纯软件生成)
驱动开发·vscode·stm32·单片机·嵌入式硬件·mcu·硬件工程