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库中只需要调用一个函数接口就可以完成这两件事

相关推荐
飞凌嵌入式1 小时前
飞凌嵌入式旗下教育品牌ElfBoard与西安科技大学共建「科教融合基地」
嵌入式硬件·学习·嵌入式·飞凌嵌入式
weixin_452600692 小时前
【青牛科技】电流模式PWM控制器系列--D4870
科技·单片机·嵌入式硬件·音视频·智能电表·白色家电电源·机顶盒电源
嵌新程5 小时前
day06(单片机高级)PCB设计
单片机·嵌入式硬件·pcb
stm 学习ing6 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
wenchm9 小时前
细说STM32单片机DMA中断收发RTC实时时间并改善其鲁棒性的另一种方法
stm32·单片机·嵌入式硬件
编码追梦人11 小时前
如何实现单片机的安全启动和安全固件更新
单片机
电子工程师UP学堂11 小时前
电子应用设计方案-16:智能闹钟系统方案设计
单片机·嵌入式硬件
飞凌嵌入式11 小时前
飞凌嵌入式T113-i开发板RISC-V核的实时应用方案
人工智能·嵌入式硬件·嵌入式·risc-v·飞凌嵌入式
blessing。。12 小时前
I2C学习
linux·单片机·嵌入式硬件·嵌入式
嵌新程14 小时前
day03(单片机高级)RTOS
stm32·单片机·嵌入式硬件·freertos·rtos·u575