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