STM32学习和实践笔记(19):按键控制实验(用STM32的外部中断的方式实现)

花了两小时,对照着视频的讲解,终于成功做完这个实验~~

代码如下:

main.c

cpp 复制代码
#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "beep.h"
#include "DigitalTube.h"
#include "key.h"
#include "exti.h"


int main()
{
	u8 i=0;
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
	LED_Init();
//	BEEP_Init();
//	DigitalTube_Init();
	key_Init();
	My_Exti_Init();
	

	
	while(1)
	{
		
		i++;
		if(i%20 ==0)
		{
			led1=!led1;//LED1闪
		}
		delay_ms(10);
		
	}
}

exti.c

cpp 复制代码
#include "exti.h"
#include "SysTick.h"
#include "key.h"
#include "led.h"


void My_Exti_Init(void) //因为Exti_Init函数名已在库函数中使用了,所以这里取这个名称
{
		NVIC_InitTypeDef NVIC_InitStructure;
		EXTI_InitTypeDef EXTI_InitStructure;
	
	
	//(1)使能IO口时钟,配置IO口模式为输入,这一步在key_Init()已做了,所以这里不需要
	
	//(2)开启 AFIO 时钟,设置 IO 口与中断线的映射关系
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启 AFIO 时钟
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//配置PA0为EXT0的输入线
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);//配置PE2为EXT2的输入线
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);//配置PE3为EXT3的输入线
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);//配置PE4为EXT4的输入线
	
		//(3)配置中断分组(NVIC),中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);放在main里了,
		// 并对中断分组初始化以及使能中断
	

	
	NVIC_InitStructure.NVIC_IRQChannel=	EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=	EXTI2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=	EXTI3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=	EXTI4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

		//(4)初始化EXTI



	//配置EXTI_Line0的模式、触发方式并打开
	EXTI_InitStructure.EXTI_Line = EXTI_Line0;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);

	//配置EXTI_Line2,3,4的模式、触发方式并打开
	EXTI_InitStructure.EXTI_Line = EXTI_Line2|EXTI_Line3|EXTI_Line4;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);

	
}

//以下是中断服务程序

void EXTI0_IRQHandler(void)
{
 if(EXTI_GetITStatus(EXTI_Line0)==1) //判断是否有按键按下而产生外部中断
 {
	 delay_ms(10);//消除抖动
	 if(K_UP ==1)
	 {
		 led2 = ~led2;
	 }
	 
 }
 EXTI_ClearITPendingBit(EXTI_Line0);
 
 }

void EXTI2_IRQHandler(void)
{
 if(EXTI_GetITStatus(EXTI_Line2)==1) //判断是否有按键按下而产生外部中断
 {
	 delay_ms(10);//消除抖动
	 if(K_LEFT ==0)
	 {
		 led3 = ~led3;
	 }
	 
 }
 EXTI_ClearITPendingBit(EXTI_Line2);
 
 }
	

void EXTI3_IRQHandler(void)
{
 if(EXTI_GetITStatus(EXTI_Line3)==1) //判断是否有按键按下而产生外部中断
 {
	 delay_ms(10);//消除抖动
	 if(K_DOWN ==0)
	 {
		 led4 = ~led4;
	 }
	 
 }
 EXTI_ClearITPendingBit(EXTI_Line3);
 
 }

void EXTI4_IRQHandler(void)
{
 if(EXTI_GetITStatus(EXTI_Line4)==1) //判断是否有按键按下而产生外部中断
 {
	 delay_ms(10);//消除抖动
	 if(K_RIGHT ==0)
	 {
		 led5 = ~led5;
	 }
	 
 }
 EXTI_ClearITPendingBit(EXTI_Line4);
 
 }

exti.h

cpp 复制代码
#ifndef _exti_H
#define _exti_H

#include "system.h"

void My_Exti_Init(void) ;


#endif
相关推荐
zhuyixiangyyds5 小时前
day21和day22学习Pandas库
笔记·学习·pandas
每次的天空5 小时前
Android学习总结之算法篇四(字符串)
android·学习·算法
可待电子单片机设计定制(论文)5 小时前
【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)
stm32·单片机·嵌入式硬件
jingjingjing11116 小时前
笔记:docker安装(ubuntu 20.04)
笔记·docker·容器
背影疾风6 小时前
C++学习之路:指针基础
c++·学习
DreamBoy@7 小时前
【408--考研复习笔记】操作系统----知识点速览
笔记
UpUpUp……7 小时前
特殊类的设计/单例模式
开发语言·c++·笔记·单例模式
苏克贝塔7 小时前
CMake学习--Window下VSCode 中 CMake C++ 代码调试操作方法
c++·vscode·学习
odoo中国8 小时前
深度学习 Deep Learning 第15章 表示学习
人工智能·深度学习·学习·表示学习
电星托马斯8 小时前
C++中顺序容器vector、list和deque的使用方法
linux·c语言·c++·windows·笔记·学习·程序人生