一、中断模块简述
1,stm32的中断模块很强大,对于所有的模块、所有的GPIO端口都有对应的中断;
2,对于外部产生的中断,主要可以分为两大类:①GPIO产生的中断;②内部模块产生的中断,如USART;
3,整个系统来说,又可以分为内核的中断,外部产生中断;标灰的为内核
4,外部中断处理逻辑
GPIO信号------》AFIO模块选择输入源--------》EXTI模块判断中断信号---------》NVIC模块中断判断处理------》进入中断服务函数
ps:如果是外设中断,如usart,则:
开启对应外设模块中断-------》NVIC模块判断------》进入中断服务函数
5,AFIO模块:选择中断输入线
6,EXTI模块:外部中断/事件控制器,管理了控制器的 20 个中断/事 件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的 检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触 发事件的属性。
简答点说,就是输入信号,在这边处理促发上升沿、下降沿,再通过一些的筛选,从而输出给到NVIC模块(筛选就是NVIC配置初始化中的设置)
7,NVIC模块:配置嵌套中断向量模块
①分配通道的优先级分组;
②配置通道,抢占优先级,次优先级,使能并开启时钟
8,中断服务函数:
需要注意:①进入检测中断信号;②中断函数名要与启动文件一致;③推出中断前要清中断标志位;
二、EXTI模块时钟,并获取中断时刻,进行一次电平反转
整体逻辑:
1-开启GPIO时钟,开启GPIO模块,配置浮空输入(也可以是下拉输入,主要硬件配置状态)
2-开启AFIO时钟,配置AFIO;
3-配置EXTI模块(内核模块,不需要开启时钟)
4-配置NVIC模块(内核模块,不需要开启时钟)
5-配置中断服务函数,(里面进行GPIO引脚的电平反转,位的异或操作)
1-开启GPIO时钟,开启GPIO模块,配置浮空输入(也可以是下拉输入,主要硬件配置状态)
void key_config(void)
{
//时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
//gpio配置
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStruct);
2-开启AFIO时钟,配置AFIO;
//配置AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
3-配置EXTI模块(内核模块,不需要开启时钟)
static void exti_cofig(void)
{
//配置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);
4-配置NVIC模块(内核模块,不需要开启时钟)
//配置优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//配置NVIC
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel= EXTI0_IRQn ;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
5-配置中断服务函数,(里面进行GPIO引脚的电平反转,位的异或操作)
void EXTI0_IRQHandler(void)
{
//检测EXTIO
if(EXTI_GetITStatus(EXTI_Line0)==SET)
{
GPIOB->ODR^=GPIO_Pin_0;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
核心模块配置完毕,
LED模块配置
void LED_config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 ;// |GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init( GPIOB, &GPIO_InitStruct);
}
mian函数中开启运行
#include "stm32f10x.h" // Device header
#include "LED.H"
#include "key.H"
void delay(uint32_t count)
{
while(count)
{
count--;
}
}
int main(void)
{
LED_config();
key_config();
while(1)
{
}
}