stm32 按键(中断)控制LED的亮灭,按一次亮,再按一次灭;

main.c
/*********************************************************************************************************
*                                       头文件
*********************************************************************************************************/
#include<includes.h>
/****************************
int main(void)
{	
	BSP_Init ();/*系统初始化*/
	
	USART_OUT(USART1,"  恭喜你 :开机成功\r\n");/**开机字符*/
	
    GPIO_ResetBits(GPIOB,GPIO_Pin_0);
	while(1)
	{
        while_1();

	}	
}

****************************************************************************** 函数声明*********************************************************************************************************/extern void BSP_Init (void); /*系统配置*/extern void while_1(void); /*转入函数*/extern int flag;/***printf函数 串口输出*不要删除**/void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);char *itoa(int value, char *string, int radix);int fputc(int ch,FILE *f);stm32f10x_it.c
void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line11)!=RESET)
	{
       if(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11))                   //判断是A~G哪个被触发
		{
            GPIO_ToggleBits(GPIOB,GPIO_Pin_0);
        }
		while(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11));               //松手检测
   }
	
	EXTI_ClearITPendingBit(EXTI_Line11);  //清除EXTI0线路挂起位
}

bsp.c    配置

#include<includes.h>

/*********************************************************************************************************
*                                          全局变量
*********************************************************************************************************/

/*********************************************************************************************************
*                                          函数声明
*********************************************************************************************************/
void RCC_Configuration(void);   /* 初始化系统时钟 */
void GPIO_Configuration(void);  /* IO口的配置*/
void NVIC_Configuration(void);  /* 优先级配置 */
void USART1_Configuration(void); /* 串口配置 */
void USART2_Configuration(void); /* 串口配置 */
void EXTI_Configuration(void);	/* 外部中断配置 */
//void TIM3_Configuration(void);
//void TIM4_Configuration(void);
//void TIM5_Configuration(void);
//void TIM6_Configuration(void);
//void TIM7_Configuration(void);

/*********************************************************************************************************
* 名    称 :BSP_Init
* 功能描述 : 系统初始化
* 输入参数 : none
* 返回参数 : none.
* 作    者 : 
* 修    改 :(日期、修改人名、修改原因)
* 特殊说明 : (特殊功能说明,例如:有参数检查等)
*********************************************************************************************************/
void  BSP_Init (void)
{
	RCC_Configuration();
	EXTI_Configuration();
	GPIO_Configuration();	
	NVIC_Configuration();
	USART1_Configuration();		//串口打印	   
    USART2_Configuration();		//串口打印	
//	TIM1_Configuration();		
//	TIM4_Configuration();		 //pwm
// 	TIM5_Configuration();
// 	TIM6_Configuration();		//定时更新姿态
//	TIM7_Configuration();		//精确延时
}
/*********************************************************************************************************
* 名    称 :RCC_Configuration
* 功能描述 : 初始化系统时钟
* 输入参数 : none
* 返回参数 : none.
* 作    者 : 
* 修    改 :(日期、修改人名、修改原因)
* 特殊说明 : (特殊功能说明,例如:有参数检查等)
*********************************************************************************************************/
void RCC_Configuration(void){

  SystemInit(); 
  /*APB1 72MHz,具体有哪些在此时钟上可跳进去查看*/
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5 | RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM6|RCC_APB1Periph_TIM7
  						| RCC_APB1Periph_USART2, ENABLE);   /*72MHZ*/
  /*APB2 36MHz 具体有哪些在此时钟上可跳进去查看*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
  						| RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE
						| RCC_APB2Periph_GPIOE| RCC_APB2Periph_USART1, ENABLE);  /* 36MHZ */
}

/*********************************************************************************************************
* 名    称 :GPIO_Configuration
* 功能描述 : 初始化UCOS系统、初始化STM32
* 输入参数 : none
* 返回参数 : none.
* 作    者 : 
* 修    改 :(日期、修改人名、修改原因)
* 特殊说明 : (特殊功能说明,例如:有参数检查等)
*********************************************************************************************************/ 
void GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
    
    /* LED灯的配置 */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;			 //通用推挽输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			 //输出模式最大速度50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);	
    
    /* 按键的配置 */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 			//设置成上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	   
	GPIO_Init(GPIOB, &GPIO_InitStructure);						    


  
//	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4| GPIO_Pin_5;
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;			 //通用推挽输出模式
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			 //输出模式最大速度50MHz
//	GPIO_Init(GPIOC, &GPIO_InitStructure);
		    
}
void EXTI_Configuration(void)
{
 
	EXTI_InitTypeDef EXTI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
    //GPIOC.5 中断线以及中断初始化配置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                        //设置成上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	   
	GPIO_Init(GPIOB, &GPIO_InitStructure);                               //以上是对于需要用到的I/O口的配置

  	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);          //选择gpioB11口作为外部中断使用
  	EXTI_InitStructure.EXTI_Line=EXTI_Line11;                            //使能外部中断线5 
  	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	                //外部中断
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;             //下降沿触发
  	EXTI_InitStructure.EXTI_LineCmd = ENABLE;                           //中断线使能
  	EXTI_Init(&EXTI_InitStructure);	
}

void NVIC_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_SetVectorTable(NVIC_VectTab_FLASH, 2);  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);	  
	
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;       //USB_LP_CAN1_RX0_IRQn;	   //CAN1 RX0中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;		   //抢占优先级0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			   //子优先级为0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
    
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;       //USB_LP_CAN1_RX0_IRQn;	   //CAN1 RX0中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;		   //抢占优先级0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			   //子优先级为0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
//	NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;		   
//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			   
//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//	NVIC_Init(&NVIC_InitStructure);
//	
//	NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;		   
//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;			
//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;			//外部中断	中断线2的中断		
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//主优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			//从优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 			//使能
	NVIC_Init(&NVIC_InitStructure);	

//	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;			//外部中断	中断线2的中断		
//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//主优先级
//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			//从优先级
//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 			//使能
//	NVIC_Init(&NVIC_InitStructure);		

}




 

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32是一款基于ARM Cortex-M系列内核的32位微控制器,可用于开发嵌入式系统。按键中断LED是嵌入式系统中非常常见的功能,下面我将用300字回答如何使用STM32按键中断控制LED灯的。 首先,我们需要连接一个按键和一个LED灯到STM32控制器的相应引脚上。假设按键连接到PA0引脚,LED灯连接到PC13引脚。 接下来,我们需要配置STM32的GPIO外设来控制这些引脚。首先,开启相关引脚的时钟。然后,将PA0引脚配置为输入模式,PC13引脚配置为输出模式。可以使用STM32的寄存器或者开发环境提供的库函数来完成这些配置。 然后,我们需要配置外部中断。配置PA0引脚所对应的外部中断线,使其可以检测到按键的状态变化。可以使用STM32的寄存器或者库函数来完成这个配置。 紧接着,我们编写中断处理函数。当按键状态发生变化,中断触发时,中断处理函数被调用。在该函数中,我们可以读取按键引脚的状态,如果按键被按下,我们将PC13引脚设置为高电平,LED起;如果按键被释放,我们将PC13引脚设置为低电平,LED灯熄。 最后,我们需要在主函数中启用中断。启用中断后,当按键状态发生变化时,中断处理函数将被调用。 以上就是使用STM32按键中断控制LED的步骤。通过配置GPIO外设和外部中断,编写中断处理函数,我们能够实现按下按键时,LED起;释放按键时,LED灯熄的功能。这样就完成了按键中断控制LED的任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值