我们都知道一个板子的外部中断很重要,可以相当于一个“”“开关”“”的作用,就是优先去做这个事情。那么,STM32板子的外部中断是怎样的呢。
首先,按照我写代码的顺序,我习惯先写.h文件(一般这种格式都一样,也没什么特别好讲的)
#ifndef __EXTI_H
#define __EXTI_H
void EXTIX_Init(void);
#endif
然后,开始写.c文件
我们记住写外部中断的几个步骤:
①:初始化IO口为输入
GPIO_Init();
②:开启IO口复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
③:设置IO口与中断线的映射关系
void GPIO_EXTLineConflg();
④:初始化线上中断,设置触发条件等
EXIT——Init();
⑤:配置中断分组(NVIC),并使能中断
NVIC_Init();
⑥:编写中断服务函数
EXTIx_IRQHandler();
⑦:清除中断标志位
EXTI_ClearlTPendingBit();
因为我们使用的是KEY之类的作为中断开启的标志:我们找到原理图,可以发现
按键的为PA0和PE3和4,所以我们使能GPIOA和GPIOE。又因为PA0和PE2,PE3(有的可能有PE4)所以我们Pin设置为 2,3,4.还有一些NVIC中断协议(不做任何详细介绍)。
所以.c文件如下所示
#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "stm32f10x.h"
void EXTIX_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOA,&GPIO_InitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
EXTI_InitStruct.EXTI_Line= EXTI_Line4;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel=EXTI4_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStruct);
}
void EXTI4_IRQHandler(void)
{
delay_ms(10);
if(PEin(4)==0){
PBout(5)=!PBout(5);
PEout(5)=!PEout(5);
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
主函数为:
#include "beep.h"
#include "led.h"
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "exti.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
LED_Init();
BEEP_Init();
EXTIX_Init();
PBout(8)=1;
while(1)
{
delay_ms(100);
}
}