STM32-基本知识梳理4-EXTI模块

一、中断模块简述

1,stm32的中断模块很强大,对于所有的模块、所有的GPIO端口都有对应的中断;

2,对于外部产生的中断,主要可以分为两大类:①GPIO产生的中断;②内部模块产生的中断,如USART;

3,整个系统来说,又可以分为内核的中断,外部产生中断;标灰的为内核

 4,外部中断处理逻辑

GPIO信号------》AFIO模块选择输入源--------》EXTI模块判断中断信号---------》NVIC模块中断判断处理------》进入中断服务函数

ps:如果是外设中断,如usart,则:

开启对应外设模块中断-------》NVIC模块判断------》进入中断服务函数

5,AFIO模块:选择中断输入线

如:EXTI0 可以通过 AFIO 的外部中断配置寄存器 1(AFIO_EXTICR1) 的 EXTI0[3:0] 位选择配置为 PA0 PB0 PC0 PD0 PE0 PF0 PG0 PH0 或者 PI0 ,从中选择一路作为输入端口;

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

	}

}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值