stm32f103 中级篇 18 EXIT GPIO外部中断详解

18.2EXIT功能框图讲解及EXIT初始化结构体讲解

18.2.1 EXIT简介

EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20
个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿
检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为
中断或者事件,以及触发事件的属性。

GPIO中断,每一个GPIO都可以产生一个中断,体现在电平的变化,电平的变化需要外设的管理,最后传给NVIC(内核里面的嵌套向量中断控制器)

18.2.2 EXIT功能框图讲解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
写1进行配置
在这里插入图片描述
写1
在这里插入图片描述
将事件/中断先挂起,是否执行再判断

在这里插入图片描述
大开关,是否打开
送到CM3内核的NVIC中断控制器->ESR中断服务函数->点亮

事件

18.2.3 EXIT中断实验讲解

在这里插入图片描述
如果是1,来到单片机内部脉冲发生器产生方波->触发ADC开始转换
例:按键按下,开始数据的采集,或者定时器开始计时

18.2.3 EXIT 实验

配置中断和配置中断的使用端口分开
在这里插入图片描述

1.2.
写在:bsp_exit.c
调用函数库:stmf10x_gpio.c stmf10x_rcc.c stmf10x_exit.h

void EXIT_Key_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	EXTI_InitTypeDef EXIT_InitStruct;
	
	//配置中断优先级
	EXIT_NAIC_Config();
	
	//初始化GPIO
	RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	//GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStruct);
	
	//初始化EXIT 选择好输入线
	//开启时钟 AFIO控制EXIT
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	//输入线
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource8);
	
	//初始化EXIT结构体
	EXIT_InitStruct.EXTI_Line = EXTI_Line8;
	EXIT_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXIT_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	EXIT_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXIT_InitStruct);
	
}

bsp_exit.h

#ifndef _BSP_EXIT_H
#define _BSP_EXIT_H

#include "stm32f10x.h"

#define KEY1_INT_GPIO_PORT 				GPIOC
#define KEY1_INT_GPIO_PIN 				GPIO_Pin_8
#define KEY1_INT_GPIO_CLK					RCC_APB2Periph_GPIOC

void EXIT_Key_Config(void);

#endif /*_BSP_EXIT_H*/


写在:bsp_exit.c
调用函数库:misc.h

static void EXIT_NAIC_Config()
{
	//套路 定义结构体
	NVIC_InitTypeDef	NVIC_InitStruct;
	//配置优先级分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	//初始化NVIC
	//选择中断源
	NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn ;
	//配置主优先级
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	//配置子优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	//NVIC使能
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	//将配置写入寄存器中 找不到直接操作寄存器
	NVIC_Init(&NVIC_InitStruct);
}

stm32f10x_it.c

//中断服务函数
void EXTI9_5_IRQHandler(void)
{
	//判断是否真正进入中断 stm32f10x_rcc.h
	if(EXTI_GetITStatus(EXTI_Line8) != RESET)
	{
		//执行中断服务函数 即具体要干什么
		LED_G_TOGGLE
	}	
	//中断标志位清除	
	EXTI_ClearITPendingBit(EXTI_Line8);
}

main.c

#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_exit.h"

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

int main()
{
	//来到这个系统时钟被配置成72M
	LED_GPIO_Config();
	EXIT_Key_Config();
	while(1)
	{
		
	}

 } 
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103ZET6是一款功能强大的微控制器,具有多种外围设备和接口。其中,GPIO外部中断是一种非常有用的功能,可以通过该功能实现对外部事件的快速响应。 在STM32F103ZET6中,GPIO外部中断的实现需要以下步骤: 1. 配置GPIO口为输入模式,并使能外部中断。 2. 配置中断触发方式,可以选择上升沿触发、下降沿触发、双边沿触发等方式。 3. 编写中断服务函数,在该函数中实现对外部事件的处理。 以下是一个简单的示例代码,演示如何在STM32F103ZET6上实现GPIO外部中断: //配置GPIO口为输入模式 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //配置PA0引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //配置为输入模式,上拉 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA //使能外部中断 NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO时钟 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //选择中断线路 EXTI_InitStructure.EXTI_Line = EXTI_Line0; //选择中断线0 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //选择中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //选择上升沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线 EXTI_Init(&EXTI_InitStructure); //初始化中断 //编写中断服务函数 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) //判断中断是否发生 { //处理外部事件 //... EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志位 } } 以上代码演示了如何在PA0引脚上实现上升沿触发的GPIO外部中断,并在中断服务函数中处理外部事件。实际应用中,可以根据需要选择不同的GPIO口和中断触发方式,并编写相应的中断服务函数来实现更加复杂的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值