目标:学习外部中断的使用 熟悉需要用到的库函数
任务:通过两个按键产生外部中断 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);
}