嵌入式STM32学习——外部中断震动感应灯
本文展示了一个基于STM32F10x系列微控制器的按键中断练习程序。程序通过配置GPIO端口和外部中断(EXTI)来实现按键触发的中断功能。主要代码包括shake.h、shake.c和main.c三个文件。shake.c中初始化了GPIO端口和外部中断,配置了中断优先级和触发条件。main.c中初始化了LED和按键中断,并在主循环中通过延时函数控制LED状态。当按键触发中断时,中断处理函数EXTI0_IRQHandler会清除中断标志位并改变LED状态。该程序展示了如何通过外部中断实现按键控制LED的基本功
shake.h
#ifndef SHAKE_H_
#define SHAKE_H_void Shake_Init(void);#endif
shake.c
#include "stm32f10x.h"
#include "shake.h"void Shake_Init(void)
{GPIO_InitTypeDef shake_initstruct;EXTI_InitTypeDef exti_initstruct;NVIC_InitTypeDef nvic_initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//时钟初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC分配shake_initstruct.GPIO_Mode=GPIO_Mode_IPU; //按键shake_initstruct.GPIO_Pin=GPIO_Pin_0;GPIO_Init(GPIOA, &shake_initstruct);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//GPIO中断线exti_initstruct.EXTI_Line =EXTI_Line0; //中断exti_initstruct.EXTI_Mode = EXTI_Mode_Interrupt;exti_initstruct.EXTI_Trigger = EXTI_Trigger_Falling;exti_initstruct.EXTI_LineCmd = ENABLE;EXTI_Init(&exti_initstruct);//NVICnvic_initstruct.NVIC_IRQChannel =EXTI0_IRQn; //f10x.h中寻找nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;nvic_initstruct.NVIC_IRQChannelSubPriority = 0;nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_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();Shake_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一起使用}
}
这个程序是按键中断的练习,本文只进行改动代码的展示,其余代码请参照前文。