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

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章