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

stm32第十一天外部中断按键控制灯

一:软件流程设计
•初始化系统
。 初始化GPIO、EXTI外设时钟
。 初始化按键和LED引脚
。 初始化EXTI外部中断条件
。 初始化NVIC嵌套中断控制器及分组
·编写外部中断函数
。 判断中断发生控制LED火
weak:弱定义;如果用户没有自己定义的中断函数,则系统默认执行系统自定义的中断函数,如果用户有定义中断函数则优先执行用户的中断函数。

1:exti_key.c工程

#include "stm32f10x.h"
#include "exti_key.h"


void Exti_key_Init(void)//外部中断按键的初始化函数
{
	
	//有4个步骤 初始化系统 1:初始化GPIO、EXTI外设时钟 2:初始化按键和LED引脚 
	// 3:初始化EXTI外部中断条件 4:初始化NVIC嵌套中断控制器及分组
	GPIO_InitTypeDef Exti_key_Initstruct;//初始化外部中断按键的GPIO的结构体
	EXTI_InitTypeDef EXTIInitstruct;//初始化EXTI外部中断的结构体
	NVIC_InitTypeDef NVICInitstruct;//初始化NVIC嵌套中断控制器的结构体
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//打开APB2总线下的GPIOA和EXTI外设的时钟
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组
	
	Exti_key_Initstruct.GPIO_Pin=GPIO_Pin_0  ;//配置A0引脚
	Exti_key_Initstruct.GPIO_Mode= GPIO_Mode_IPU;//配置引脚输入模式为上拉输入

	GPIO_Init(GPIOA, &Exti_key_Initstruct);//初始化GPIOA的结构体
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//IO口加上外部中断的功能
	
	EXTIInitstruct.EXTI_Line=EXTI_Line0 ;//选择外部中断线0
	EXTIInitstruct.EXTI_Mode=EXTI_Mode_Interrupt ;//配置触发方式为下降沿触发
	EXTIInitstruct.EXTI_Trigger= EXTI_Trigger_Falling ;//配置为中断模式
	EXTIInitstruct.EXTI_LineCmd=ENABLE;//使能外部中断线
	EXTI_Init(&EXTIInitstruct);//初始化EXTI外部中断的结构体
	
	NVICInitstruct.NVIC_IRQChannel=EXTI0_IRQn ;//使能外部中断0的中断通道
	NVICInitstruct.NVIC_IRQChannelPreemptionPriority=0;//设置主优先级
	NVICInitstruct.NVIC_IRQChannelSubPriority=0;//设置子优先级
	NVICInitstruct.NVIC_IRQChannelCmd=ENABLE;//使能中断通道
	NVIC_Init(& NVICInitstruct);//初始化NVIC嵌套中断控制器的结构体
	
	
}


 2:exti_key.h工程

#ifndef EXTI_KEY_H_
#define EXTI_KEY_H_

void Exti_key_Init(void);

#endif

3:main.c工程

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"

void delay(uint16_t time)//延时1ms  软件延时粗延时
{
	uint16_t i=0;
	while(time --)
	{
		i=12000;
		while(i --);
	}
	
}


int  main()
{
	Exti_key_Init();
	LED_Init();//初始化灯的时钟和引脚配置
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1);//初始化灯灭


   while(1)
	 {
		
		 
		
	 }
		 
   
} 


 void EXTI0_IRQHandler()//EXTI0线中断服务函数(PA0引脚触发)
 {
	if(EXTI_GetITStatus(EXTI_Line0) != RESET)//检查EXTI0线是否触发了中断
	{
		 GPIO_ResetBits(GPIOA, GPIO_Pin_1);
		 delay(1000);
		 GPIO_SetBits(GPIOA, GPIO_Pin_1);
		 delay(1000);
	}
	EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI0的中断标志位(必须操作)
	 
	 
 }	 

相关文章:

  • 自定义类型:结构体
  • 【Java】——数组深度解析(从内存原理到高效应用实践)
  • CentOS 7上手动强制升级docker-compose(不使用yum)
  • 苍穹外卖项目结构
  • Loadrunner报错Virtual User Generator 初始化用户生成器失败 初始化失败
  • AI产品的架构(分四层)
  • ArkUI —— 组件导航
  • zk基础—1.一致性原理和算法二
  • Android:Dialog的使用详解
  • K8S 存储:emptyDir、hostPath、local详解
  • 观察者模式在Java单体服务中的运用
  • 质检LIMS实验室系统在塑料制品的应用 LIMS系统重塑塑料制品质检
  • leetcode hot100 多维动态规划
  • hadoop集群的常用命令
  • 《Spring Boot全栈开发指南:从入门到生产实践》
  • JAVA反序列化深入学习(十一):Spring1
  • 【Pandas】pandas Series to_latex
  • 力扣hot100_贪心算法
  • 实现基于Vue的后台管理系统权限控制与动态路由
  • 【避坑指南】RAGFlow + Ollama + Deepseek 构建本地知识库
  • 怎么下载网站所有源码/百度广告点击软件
  • 贵阳网站设计报价/网站seo外包靠谱吗
  • 网战/广州seo搜索
  • 网站开发需求模板模板/深圳网
  • 如何打破违法网站/上海有哪些优化网站推广公司
  • 专门做石材地花设计的网站/网页搜索优化