【记录帖】STM32学习 外部中断的使用

目标:学习外部中断的使用 熟悉需要用到的库函数
任务:通过两个按键产生外部中断 PA0和PA1接开关 控制LED灯PA7

关于STM32外部中断使用的一些步骤
1.初始化IO口 需要注意GPIO_Mode
2.配置AFIO引脚映射 注意:AFIO需要开启时钟GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
3.配置EXTI通道
4.配置NVIC嵌套向量控制器
 

编写中断响应函数需要注意,中断响应函数需要放在mian函数外面

发在博客,方便后续学习参考
 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"

//目标:学习外部中断的使用 熟悉需要用到的库函数
//任务:通过两个按键产生外部中断 PA0和PA1接开关 控制LED灯


int  main(void)
{
	OLED_Init();
	OLED_Clear();
	
	//1.需要用到中断 先完成中断分组函数配置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//抢占优先级2位 子优先级2位
	
	//2.初始化IO引脚 PA0和PA1 输入上拉模式 PA7为开漏输出模式
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStrcture;
	GPIO_InitStrcture.GPIO_Mode = GPIO_Mode_IPU;//输入上拉模式
	GPIO_InitStrcture.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
	GPIO_Init(GPIOA,&GPIO_InitStrcture);
	GPIO_InitStrcture.GPIO_Mode = GPIO_Mode_Out_PP;//开漏输出模式 输出需要设置速度
	GPIO_InitStrcture.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStrcture.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStrcture);
	
	//3.配置EXTI的引脚映射
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//PA0->EXTI0
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);//PA1->为EXTI1
	
	//4.EXTI通道配置
	//初始化EXTI0
	EXTI_InitTypeDef EXTI_InitStrcuture;
	EXTI_InitStrcuture.EXTI_Line = EXTI_Line0;                     //中断线
	EXTI_InitStrcuture.EXTI_LineCmd = ENABLE;                      //中断屏蔽开关
	EXTI_InitStrcuture.EXTI_Mode =EXTI_Mode_Interrupt ;            //中断模式
	EXTI_InitStrcuture.EXTI_Trigger = EXTI_Trigger_Rising;         //触发模式
	EXTI_Init(&EXTI_InitStrcuture);
	//初始化EXTI1
	EXTI_InitStrcuture.EXTI_Line = EXTI_Line2;                     //中断线
	EXTI_InitStrcuture.EXTI_LineCmd = ENABLE;                      //中断屏蔽开关
	EXTI_InitStrcuture.EXTI_Mode =EXTI_Mode_Interrupt ;            //中断模式
	EXTI_InitStrcuture.EXTI_Trigger = EXTI_Trigger_Rising;         //触发模式
	EXTI_Init(&EXTI_InitStrcuture);
	
	//5.NVIC 嵌套向量控制器
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //选择中断通道 因为接下来要配置它
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE ; //中断屏蔽开关
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //选择中断通道 因为接下来要配置它
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE ; //中断屏蔽开关
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	
	while(1)
	{
		
	}

	

}


//编写中断响应函数
void EXTI0_IRQHandler(void)
{
	//进入中断函数首先需要清除中断标志位
	EXTI_ClearFlag(EXTI_Line0);
	//点亮LED->PB0
	GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_RESET);
	
}
	
void EXTI2_IRQHandler(void)
{
	//进入中断函数首先需要清除中断标志位
	EXTI_ClearFlag(EXTI_Line2);
	//点亮LED->PB0
	GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_SET);	
}	


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值