1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
EXTI:External interrupt /event controll
具体的表现形式为 导致 外部的高低电平变化-------------》中断/事件发生(需要配置NVIC) 外部中断/事件控制器功能框图 具体可以分为两部分: 1- 中断(下图的1,2,3,4,5) 2- 事件(下图的1,2,3,6,7,8) 由上图可知,外部中断是挂载到APB总线上的,/23表示有23根结构相同的线。 (详情看stm32f4xx的中文参考手册第十章第二小节部分,下面对应的10.x.x代表手册对应章节部分) 1处:输入线 10.2.5 SYSCFG外部中断配置寄存器,16X9=144个GPIO口 与上图类似,总共16条 SYSCFG_EXTICR2 EXTIx x(4~7) SYSCFG_EXTICR3 EXTIx x(8~11) SYSCFG_EXTICR4 EXTIx x(12~15) 剩余的7条 2处:边沿检测电路 3处:软件中断屏蔽寄存器 事件屏蔽寄存器如下 4处:挂起寄存器 5处:NVIC 具体查看官方的misc.h54行,73行(有点多就不一一列举),或者看ARM-Cortex-M4内核的官方手册说明,看名字就可以知道大概意思了,下面是部分截图。 实验设计 需求 1.PA0连接到EXTI用于产生中断,PA0的电平变化通过按键来控制 2.产生一次中断,LED翻转一次 编程须知: 打开开发板原理图,PA0是按键的连接引脚,默认被地拉低低电平,需要上升沿触发 编程要点: 1.初始化要连接到EXTI的GPIO 2.初始化EXTI用于产生中断事件 3.初始化NVIC,用于处理中断 4.编写中断服务函数 5.main函数 1.bsp_led.c #include “。/led/bsp_led.h” /** * @brief 初始化控制LED的IO */ void LED_GPIO_Config(void) { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启LED相关的GPIO外设时钟*/ RCC_AHB1PeriphClockCmd ( LED1_GPIO_CLK|LED2_GPIO_CLK|LED3_GPIO_CLK|LED4_GPIO_CLK, ENABLE); /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Pin = LED1_PIN; /*设置引脚模式为输出模式*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /*设置引脚的输出类型为推挽输出*/ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /*设置引脚为上拉模式*/ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; /*设置引脚速率为2MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; /*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/ GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Pin = LED2_PIN; GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure); /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Pin = LED3_PIN; GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure); /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Pin = LED4_PIN; GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure); /*关闭RGB灯*/ LED_RGBOFF; /*指示灯默认开启*/ LED4(ON); } 2.bsp_led.h #ifndef __LED_H #define __LED_H #include “stm32f4xx.h” //引脚定义 /*******************************************************/ //R 红色灯 #define LED1_PIN GPIO_Pin_10 #define LED1_GPIO_PORT GPIOH #define LED1_GPIO_CLK RCC_AHB1Periph_GPIOH //G 绿色灯 #define LED2_PIN GPIO_Pin_11 #define LED2_GPIO_PORT GPIOH #define LED2_GPIO_CLK RCC_AHB1Periph_GPIOH //B 蓝色灯 #define LED3_PIN GPIO_Pin_12 #define LED3_GPIO_PORT GPIOH #define LED3_GPIO_CLK RCC_AHB1Periph_GPIOH //小指示灯 #define LED4_PIN GPIO_Pin_11 #define LED4_GPIO_PORT GPIOD #define LED4_GPIO_CLK RCC_AHB1Periph_GPIOD /************************************************************/ /** 控制LED灯亮灭的宏, * LED低电平亮,设置ON=0,OFF=1 * 若LED高电平亮,把宏设置成ON=1 ,OFF=0 即可 */ #define ON 0 #define OFF 1 /* 带参宏,可以像内联函数一样使用 */ #define LED1(a) if (a) GPIO_SetBits(LED1_GPIO_PORT,LED1_PIN); else GPIO_ResetBits(LED1_GPIO_PORT,LED1_PIN) #define LED2(a) if (a) GPIO_SetBits(LED2_GPIO_PORT,LED2_PIN); else GPIO_ResetBits(LED2_GPIO_PORT,LED2_PIN) #define LED3(a) if (a) GPIO_SetBits(LED3_GPIO_PORT,LED3_PIN); else GPIO_ResetBits(LED3_GPIO_PORT,LED3_PIN) #define LED4(a) if (a) GPIO_SetBits(LED4_GPIO_PORT,LED4_PIN); else GPIO_ResetBits(LED4_GPIO_PORT,LED4_PIN) /* 直接操作寄存器的方法控制IO */ #define digitalHi(p,i) {p-》BSRRL=i;} //设置为高电平 #define digitalLo(p,i) {p-》BSRRH=i;} //输出低电平 #define digitalToggle(p,i) {p-》ODR ^=i;} //输出反转状态 /* 定义控制IO的宏 */ #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_PIN) #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_PIN) #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_PIN) #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_PIN) #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_PIN) #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_PIN) #define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_PIN) #define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_PIN) #define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_PIN) #define LED4_TOGGLE digitalToggle(LED4_GPIO_PORT,LED4_PIN) #define LED4_OFF digitalHi(LED4_GPIO_PORT,LED4_PIN) #define LED4_ON digitalLo(LED4_GPIO_PORT,LED4_PIN) /* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */ //红 #define LED_RED LED1_ON; LED2_OFF; LED3_OFF //绿 #define LED_GREEN LED1_OFF; LED2_ON; LED3_OFF //蓝 #define LED_BLUE LED1_OFF; LED2_OFF; LED3_ON //黄(红+绿) #define LED_YELLOW LED1_ON; LED2_ON; LED3_OFF //紫(红+蓝) #define LED_PURPLE LED1_ON; LED2_OFF; LED3_ON //青(绿+蓝) #define LED_CYAN LED1_OFF; LED2_ON; LED3_ON //白(红+绿+蓝) #define LED_WHITE LED1_ON; LED2_ON; LED3_ON //黑(全部关闭) #define LED_RGBOFF LED1_OFF; LED2_OFF; LED3_OFF void LED_GPIO_Config(void); #endif /* __LED_H */ 3.bsp_exti.c #include “bsp_exti.h” //static关键字表明该函数仅在这个文件可以使用 //misc.h54行,misc.h的73行 static void EXTI_NVIC_Config(void)//内核中断外设,都在misc.c文件中,misc.h的73行 { NVIC_InitTypeDef NVIC_InitStruct; //定义一个NVIC初始化结构体变量 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//优先级分组 NVIC_InitStruct.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;//中断源 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//子优先级 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能中断,大大门 NVIC_Init(&NVIC_InitStruct); //到此配置完毕 } /*在stm32f4xx_exit.h文件的93行中,有EXTI初始化结构体 EXTI_InitTypeDef,然后初始化里面的成员,在80行。 值在105行*/ void EXTI_Key_Config(void) { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStruct; //定义结构体变量 /*开启LED相关的GPIO外设时钟*/ RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA, ENABLE);//打开AHB1总线时钟 /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; //GPIOA的0脚 /*设置引脚模式为输入模式*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式 /*设置引脚为浮空模式*/ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//浮空,在stm32f4xx.gpio.h文件110行位置 /*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/ GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);//将引脚和结构体初始化完成 RCC_APB2PeriphClockCmd ( RCC_APB2Periph_SYSCFG, ENABLE);//用到了EXTI0,挂载到PLCLK2,要打开AHB2总线时钟 SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE); //作用:把PA0连接到EXTI0. //param1:中断源端口 GPIOA //param2:中断源引脚 PA0 EXTI_InitStruct.EXTI_Line = KEY1_INT_EXTI_LINE; //PA0,选择EXTI0为输入线 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//设置模式为中断模式,另一个是事件模式 EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//设置触发方式为上升沿触发 EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能,打开大门 EXTI_Init(&EXTI_InitStruct);//在stm32f4xx_exti.h文件,把配置好的成员写到寄存器里面,到此初始化完毕。 EXTI_NVIC_Config();//调用NVIC中断控制器初始化函数。 } 4.bsp_exti.h #ifndef __BSE_EXTI_H #define __BSE_EXTI_H #include “stm32f4xx.h” #define KEY1_GPIO_PIN GPIO_Pin_0 #define KEY1_GPIO_PORT GPIOA #define KEY1_GPIO_CLK RCC_AHB1Periph_GPIOA #define KEY1_INT_EXTI_LINE EXTI_Line0 #define KEY1_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOA #define KEY1_INT_EXTI_PINSOURCE EXTI_PinSource0 #define KEY1_INT_EXTI_IRQ EXTI0_IRQn #define KEY1_INT_EXTI_IRQHANDLER EXTI0_IRQHandler //宏定义中断函数名称 #define KEY2_GPIO_PIN GPIO_Pin_13 #define KEY2_GPIO_PORT GPIOC #define KEY2_GPIO_CLK RCC_AHB1Periph_GPIOC void EXTI_Key_Config(void); #endif /* __BSE_EXTI_H */ 5.stm32f4xx_it.h下面补充编写中断服务函数(一般中断服务函数放在这个地方) #include “stm32f4xx_it.h” #include “bsp_led.h” #include “bsp_exti.h” /*中断服务函数都写在stm32f4xx_it.c这个函数里面 名字怎么写?看启动文件startup_stm32f429_439xx.s,93行, 这个很重要,如果写错会一直死循环!!!!!!!!!!! 写在文件stm32f4xx_it.c中的函数如下:*/ void KEY1_INT_EXTI_IRQHANDLER(void) { if( ( EXTI_GetITStatus(KEY1_INT_EXTI_LINE) ) != RESET ) { /* 干活 */ LED1_TOGGLE; } EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);//清除中断标志位,勿忘勿忘 } 6.stm32f4xx_it.h 写着中断服务函数的名字及声明 #ifndef __STM32F4xx_IT_H #define __STM32F4xx_IT_H #ifdef __cplusplus extern “C” { #endif /* Includes ------------------------------------------------------------------*/ #include “stm32f4xx.h” /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ void NMI_Handler(void); void HardFault_Handler(void); void MemManage_Handler(void); void BusFault_Handler(void); void UsageFault_Handler(void); void SVC_Handler(void); void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); #ifdef __cplusplus } #endif #endif /* __STM32F4xx_IT_H */ 7.main函数调用 int main(void) { /* LED 端口初始化 */ LED_GPIO_Config(); EXTI_Key_Config(); /* 等待中断的到来 */ while (1) { } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1820 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1634 浏览 1 评论
1104 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
740 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1692 浏览 2 评论
1951浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
756浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
586浏览 3评论
605浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
568浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 22:29 , Processed in 0.942656 second(s), Total 76, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号