按鍵控制LED燈
按鍵控制LED的開發流程:
第一步:使能功能復用時鐘
第二布,配置復用寄存器
第三步,配置中斷屏蔽寄存器
固件庫按鍵控制LED燈
外部中斷EXTI結構體:typedef struct{uint32_t EXTI_Line;
EXTIMode_TypeDef EXTI_Mode;
EXTITrigger_TypeDef EXTI_Trigger;
FunctionalState EXTI_LineCmd;
}EXTI_InitTypeDef;外部中斷EXTI相關庫函數:void EXTI_DeInit(void);void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);void EXTI_ClearFlag(uint32_t EXTI_Line);ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
軟件流程設計
- 初始化系統
????????????????初始化GPIO、EXTI外設時鐘
????????????????初始化按鍵和LED引腳
????????????????初始化EXTI外部中斷條件
????????????????初始化NVIC嵌套中斷控制器及分組
- 編寫外部中斷函數
????????????????判斷按鍵是否按下控制LED燈
weak:若弱定義;如果用戶沒有自己定義的中斷函數,則系統默認執行系統自定義的中斷函數,如果用戶有定義中斷函數則優先執行用戶的中斷函數。
實現代碼
LED
led.h
#ifndef LED_H_
#define LED_H_void LED_Init(void);#endif
led.c
#include "led.h"
#include "stm32f10x.h"//初始化LED燈的函數————函數的定義、聲明、調用(led.c led.h main.c)
void LED_Init(void)
{//1.初始化led引腳GPIOA1GPIO_InitTypeDef led_initstruct; //定義GPIO的結構體//2.3?ê??ˉê±?óRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//時鐘的初始化led_initstruct.GPIO_Pin = GPIO_Pin_1;led_initstruct.GPIO_Speed = GPIO_Speed_2MHz;led_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&led_initstruct); //初始化GPIO結構體}
按鍵
key.h
void Key_Init(void);
key.c
#include "key.h"
#include "stm32f10x.h"void Key_Init(void)
{GPIO_InitTypeDef Key_Initstruct;EXTI_InitTypeDef exti_key_initstruct;NVIC_InitTypeDef nvic_key_initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); //時鐘初始化//按鍵Key_Initstruct.GPIO_Pin=GPIO_Pin_0;Key_Initstruct.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(GPIOA, &Key_Initstruct);
//按鍵Key_Initstruct.GPIO_Pin =GPIO_Pin_13;Key_Initstruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOC, &Key_Initstruct); GPIO_EXTILineConfig( GPIO_PortSourceGPIOA , GPIO_PinSource0); //中斷線exti_key_initstruct.EXTI_Line = EXTI_Line0; //中斷exti_key_initstruct.EXTI_Mode = EXTI_Mode_Interrupt;exti_key_initstruct.EXTI_Trigger = EXTI_Trigger_Falling;exti_key_initstruct.EXTI_LineCmd = ENABLE;EXTI_Init(&exti_key_initstruct);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC分組nvic_key_initstruct.NVIC_IRQChannel = EXTI0_IRQn; //NVIC初始化nvic_key_initstruct.NVIC_IRQChannelPreemptionPriority = 0;nvic_key_initstruct.NVIC_IRQChannelSubPriority = 0;nvic_key_initstruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_key_initstruct);
}
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "shake.h"
void delay(uint16_t time)
{uint16_t i=0;while(time--){i =12000;while(i--);}}int main()
{LED_Init();Key_Init();GPIO_SetBits( GPIOA, GPIO_Pin_1);while(1){delay(1000);GPIO_SetBits( GPIOA, GPIO_Pin_1);}
}void EXTI0_IRQHandler() //中斷函數
{if(EXTI_GetITStatus(EXTI_Line0) != RESET)//判斷是否滿足中斷條件{GPIO_ResetBits(GPIOA,GPIO_Pin_1);EXTI_ClearITPendingBit(EXTI_Line0); //外部中斷標志位清除,為下一次中斷留出位置,一般與EXTI_GetITStatus一起使用}
}
?個人感悟:
難,要多練!!!
小練習:
外部中斷震動感應燈
嵌入式STM32學習——外部中斷震動感應燈-CSDN博客