目录
总结:经过分析框图,可以产生软件中断和事件中断,软件中断的目的是进中断服务函数。事件中断是产生一个脉冲信号给片内外设,属于硬件级别的。
EXTI1_IRQHandler EXTI9_5_IRQHandler EXTI15_10_IRQHandler
1.外部中断描述
作用于GPIO口,引用芯片外部中断作为中断源。
一般产品有19个外部中断,互联型产品有20个外部中断。真正意义上的外部中断只有16个(0-15)。
其余四个:
EXTI线16连接到PVD输出
EXTI线17连接到RTC闹钟事件
EXTI线18连接到USB唤醒事件
EXTI线19连接到以太网唤醒事件(只适用于互联型产品)
注意:EXIT0-EXIT4每个中断源对应一个中断入口地址。EXIT5-EXIT9公用一个中断入口地址。。EXIT1-EXIT15公用一个中断入0口地址
2.外部中断框图

功能说明:外部中断可以产生硬件中断、硬件事件、软件中断、软件事件
1.要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。
2、要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。
3.通过在软件中断/事件寄存器写’1’,也可以通过软件产生中断/事件请求。
硬件中断:(跟软件中断作用相同)
- 配置20个中断线的屏蔽位(EXTI_IMR)
- 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);
- 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。
硬件事件:(脉冲信号)
- 配置20个事件线的屏蔽位(EXTI_EMR)
- 配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)
软件中断/事件的选择:(手动产生中断和事件)
- 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)
- 设置软件中断寄存器的请求位(EXTI_SWIER)
3.各寄存器作用






4.端口对应
外部中断0~15映射到任何一组同名的GPIO端口(外部中断0,映射到端口编号为0的GPIO端口),并且一个外部中断入口只能映射到一个GPIO端口

5.编程思路
- 定义结构体NVIC和EXIT
- 开启复用时钟 ----RCC_APB2PeriphClockCmd
EXIT
- 配置 GPIO口对应的外部中断线。GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0)
- 选择GPIO对应的外部中断线。0-15
- 选则中断或事件
- 选择上升沿还是下降沿触发
- 使能中断线
- 初始化外部中断结构体
NVIC
- 配置NVIC中断源
- 设置抢占优先级和响应优先级
- 中断通道使能
- 初始化中断结构体
EXTI1_IRQHandler EXTI9_5_IRQHandler EXTI15_10_IRQHandler
- 编写中断服务函数
5.代码
void KEY_Exit_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发---key默认高电平
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //key2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//key1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI_5_Init(void)
{
u32 Priority = 0;
RCC->APB2ENR |= 1 << 3; //使能B端口
RCC->APB2ENR |= 1 << 0; //使能AFIO
//GPIO端口配置
GPIOB->CRL &= 0xff0fffff; //GPIO对应位清零
GPIOB->CRL |= 0x00800000; //输入上/下拉
GPIOB->ODR &= ~(1 << 5); //输出低电平选择下拉模式
//外部中断线映射配置,将外部中断线5映射到B端口
AFIO->EXTICR[1] &= ~(0xf << 4); //对应位清零
AFIO->EXTICR[1] |= (0x1 << 4); //外部中断线5选择PB端口
//外部中断线初始化
EXTI->EMR &= ~(1 << 5); //屏蔽来自线5上的事件请求
EXTI->RTSR |= 1 << 5; //允许输入线5上的上升沿触发
EXTI->IMR |= 1 << 5; //开放来自线5上的中断请求
//NVIC中断配置管理
Priority = NVIC_EncodePriority((7 - 2),0,0);//设置抢占优先级和响应优先级
NVIC_SetPriority(EXTI9_5_IRQn,Priority); //将设定好的优先级设置给指定的中断源
NVIC_EnableIRQ(EXTI9_5_IRQn); //使能中断通道
}
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3) == SET) //挂起寄存器
{
EXTI_ClearITPendingBit(EXTI_Line3);//
//
}
}
9457

被折叠的 条评论
为什么被折叠?



