1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文主要讲解用keil软件实现中断控制,默认读者keil环境已经配好,且头文件已正确引入,如出现编译错误以及st-link下载问题,请自行百度解决。
功能一:实现按键中断控制灯的亮灭,按一下灯亮,再按一下灯灭。 1.头文件 为了避免keil报错,我们除了关掉报错功能,可以在开头引入需要的头文件。 #include "stm32l1xx_gpio.h" #include "stm32l1xx_rcc.h" #include "stm32l1xx.h" #include "stm32l1xx_exti.h" #include "misc.h" #include "stm32l1xx_syscfg.h" 2.初始化GPIO接口 这里我们激活了两个GPIO时钟,初始化了两个管脚,分别为PA5,PC13,分别控制STM32L152RE的LED2灯和蓝色按键。灯是输出,按键是输入,两者都配成浮空,常态受程序和外部输入控制。 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_40MHz; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOC,&GPIO_InitStructure); } 3.初始化NVIC接口 这里优先级组使用默认的Group0,所以没有设置,如果需要优先级设置需要加一行代码,后面会提到。由于发起中断的是PC13,所以IRQChannel设为10-15(这几个管脚共用一个通道) 接下来两行是主优先级和次优先级,这次没什么用,都设成15,最后激活通道。 void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } 4.初始化EXTI接口 设置外部中断的引脚,这里需要用到APB2时钟,给PC13设置中断线为上升沿触发,当捕获到按键被按下又抬起(即按键在上升)时,会触发外部中断,并通过通道调用EXTI15_10_IRQHandler(void)函数,注意这个函数名是固定的,在向量中断表里,如果修改需要连向量中断表一起改了。而这个函数的内容需要自己填写,写在stm32l1xx_it.c文件中 void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource13); EXTI_InitStructure.EXTI_Line=EXTI_Line13; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); } 5.主函数main() 分别调用三个初始化函数,并写一个无限循环保证程序一直在执行可以被打断。 int main(void) { GPIO_Configuration(); EXTI_Configuration(); NVIC_Configuration(); while(1); } 6.EXTI15_10_IRQHandler()函数 打开stm32l1xx_it.c文件,把函数写在文件末尾(或者写哪都行,只要别插在其他函数里面就行) 该函数判断中断是否在指定位置发生,如果发生就将灯的状态反转。 void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line13) != RESET) { /* Toggle LED1 */ //STM_EVAL_LEDToggle(LED1); GPIO_ToggleBits(GPIOA, GPIO_Pin_5); /* Clear the EXTI line 13 pending bit */ EXTI_ClearITPendingBit(EXTI_Line13); } } 至此,按键中断控制灯的亮灭,按一下灯亮,再按一下灯灭,代码已经实现,只需要编译再烧写就能看到现象啦! 功能二:实现按键按下时亮灯,弹起后灭灯 这个功能很简单,只需要修改一下EXTI初始化函数中的EXTI_Trigger即可,将那一行改成EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;即可 功能三:在上述程序功能的基础上,使用 enable_irq()和 disable_irq()实现中断屏蔽功能并进行测试,先 disable_irq 关闭中断,延迟 5-10 秒后,enable_irq,在程序执行过程中,不断按按键,观察灯的状态。 1.延迟函数delay() 加入以下代码 void delay(int nCount) { for(;nCount>0;nCount--); } 2.修改主函数main()中的while循环 按题目描述插入代码 while(1) { __disable_irq(); delay(10000000); __enable_irq(); } 只需要小小的改动就能得到想实现的功能,是不是很有趣呀! 由于时间问题,拓展实验会过两天放出,大家可以先自己思考 功能四:按键优先级屏蔽 具体:使用主板蓝色按键作为一个低优先级中断源,键盘阵列选择其中的一个按键作为 高优先级中断源,当蓝色按键按下一次时,亮红灯,红灯亮 5 秒后自动灭;键盘阵列 的一个按键按下一次时亮绿灯,绿灯亮 10 秒后灭;尝试以下操作: ⚫ 按下键盘阵列的按键,绿灯亮,此时再按蓝色按键,观察红灯是否亮灭 ⚫ 按下蓝色按键,红灯亮,此时再按键盘阵列按键,观察绿灯是否亮灭 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1777 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1080 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1678 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
554浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 09:34 , Processed in 0.842482 second(s), Total 76, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号