完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文主要讲解用keil软件实现中断控制,默认读者keil环境已经配好,且头文件已正确引入,如出现编译错误以及st-link下载问题,请自行百度解决。
前面我们讲了中断控制的简单应用,下面就让我们结合键盘输入和七色灯的知识,看看怎么实现按键优先级屏蔽吧! 功能四:按键优先级屏蔽 具体:使用主板蓝色按键作为一个低优先级中断源,键盘阵列选择其中的一个按键作为 高优先级中断源,当蓝色按键按下一次时,亮红灯,红灯亮 5 秒后自动灭;键盘阵列 的一个按键按下一次时亮绿灯,绿灯亮 10 秒后灭;尝试以下操作: ⚫ 按下键盘阵列的按键,绿灯亮,此时再按蓝色按键,观察红灯是否亮灭 ⚫ 按下蓝色按键,红灯亮,此时再按键盘阵列按键,观察绿灯是否亮灭 默认大家已经完成前面的实验,头文件等引用不再赘述,这里主要修改了几个函数里的参数。 1.GPIO初始化函数 由于用到了键盘输入,新激活了两个管脚PB9和PC5,分别代表键盘阵列的第一行和第一列,由于本实验只用到了键盘上的一个键,因此只激活这两个就够了。 另外由于用到了七色灯,还需要激活七色灯的三个管脚,(其实只用到了两个)这里我用的是PA5,PA6,PA7。LED注意四个管脚的连线,有一个管脚要接GND。 行输出低电平,列上拉并读取,未按键时会一直读高电平,按键按下之后将读到低电平。 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|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_6; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; 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); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOC,&GPIO_InitStructure); GPIO_ResetBits(GPIOC,GPIO_Pin_5); } 2.NVIC初始化函数 这里两个按键需要激活两个通道,第二行设置了优先级组别,我们给主优先级和次优先级分别分配两个bit的储存空间。给蓝色按键分配的优先级为3,给键盘第一个按键的优先级为2,故键盘优先级靠前,有抢占的权利。(由于是列在读取,故中断通道判断的是PB9的电平) void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x03; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } 3.EXTI初始化函数 为两个按键配置外部中断参数 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); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource9); EXTI_InitStructure.EXTI_Line=EXTI_Line9; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); } 4.main函数 int main(void) { GPIO_Configuration(); EXTI_Configuration(); NVIC_Configuration(); while(1); } 5.stm32l1xx_it.c文件里的代码 为了方便,将控制七色灯的管脚define一下 #define PA5 GPIOA,GPIO_Pin_5 #define PA6 GPIOA,GPIO_Pin_6 #define PA7 GPIOA,GPIO_Pin_7 下面是两个中断响应函数,分别响应键盘和蓝色按键,都是SetBits一个管脚delay一段时间再ResetBits,PB9控制绿灯,PC13控制红灯。 如果按下蓝色按键,红灯亮5秒灭,如果按下键盘第一个键,绿灯亮10秒灭。 如果按下蓝色按键紧接着按键盘,红灯变成黄灯(红灯绿灯同时亮)10秒后绿灯灭,灯又变为红色,经过不到5秒,红灯也灭了。 如果先按键盘紧接着按蓝色按键,绿灯不变,10秒后,自动变成红灯,5秒后红灯灭。 更多操作请大家自行实验。 void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line9) != RESET) { GPIO_SetBits(PA6); delay(20000000); GPIO_ResetBits(PA6); EXTI_ClearITPendingBit(EXTI_Line9); } } void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line13) != RESET) { GPIO_SetBits(PA5); delay(10000000); GPIO_ResetBits(PA5); EXTI_ClearITPendingBit(EXTI_Line13); } } 别忘了写上次用过的delay()函数啊! 至此,拓展实验已经全部完成,如果代码或者讲解有错误欢迎指出,大家也可以讨论自己的思路,由于鄙人时间有限,细节的疑问请大家认真思考,自力更生 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:02 , Processed in 0.866398 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号