EXTI (2)

增强版实验简介

EXTI5和EXTI9共享一个中断源 下面的类似 EXTI0到4各自拥有一个中断源

改变引脚 PA0和PA1改变为PA5 和PA6

EXTI的重映射

之前是把PA0映射到EXTI0 PA1映射到EXTI1上 现在是要把PA5和PA6分别映射到EXTI5和6上

EXTI进行初始化

NVIC初始化

编写中断函数

因为EXTI5和6都可以触发同一个中断源 所以要判断到底是哪一个触发的 就要去查中断挂起寄存器的值 如果是第一个为1就是EXTI5触发的 如果是第二个为1那就是EXTI6触发的

c 复制代码
#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	PAL_Init();
	
	// 1. 初始化IO引脚
	// 将PA0和PA1分别设置为输入上拉模式
	// 开启GPIOA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	// PA0, PA1
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin  = GPIO_Pin_5 | GPIO_Pin_6;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIOInitStruct);
	
	// 2. 配置EXTI的引脚映射
	// 开启AFIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	// PA0 -> EXTI0
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
	// PA1 -> EXTI1
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
	
	// 3. 初始化EXTI
	// 3.1. 初始化EXTI5
	EXTI_InitTypeDef EXTIInitStruct;
	EXTIInitStruct.EXTI_Line = EXTI_Line5;
	EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTIInitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTIInitStruct);
	// 3.2. 初始化EXTI6
	EXTIInitStruct.EXTI_Line = EXTI_Line6;
	EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTIInitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTIInitStruct);
	
	// 4. 初始化NVIC
	NVIC_InitTypeDef NVICInitStruct;
	// 4.1. EXTI0 EXTI5,EXTI6共用一个中断源 写一个就可以了
	NVICInitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
	NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVICInitStruct.NVIC_IRQChannelSubPriority = 0;
	NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInitStruct);
	// 5. 初始化PC13
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD; // Open-drain
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC, &GPIOInitStruct);
	
	while(1)
	{
	}
}

void EXTI9_5_IRQHandler(void)
{
		if(EXTI_GetITStatus(EXTI_Line5)==SET) // EXTI5触发的中断
		{
				//清除中断源
				EXTI_ClearITPendingBit(EXTI_Line5);
			//点灯
				GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
		}
		if(EXTI_GetITStatus(EXTI_Line6)==SET)  //EXTI6触发的中断
		{
			//清除中断源
				EXTI_ClearITPendingBit(EXTI_Line6);
			//灭灯
				GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
		}	
}

EXTI的PAL库编程

标准库编程的不足

初始化IO引脚就要使能GPIOA和C的时钟调用GPIO_Init函数初始化GPIOA GPIOC的引脚 输入还是输出模式 输出的速度(输入就不用设置) 然后IO引脚的重映射 使能AFIO的时钟调用函数GPIO_EXTILineConfig把PA5和PA6分别映射到EXTI5 EXTI6上去 然后再初始化EXTI 调用EXTI INIT函数 EXTI的通道 EXTI的模式(事件还是中断模式)等等 然后还要初始化NVIC 还要查明中断来自于那个通道 (因为PA5和PA6是共用中断源 要是是PA1和PA0就各自用中断源 无需判断中断来自于那个通道)

PAL库编程接口简介

EXTI PAL库 编程分为三个部分

填写初始化参数初始化了一切就是没有关闭中断屏蔽

使能EXTI的通道就是闭合中断屏蔽

编写中断响应函数

在标准库中我们是使用弱方法 覆盖掉函数名 在中断函数中我们查询了中断挂起位的值(分辨到底是那个PA5还是PA6引起的触发中断)还清除了中断 在PAL库中只需要调用一个函数接口就可以完成这两件事

相关推荐
智者知已应修善业2 小时前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
智商偏低8 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen10 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森12 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白12 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D12 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术15 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt16 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘16 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang16 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c