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

本文介绍了一个基于STM32的嵌入式系统的初始化过程,包括时钟配置、GPIO配置、中断配置等关键步骤,并实现了简单的LED闪烁功能及通过串口输出提示信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);		

}





评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值