(stm32f103学习总结) |
您所在的位置:网站首页 › 中断线和io口的对应关系 › (stm32f103学习总结) |
一、外部中断介绍
1.1 EXTI简介
EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事 件/中断请求的边沿检测器。EXTI的每根输入线都可单独进行配置,以选 择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或 边沿触发),还可独立地被屏蔽。(stm32f103有19个) 1.2 EXTI结构框图1.3 外部中断/事件线映射 STM32F10x的EXTI具有20个中断/事件线,如下:(stm32f103有19个以太网唤醒事件没有;stm32f107有20个) (1)使能IO口时钟,配置IO口模式为输入 (2)开启 AFIO 时钟,设置 IO 口与中断线的映射关系 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO时钟 void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); //设置IO 口与中断线的映射关系即哪个io口哪一个管脚作为中断输入线 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //这里以配置GPIOA口 GPIOA的第0管脚作为中断输入线 (3)配置中断分组(NVIC),使能中断 (4)初始化EXTI,选择触发方式 1 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); 2 typedef struct 3 { 4 uint32_t EXTI_Line; //中断/事件线 5 EXTIMode_TypeDef EXTI_Mode; //EXTI模式 6 EXTITrigger_TypeDef EXTI_Trigger; //EXTI触发方式 7 FunctionalState EXTI_LineCmd; //中断线使能或失能 8 }EXTI_InitTypeDef;(5)编写EXTI中断服务函数(中断函数固件库中已经定义必须使用下列函数名不能自己定义) EXTI0_IRQHandler EXTI1_IRQHandler EXTI2_IRQHandler EXTI3_IRQHandler EXTI4_IRQHandler EXTI9_5_IRQHandler EXTI15_10_IRQHandler 三、编写外部中断控制程序 要实现外部中断方式控制LED,程序框架如下: (1)初始化对应端口的EXTI(第三部分中的1-4小步) (2)编写EXTI中断函数 (3)编写主函数 1 /******************************************************************************* 2 * 函 数 名 : My_EXTI_Init 3 * 函数功能 : 外部中断初始化 4 * 输 入 : 无 5 * 输 出 : 无 6 *******************************************************************************/ 7 void My_EXTI_Init(void) 8 { 9 NVIC_InitTypeDef NVIC_InitStructure; 10 EXTI_InitTypeDef EXTI_InitStructure; 11 12 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能 13 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择GPIO管脚用作外部中断线路 14 //EXTI0 NVIC 配置 15 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道 16 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级 17 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级 18 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 19 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 20 //初始化EXTI 配置 21 EXTI_InitStructure.EXTI_Line=EXTI_Line0; 22 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; 23 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; 24 EXTI_InitStructure.EXTI_LineCmd=ENABLE; 25 EXTI_Init(&EXTI_InitStructure); 26 }1 /******************************************************************************* 2 * 函 数 名 : EXTI0_IRQHandler 3 * 函数功能 : 外部中断0函数 4 * 输 入 : 无 5 * 输 出 : 无 6 *******************************************************************************/ 7 void EXTI0_IRQHandler(void) 8 { 9 if(EXTI_GetITStatus(EXTI_Line3)==1) //判断EXTI中断标志位状态函数10 {11 //填写中断中需要完成的程序12 }13 EXTI_ClearITPendingBit(EXTI_Line3); //在结束中断服务函数前,清楚中断标志位 14 15 }
|
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |