HC32F460如何配置GPIO中断

背景

很少demo或文章直接讲如何配置460的GPIO中断的,也许是太简单了,也许是应用场景比较少。这段时间正好要用到,简单写一下怎么配置。

使用场景

GPIO的中断配置主要是检测端口出现上升沿或下降沿后触发,可以用在按钮场景之类的地方。

初始化

直接上代码

c 复制代码
/* PULL_DOWN IN */
#define PULL_DOWN_PORT										(GPIO_PORT_B)
#define PULL_DOWN_PIN											(GPIO_PIN_07)
#define PULL_DOWN_INT_IRQN								(INT015_IRQn)
#define PULL_DOWN_INT_SRC_EIRQN						(INT_SRC_PORT_EIRQ7)//PB07固定对应EIRQ7

void InitKey(void)
{
	stc_extint_init_t stcExtIntInit;
	stc_irq_signin_config_t stcIrqSignConfig;
	stc_gpio_init_t stcGpioInit;

	/* GPIO config */
	(void)GPIO_StructInit(&stcGpioInit);
	//stcGpioInit.u16Latch = PIN_LATCH_ON;
	stcGpioInit.u16PinDir = PIN_DIR_IN;//输入模式
	stcGpioInit.u16ExtInt = PIN_EXTINT_ON;//启用外部中断
	stcGpioInit.u16PullUp = PIN_PU_OFF;//关闭内部上拉
	(void)GPIO_Init(PULL_DOWN_PORT, PULL_DOWN_PIN, &stcGpioInit);

	/* ExtInt config */
	(void)EXTINT_StructInit(&stcExtIntInit);
	stcExtIntInit.u32Filter      = EXTINT_FILTER_ON;
	stcExtIntInit.u32FilterClock = EXTINT_FCLK_DIV8;
	stcExtIntInit.u32Edge        = EXTINT_TRIG_FALLING;
	(void)EXTINT_Init(EXTINT_CH07, &stcExtIntInit);

	/* IRQ sign-in */
	stcIrqSignConfig.enIntSrc    = PULL_DOWN_INT_SRC_EIRQN;
	stcIrqSignConfig.enIRQn      = PULL_DOWN_INT_IRQN;
	stcIrqSignConfig.pfnCallback = &PULL_DOWN_IrqHandle;
	(void)INTC_IrqSignIn(&stcIrqSignConfig);

	
	/* NVIC config */
	NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);//清除指定中断的挂起状态
	NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);//设置中断优先级
	NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);//使能中断
	
}

中断函数

c 复制代码
uint8_t u8Count = 0U;
void PULL_DOWN_IrqHandle(void)
{
		SET_LED_RED();
		u8Count++;
//    if (SET == EXTINT_GetExtIntStatus(EXTINT_CH07)) {
//        u8Count++;
//    }
//		EXTINT_ClearExtIntStatus(EXTINT_CH07);
}

注意事项

1、代码中的INT_SRC_PORT_EIRQ7需要查询数据手册的引脚功能表来确认你的引脚对应的EIRQ编号,如下图我使用的PB07对应EIRQ7:

2、IRQ编号INT015_IRQn需要在规范范围内。查询参考手册的中断事件请求需要与选择表可知,IRQ0~31是所有中断通用的编号,32-127则需要根据表格中支持的范围来选择序号,最后的INT_VSSEL128-143则是向量共享中断选择寄存器。

INT_VSSEL需要做额外的配置,上述代码的写法对它是无效的,不过前32个编号基本是够用的。如果配置的编号不在规定内,会导致无法触发中断。

3、我的引脚外部电路做了上拉,所以关闭内部上拉检测下降沿即可检测按钮的按下。实际情况请根据你的电路和需求进行修改。

相关推荐
fie888921 小时前
基于51单片机的航模遥控器6通道接收机程序
单片机·嵌入式硬件·51单片机
bu_shuo21 小时前
嵌入式硬件工程师VS单板硬件工程师
嵌入式硬件·电子工程师·单板硬件
llilian_1621 小时前
选择北斗导航卫星信号模拟器注意事项总结 北斗导航卫星模拟器 北斗导航信号模拟器
功能测试·单片机·嵌入式硬件·测试工具·51单片机·硬件工程
Yyq130208696821 天前
MH2457,‌国产 32 位屏驱 MCU‌芯片,支持‌1080P 高清显示‌与‌以太网通信‌,广泛应用于两轮车仪表盘及工控屏等领域
单片机·嵌入式硬件
爱吃程序猿的喵1 天前
南邮计科电工电子实验B《RLC串联谐振电路》实验报告
单片机·嵌入式硬件
独小乐1 天前
009.中断实践之实现按键测试|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·arm
XINVRY-FPGA1 天前
XC7VX690T-2FFG1157I Xilinx AMD Virtex-7 FPGA
arm开发·人工智能·嵌入式硬件·深度学习·fpga开发·硬件工程·fpga
bubiyoushang8881 天前
利用STM32实现Modbus通信(RTU从机方案)
stm32·单片机·嵌入式硬件
cmpxr_1 天前
【单片机】常用设计模式
单片机·嵌入式硬件·设计模式
杰杰桀桀桀1 天前
4*4无时延矩阵键盘(非阻塞)--附代码链接
stm32·单片机·嵌入式硬件·矩阵·计算机外设·无时延矩阵键盘