嵌入式STM32学习——外部中断EXTI与NVIC的基础练习⭐

按键控制LED灯

按键控制LED的开发流程:

第一步:使能功能复用时钟

第二布,配置复用寄存器

第三步,配置中断屏蔽寄存器

固件库按键控制LED灯

复制代码
外部中断EXTI结构体:

typedef struct
 {
 uint32_t EXTI_Line;              
EXTIMode_TypeDef EXTI_Mode;       
EXTITrigger_TypeDef EXTI_Trigger; 
FunctionalState EXTI_LineCmd;    
}EXTI_InitTypeDef;

外部中断EXTI相关库函数:

void EXTI_DeInit(void);
 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
 void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
 FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
 void EXTI_ClearFlag(uint32_t EXTI_Line);
 ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
 void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

软件流程设计

  • 初始化系统

初始化GPIO、EXTI外设时钟

初始化按键和LED引脚

初始化EXTI外部中断条件

初始化NVIC嵌套中断控制器及分组

  • 编写外部中断函数

判断按键是否按下控制LED灯

weak:若弱定义;如果用户没有自己定义的中断函数,则系统默认执行系统自定义的中断函数,如果用户有定义中断函数则优先执行用户的中断函数。

实现代码

LED

led.h
复制代码
#ifndef LED_H_
#define LED_H_



void LED_Init(void);

#endif
led.c
复制代码
#include "led.h"
#include "stm32f10x.h"
 
//初始化LED灯的函数------------函数的定义、声明、调用(led.c    led.h  main.c)
void LED_Init(void)
{
	//1.初始化led引脚GPIOA1
	GPIO_InitTypeDef  led_initstruct;  //定义GPIO的结构体
	
 
	
		//2.³õʼ>>¯Ê±ÖÓ
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//时钟的初始化
		
		
		
		led_initstruct.GPIO_Pin = GPIO_Pin_1;
		led_initstruct.GPIO_Speed = GPIO_Speed_2MHz;
		led_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;
	
	GPIO_Init(GPIOA,&led_initstruct);  //初始化GPIO结构体
	
	
	
	
	
}

按键

shake.h
复制代码
#ifndef SHAKE_H_
#define SHAKE_H_



void Shake_Init(void);

#endif
shake.c
复制代码
#include "stm32f10x.h"
#include "shake.h"


void Shake_Init(void)
{
		GPIO_InitTypeDef shake_initstruct;
		EXTI_InitTypeDef exti_initstruct;
		NVIC_InitTypeDef nvic_initstruct;
	
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//时钟初始化
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       //NVIC分配

		shake_initstruct.GPIO_Mode=GPIO_Mode_IPU;                //按键
		shake_initstruct.GPIO_Pin=GPIO_Pin_0;
		GPIO_Init(GPIOA, &shake_initstruct);
	
		GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//GPIO中断线
	
		exti_initstruct.EXTI_Line =EXTI_Line0;                    //中断
		exti_initstruct.EXTI_Mode = EXTI_Mode_Interrupt;
		exti_initstruct.EXTI_Trigger = EXTI_Trigger_Falling;
		exti_initstruct.EXTI_LineCmd = ENABLE;
		EXTI_Init(&exti_initstruct);
		
		
	//NVIC
	
		nvic_initstruct.NVIC_IRQChannel =EXTI0_IRQn;							//f10x.h中寻找
		nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;
		nvic_initstruct.NVIC_IRQChannelSubPriority = 0;
		nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&nvic_initstruct);
}

main.c

复制代码
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "shake.h"
void delay(uint16_t time) 
{
	uint16_t i=0;
	while(time--)
	{
		i =12000;
		while(i--);
	}

}
 
int  main()
{
	
	
	LED_Init();
	Shake_Init();
	
	GPIO_SetBits( GPIOA, GPIO_Pin_1);
	
	while(1)
	{
		
	}		
}

void EXTI0_IRQHandler()  //中断函数
{
	if(EXTI_GetITStatus(EXTI_Line0) != RESET)//外部中断获取标志位,即查看是否满足中断条件
	{
			GPIO_ResetBits(GPIOA,GPIO_Pin_1);
			
		
			EXTI_ClearITPendingBit(EXTI_Line0);	        //外部中断标志位清除,为下一次中断留出位置,一般与EXTI_GetITStatus一起使用
	
	}
}

个人感悟:

难,要多练!!!

相关推荐
Tonya4316 小时前
测开学习DAY37
学习
纳祥科技1 天前
Switch快充方案,内置GaN,集成了多个独立芯片
单片机
roman_日积跬步-终至千里1 天前
【强化学习基础(2)】被动强化学习:学习价值函数
学习
逢考必过@k1 天前
6级550学习ing
学习
单片机日志1 天前
【单片机毕业设计】【mcugc-mcu826】基于单片机的智能风扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·课程设计·电子信息
陈天伟教授1 天前
基于学习的人工智能(7)机器学习基本框架
人工智能·学习
Z***G4791 天前
网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件
爬虫·学习·计算机外设
我命由我123451 天前
微信开发者工具 - 模拟器分离窗口与关闭分离窗口
前端·javascript·学习·微信小程序·前端框架·html·js
DKPT1 天前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring