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功能框图讲解

stm32f103 中级篇 18 EXIT GPIO外部中断详解_第1张图片
stm32f103 中级篇 18 EXIT GPIO外部中断详解_第2张图片
stm32f103 中级篇 18 EXIT GPIO外部中断详解_第3张图片
stm32f103 中级篇 18 EXIT GPIO外部中断详解_第4张图片
写1进行配置
stm32f103 中级篇 18 EXIT GPIO外部中断详解_第5张图片
写1
stm32f103 中级篇 18 EXIT GPIO外部中断详解_第6张图片
将事件/中断先挂起,是否执行再判断

stm32f103 中级篇 18 EXIT GPIO外部中断详解_第7张图片
大开关,是否打开
送到CM3内核的NVIC中断控制器->ESR中断服务函数->点亮

事件

18.2.3 EXIT中断实验讲解

stm32f103 中级篇 18 EXIT GPIO外部中断详解_第8张图片
如果是1,来到单片机内部脉冲发生器产生方波->触发ADC开始转换
例:按键按下,开始数据的采集,或者定时器开始计时

18.2.3 EXIT 实验

配置中断和配置中断的使用端口分开
stm32f103 中级篇 18 EXIT GPIO外部中断详解_第9张图片

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)
	{
		
	}

 } 

你可能感兴趣的:(stm32,stm32)