最近在用公司的HC32L136芯片开发项目,在做中断功能的时候,死活实现不了,最终发现,中断函数名不能乱用,必须用驱动里配置好的,如果要自定义中断名,需要配置很多东西,这个东西做了一天没做出来,今天用驱动里的函数实现了,故拿出来和大家分享经验,避免踩雷。

1.我做的是KEY按键中断功能,采用GPIO读取下降沿中断。

首先需要对KEY初始化

void Key_Init(void)
{
    stc_gpio_cfg_t stcGpioCfg;
    
    /* 使能GPIO时钟 */
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
    
    /* 输入模式配置 */
    stcGpioCfg.enDir = GpioDirIn;      // 输入模式
    stcGpioCfg.enPu = GpioPuEnable;    // 使能上拉(默认高电平)
    stcGpioCfg.enPd = GpioPdDisable;   // 禁用下拉
    stcGpioCfg.enOD = GpioOdDisable;   //开漏输出关闭

	  stcGpioCfg.enCtrlMode = GpioAHB;

    /* 初始化所有按键GPIO */
    Gpio_Init(KEY1_PORT, KEY1_PIN, &stcGpioCfg);

		/* 清除中断 */
		Gpio_ClearIrq(KEY1_PORT, KEY1_PIN);

		
		/* 配置为下降沿中断 */
		Gpio_EnableIrq(KEY1_PORT, KEY1_PIN, GpioIrqFalling);
	
		
		/* 使能系统中断 */
		EnableNvic(PORTB_IRQn, IrqLevel3, TRUE); 
		
    
}

这里需要注意换成自己的IO口,还有系统中断那里,换成自己的端口,比如你的是在PA端口,你实参需要改为:PORTA_IRQn

2.中断函数代码

void PortB_IRQHandler(void)
{
   
        if(TRUE == Gpio_GetIrqStatus(KEY1_PORT, KEY1_PIN))
        {
            Gpio_ClearIrq(KEY1_PORT, KEY1_PIN);
            
            Led_On(LED2_PORT, LED2_PIN);
            
            delay1ms(50);
            
            Led_Off(LED2_PORT, LED2_PIN);
        }

    
}    

按键按下,LED灯亮50ms。

重中之重:这里的函数名要用interrupts_hc32l13x.c里弱定义的函数名。

 

然后在 interrupts_hc32l13x.h文件里,把中断开启

 

大家在用华大HC32开发的时候请注意这些问题

 

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐