当前位置: 首页 > article >正文

嵌入式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引脚GPIOA1GPIO_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结构体}

按键

key.h
void Key_Init(void);
key.c
#include "key.h"
#include "stm32f10x.h"void Key_Init(void)
{GPIO_InitTypeDef Key_Initstruct;EXTI_InitTypeDef exti_key_initstruct;NVIC_InitTypeDef nvic_key_initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,  ENABLE);  //时钟初始化//按键Key_Initstruct.GPIO_Pin=GPIO_Pin_0;Key_Initstruct.GPIO_Mode=GPIO_Mode_IPU;  GPIO_Init(GPIOA, &Key_Initstruct);    
//按键Key_Initstruct.GPIO_Pin =GPIO_Pin_13;Key_Initstruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOC, &Key_Initstruct);    GPIO_EXTILineConfig( GPIO_PortSourceGPIOA , GPIO_PinSource0);			//中断线exti_key_initstruct.EXTI_Line = EXTI_Line0;							//中断exti_key_initstruct.EXTI_Mode = EXTI_Mode_Interrupt;exti_key_initstruct.EXTI_Trigger = EXTI_Trigger_Falling;exti_key_initstruct.EXTI_LineCmd = ENABLE;EXTI_Init(&exti_key_initstruct);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                //NVIC分组nvic_key_initstruct.NVIC_IRQChannel = EXTI0_IRQn;                //NVIC初始化nvic_key_initstruct.NVIC_IRQChannelPreemptionPriority = 0;nvic_key_initstruct.NVIC_IRQChannelSubPriority = 0;nvic_key_initstruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_key_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();Key_Init();GPIO_SetBits( GPIOA, GPIO_Pin_1);while(1){delay(1000);GPIO_SetBits( GPIOA, GPIO_Pin_1);}		
}void EXTI0_IRQHandler()  //中断函数
{if(EXTI_GetITStatus(EXTI_Line0) != RESET)//判断是否满足中断条件{GPIO_ResetBits(GPIOA,GPIO_Pin_1);EXTI_ClearITPendingBit(EXTI_Line0);			//外部中断标志位清除,为下一次中断留出位置,一般与EXTI_GetITStatus一起使用}
}

 个人感悟:

难,要多练!!!

小练习:

外部中断震动感应灯

嵌入式STM32学习——外部中断震动感应灯-CSDN博客

http://www.lryc.cn/news/2379218.html

相关文章:

  • 进程状态并详解S和D状态
  • 数据获取_Python
  • <前端小白> 前端网页知识点总结
  • 历史数据分析——宁波海运
  • 小结:jvm 类加载过程
  • OpenCv高阶(八)——摄像头调用、摄像头OCR
  • Java开发经验——阿里巴巴编码规范实践解析3
  • MySQL——6、内置函数
  • MySQL如何查看某个表所占空间大小?(表空间大小查看方法)
  • 软件架构之-论软件系统架构评估以及应用
  • 低延迟与高性能的技术优势解析:SmartPlayer VS VLC Media Player
  • pytorch小记(十九):深入理解 PyTorch 的 `torch.randint()` 与 `.long()` 转换
  • 深入解析Spring Boot与微服务架构:从入门到实践
  • 【交互 / 差分约束】
  • 宝塔面板部署前后端项目SpringBoot+Vue2
  • 现代生活健康养生新视角
  • 鸿蒙Next API17新特性学习之如何使用新增鼠标轴事件
  • 多模态大语言模型arxiv论文略读(八十一)
  • 3.4/Q2,Charls最新文章解读
  • 通过觅思文档项目实现Obsidian文章浏览器在线访问
  • Python列表全面解析:从入门到精通
  • 5月18总结
  • 赋予AI更强的“思考”能力
  • Linux Bash | Capture Output / Recall
  • 2025/5/18
  • 基于Quicker构建从截图到公网图像链接获取的自动化流程
  • LeetCode算 法 实 战 - - - 双 指 针 与 移 除 元 素、快 慢 指 针 与 删 除 有 序 数 组 中 的 重 复 项
  • uniapp自定义日历计划写法(vue2)
  • Java IO框架
  • 数据库2——查询