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

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

按键

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);//NVICnvic_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一起使用}
}

 

 个人感悟:

难,要多练!!!

相关文章:

  • 大便次数与寿命有关?
  • 通过SSRF击穿内网!kali-ssrf靶场实战!
  • 基于MNIST数据集的手写数字识别(简单全连接网络)
  • 蓝桥杯 16. 外卖店优先级
  • 抖音怎么快速涨粉(抖音推流算法研究)
  • Qt多线程编程实践总结:QtConcurrent与moveToThread应用场景对比(可以说都是干货)
  • 接口(API)开发核心知识点
  • Qt —— 使用Enigma Virtual Box将Qt程序打包为独立可运行exe(附:完整打包方法且完美运行)
  • CSRF防范歪招
  • 分区器介绍
  • Java集合框架详解与使用场景示例
  • PyInstaller 打包后 Excel 转 CSV 报错解决方案:“excel file format cannot be determined“
  • uniapp(vue3)动态计算swiper高度封装自定义hook
  • Foupk3systemX5OS TXW8移动设备
  • UE5中制作动态数字Decal
  • While语句数数字
  • 互信息:揭秘变量间的隐藏关联
  • 5.13本日总结
  • windows 强行终止进程,根据端口号
  • 【Linux 系统调试】系统的动态跟踪工具--SystemTap
  • 风雨天涯梦——《袁保龄公牍》发微
  • 孙卫东会见巴基斯坦驻华大使:支持巴印两国实现全面持久停火
  • 山东鄄城发生一起交通事故,造成4人死亡、2人受伤
  • 江西省市场监管局原局长谢来发被双开:违规接受旅游活动安排
  • 巫蛊:文化的历史暗流
  • 中国科学院院士徐春明不再担任山东石油化工学院校长