完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
本文说明
项目功能 实现一个按键控制两个LED灯在两个状态下的自由切换 一个状态是跑马灯,另一个状态是双闪 相关软件使用说明 STM32CubeMX+Keil+Proteus相关的安装、使用、配置等基础操作不再赘述,有关内容的详细介绍如下 STM32CubeMX+Keil5+Proteus实现按键控制LED灯(入门篇). 外部中断介绍 中断知识点
STM32CubeMX配置 1.指定引脚 选择PA1,PA2引脚做为LED灯的输出引脚 选择PB0引脚做为按键输入的引脚 2.将GPIO设置为GPIO_EXTI功能 右键PB0引脚,选择GPIO_EXTI0(PB0对应的连接引脚) 3.设置中断触发条件 在GPIO中配置PB0引脚的模式为外部中断且下降沿触发检测 同时设置上拉,标签名Key 选择的时候看看英文是否对应 PA1和PA2引脚设置默认输出低电平,无上拉/下拉,高速输出,标签的话设置LED1和LED2 4.使能NVIC通道 在NVIC(内嵌向量中断控制器)中勾选"EXTI line0 interrupt",使能中断 接着设置晶振,配置时钟树,72MHz即可 最后输出生成项目代码。 Keil编辑代码逻辑 打开工程,我们看一下用户代码目录 由于在STM32CubeMX中设置了外部中断,所以多了一个stm32f1xx_it.c文件 进入文件,找到函数EXTI0_IRQHandler() 该函数的内部就是外部中断服务函数,右键选择“Go To Definition Of…" 可以看到这个函数if语句中又有两个函数 其中HAL_GPIO_EXTI_CLEAR_IT()的作用就是清除中断标志 而我们需要关注的则是回调函数HAL_GPIO_EXTI_Callback() 它被定义为一个虚函数 __weak void HAL_GPIO_EXTI_Callback(… ) 我们作为用户只需要调用重写这个虚函数即可 找到main.c文件,粘贴我们的外部中断处理函数 注意要在主函数体外的"Private user code"下的 /* USER CODE BEGIN 0 / / USER CODE END 0 */ 内写我们的代码,如下图所示 设置一个变量EXTI_SIGN记录外部中断的次数 每发生一次外部中断该变量+1 int EXTI_SIGN = 0; //外部中断标志 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //外部中断回调函数 { EXTI_SIGN++; } 然后我们通过判断变量EXTI_SIGN的奇偶性来切换LED灯的状态 具体代码写在主函数内的循环体while(1)内,代码如下 while (1) { //程序功能:利用外部中断来实现按键控制LED灯在两个状态(跑马灯和双闪)之间的切换 if(EXTI_SIGN%2 == 0) { HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_RESET); HAL_Delay(100); HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_SET); HAL_Delay(100); } else if(EXTI_SIGN%2 == 1) { HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_RESET); HAL_Delay(100); HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA,LED2_Pin,GPIO_PIN_SET); HAL_Delay(100); } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } 最后编译生成hex文件即可拿来仿真了 Proteus仿真 原理图如下 别忘记点击芯片选择hex文件,同时配置主频72MHz 点击左下角,仿真运行即可验证结果,这里就不展示了 总结 主要学习了外部中断的原理,然后用一个具体项目来实现外部中断 我是爱学习的诸葛铁锤,觉得有用的话点个赞哈,啾咪 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1933浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
726浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
550浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 14:45 , Processed in 0.790651 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号