一:软件流程设计
•初始化系统
。 初始化GPIO、EXTI外设时钟
。 初始化按键和LED引脚
。 初始化EXTI外部中断条件
。 初始化NVIC嵌套中断控制器及分组
·编写外部中断函数
。 判断中断发生控制LED火
weak:弱定义;如果用户没有自己定义的中断函数,则系统默认执行系统自定义的中断函数,如果用户有定义中断函数则优先执行用户的中断函数。
1:exti_key.c工程
#include "stm32f10x.h"
#include "exti_key.h"
void Exti_key_Init(void)//外部中断按键的初始化函数
{
//有4个步骤 初始化系统 1:初始化GPIO、EXTI外设时钟 2:初始化按键和LED引脚
// 3:初始化EXTI外部中断条件 4:初始化NVIC嵌套中断控制器及分组
GPIO_InitTypeDef Exti_key_Initstruct;//初始化外部中断按键的GPIO的结构体
EXTI_InitTypeDef EXTIInitstruct;//初始化EXTI外部中断的结构体
NVIC_InitTypeDef NVICInitstruct;//初始化NVIC嵌套中断控制器的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//打开APB2总线下的GPIOA和EXTI外设的时钟
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组
Exti_key_Initstruct.GPIO_Pin=GPIO_Pin_0 ;//配置A0引脚
Exti_key_Initstruct.GPIO_Mode= GPIO_Mode_IPU;//配置引脚输入模式为上拉输入
GPIO_Init(GPIOA, &Exti_key_Initstruct);//初始化GPIOA的结构体
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//IO口加上外部中断的功能
EXTIInitstruct.EXTI_Line=EXTI_Line0 ;//选择外部中断线0
EXTIInitstruct.EXTI_Mode=EXTI_Mode_Interrupt ;//配置触发方式为下降沿触发
EXTIInitstruct.EXTI_Trigger= EXTI_Trigger_Falling ;//配置为中断模式
EXTIInitstruct.EXTI_LineCmd=ENABLE;//使能外部中断线
EXTI_Init(&EXTIInitstruct);//初始化EXTI外部中断的结构体
NVICInitstruct.NVIC_IRQChannel=EXTI0_IRQn ;//使能外部中断0的中断通道
NVICInitstruct.NVIC_IRQChannelPreemptionPriority=0;//设置主优先级
NVICInitstruct.NVIC_IRQChannelSubPriority=0;//设置子优先级
NVICInitstruct.NVIC_IRQChannelCmd=ENABLE;//使能中断通道
NVIC_Init(& NVICInitstruct);//初始化NVIC嵌套中断控制器的结构体
}
2:exti_key.h工程
#ifndef EXTI_KEY_H_
#define EXTI_KEY_H_
void Exti_key_Init(void);
#endif
3:main.c工程
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"
void delay(uint16_t time)//延时1ms 软件延时粗延时
{
uint16_t i=0;
while(time --)
{
i=12000;
while(i --);
}
}
int main()
{
Exti_key_Init();
LED_Init();//初始化灯的时钟和引脚配置
GPIO_SetBits(GPIOA, GPIO_Pin_1);//初始化灯灭
while(1)
{
}
}
void EXTI0_IRQHandler()//EXTI0线中断服务函数(PA0引脚触发)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)//检查EXTI0线是否触发了中断
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
delay(1000);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
delay(1000);
}
EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI0的中断标志位(必须操作)
}