一个热爱代码的工程师,唯有凭借双手不断敲打,才可以快速提升实力!
本文谨以记录,日后相忘时再作复习,代码没有贵贱,既来之则安之。
第一步:编写exti.h头文件
#ifndef __EXIT_H
#define __EXIT_H
#include "sys.h"
void EXIT_Init(void);//EXTI外部中断初始化
#endif
头文件很简单,里面放一个外部中断初始化声明即可。
第二步:编写exit.c文件,在该文件中编写EXTI外部中断的初始化函数,该外部中断是将按键对应的GPIO引脚作为中断的出发事件。
#include "exit.h"
#include "key.h"
#include "led.h"
#include "beep.h"
#include "delay.h"
#include "stdio.h"
void EXTI0_IRQHandler(void)//按键KEY_UP的中断服务函数
{
delay_ms(10);
if(KEY_UP==1)
{
BEEP=!BEEP;
}
EXTI->PR=1<<0;//清除LINE0的中断标志位
}
void EXTI3_IRQHandler(void)//按键KEY1的中断服务函数
{
delay_ms(10);//按键消抖
if(KEY1==0)
{
LED1=!LED1;
}
EXTI->PR=1<<3;//清除LINE3的中断标志位
}
void EXTI4_IRQHandler(void)//按键KEY0的中断服务函数
{
delay_ms(10);//按键消抖
if(KEY0==0)
{
LED0=!LED0;
}
EXTI->PR=1<<4;//清除LINE4的中断标志位
}
void EXIT_Init(void)//外部中断初始化
{
printf("EXIT_Init\r\n");
KEY_Init();
Ex_NVIC_Config(GPIO_A,0,RTIR);
Ex_NVIC_Config(GPIO_E,3,FTIR);
Ex_NVIC_Config(GPIO_E,4,FTIR);
MY_NVIC_Init(2,3,EXTI0_IRQn,2);
MY_NVIC_Init(2,1,EXTI3_IRQn,2);
MY_NVIC_Init(2,0,EXTI4_IRQn,2);
}
第三步:编写main函数,因为是外部中断,所以无论main函数中执行什么都没有关系,即使是while死循环,中断依旧可以触发。
/*
* 自学DIY */
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "exit.h"
u8 Wl_stat=0;
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200); //串口初始化为115200
LED_Init();
BEEP_Init();
EXIT_Init();
printf("-------------------- \r\n");
printf(" 自学->嵌入式 \r\n");
printf(" 版本:1.0.0 \r\n");
printf("-------------------- \r\n");
while(1)
{
if(Wl_stat==0)//代表进入WHILE循环
{
printf("Input While(1)-->\r\n");
Wl_stat=1;
}
printf("Running......\r\n");
delay_ms(5000);
}
}
第四步:编译通过后,烧录进STM32F103ZET6开发板,实现程序设计效果即可。
PS:在编写外部中断的过程中,确实遇到了一个不应该犯却又是特别容易忽略的问题,脸上一脸懵逼,心里MMP,嘀咕了半天发现把中断服务函数EXTI0_IRQHandler()写成了EXIT0_IRQHandler(),乍一看真看不出来,找了N多边才发现,果然写代码细心很重要。
想太多,做太少,怎改变自己
谢谢大家的关注和支持,来自一个嵌入式软硬件工程师的内心情感!
PS:本文的代码参考正点原子