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
相关推荐
笨鸟笃行5 小时前
英语学习——单词篇(第十七天)
学习
nenchoumi31195 小时前
ROS2 Humble 笔记(十二)launch 文件与 namespace 启动多个节点
笔记·机器人·ros2
CwSy_5 小时前
openlab配置作业
笔记
d111111111d5 小时前
STM32TIM定时器外设学习,输出比较模式(舵机,驱动直流电机)
笔记·stm32·单片机·嵌入式硬件·学习
立志成为大牛的小牛5 小时前
数据结构——四十、折半查找(王道408)
数据结构·学习·程序人生·考研·算法
东方欲晓w6 小时前
Git高效开发:常用命令速查指南
git·stm32·学习
zxb@hny6 小时前
stm32 的isr向量位置问题,不然跑飞了,程序跑到异常地址,main都没进去
stm32·单片机·嵌入式硬件
m0_690780526 小时前
STM32各时钟的介绍,中断
stm32·单片机·嵌入式硬件
nenchoumi31196 小时前
ROS2 Humble 笔记(十)多机分布式通讯 DDS 与宿主机和Docker容器
笔记·机器人·ros2
清钟沁桐6 小时前
mlir 编译器学习笔记之六 -- 经典实现
笔记·学习·mlir