按键按下产生一个中断信号,MCU接收到信号后将led反转
(1)建立工程,新建工程的步骤就不说了!请参考我之前的帖子:
STM32F411【Nucleo】第一课--新建工程(基于keil 5.13)
(2)添加led相关文件,参考我写的led驱动
STM32F411【Nucleo】第二课--led灯(基于keil5.13)
添加延时相关函数,利用SysTick定时器精确延时,参考帖子
STM32F411【Nucleo】第三课--sysTick定时器(基于keil5.13)
(3)新建bsp_key.c bsp_exit.c和bsp_key.h
bsp_key.c
- #include "bsp_key.h"
- void KEY_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
- /******使能GPIOC时钟*****/
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
- /******KEY对应引脚*****/
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
- /******普通输入模式*****/
- GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
- /*****上拉******/
- GPIO_Init(GPIOC,&GPIO_InitStructure);
- /******初始化PC13*****/
- }
复制代码
bsp_exit.c
- #include "bsp_exit.h"
- #include "bsp_key.h"
- void EXTIX_Init(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
-
- KEY_Init();//按键对应的IO口初始化
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//使用中断即为使用复用功能,这点M4与M3有区别
-
- SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource13);//PC13连接线13
-
- EXTI_InitStructure.EXTI_Line=EXTI_Line13;//LINE13
- EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断事件
- EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//上升沿触发
- EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能LINE13
- EXTI_Init(&EXTI_InitStructure);
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置系统化中断优先级分组1
- NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断10-15
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;//抢占优先级0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;//子优先级2
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能外部中断通道
- NVIC_Init(&NVIC_InitStructure);
-
- }
复制代码
bsp_key.h
- #ifndef _BSP_KEY_H_
- #define _BSP_KEY_H_
- #include "stm32f4xx.h"
- #define KEY GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)
- void KEY_Init(void);
-
- #endif
复制代码
(4)修改stm32f4xx_it.c
- #include "stm32f4xx_it.h"
- #include "bsp_led.h"
- extern void TimingDelay_Decrement(void);
- ……
- ……
- ……
- void SysTick_Handler(void)
- {
- TimingDelay_Decrement();
- }
- void EXTI15_10_IRQHandler(void)
- {
- if(EXTI_GetITStatus(EXTI_Line13) != RESET) //确保是否产生了EXTI Line中断
- {
-
- LED_TOGGLE;
- EXTI_ClearITPendingBit(EXTI_Line13); //清除中断标志位
- }
- }
复制代码
编译下载后,多次按下按键就能看见led状态不多反转
5.æé®ï¼ä¸ææ¹å¼ï¼.zip
(9.17 MB, 下载次数: 307)
|