HC32L196KCTA(GPIO输入&外部中断输入)

HC单片机的基本输入输出操作差不多,只需要更改个别参数即可

这边先介绍普通的GPIO输入

void GPIO_In_Init(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
	stc_gpio_cfg_t stcGpioCfg;
	
	///< 打开GPIO外设时钟门控
	Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); 
	
	 ///< 端口方向配置->输入
    stcGpioCfg.enDir = GpioDirIn;
	
    stcGpioCfg.enPu = GpioPuDisable;//关闭高电平触发
    stcGpioCfg.enPd = GpioPdEnable;//使能低电平触发
	
    stcGpioCfg.enOD = GpioOdDisable;//关闭开漏
	
    Gpio_Init(enPort, enPin, &stcGpioCfg);//初始化gpio
}

想要获取输入值,可以参考样例库中代码

引用gpio头文件后直接调用即可,总体没什么难度

/**
 *******************************************************************************
 ** \brief GPIO IO输入值获取
 **
 ** \param [in]  enPort          IO Port口
 ** \param [in]  enPin           IO Pin脚
 **
 ** \retval boolean_t            IO电平高低
 ******************************************************************************/
boolean_t Gpio_GetInputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
    return GetBit(((uint32_t)&M0P_GPIO->PAIN + enPort), enPin);
}

/**
 *******************************************************************************
 ** \brief GPIO IO Port输入数据获取
 **
 ** \param [in]  enPort          IO Port
 **
 ** \retval boolean_t            IO Port数据
 ******************************************************************************/
uint16_t    Gpio_GetInputData(en_gpio_port_t enPort)
{
    return (uint16_t)(*((uint32_t *)((uint32_t)&M0P_GPIO->PAIN + enPort)));
}

外部中断的输入同样只需要修改个别变量

void GPIO_EXIT_Init(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
	stc_gpio_cfg_t stcGpioCfg;
    
    ///< 打开GPIO外设时钟门控
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
    
    ///< 端口方向配置->输入
    stcGpioCfg.enDir = GpioDirIn;
    ///< 端口驱动能力配置->高驱动能力
    stcGpioCfg.enDrv = GpioDrvL;
    ///< 端口上下拉配置->无
    stcGpioCfg.enPu = GpioPuDisable;
    stcGpioCfg.enPd = GpioPdDisable;
    ///< 端口开漏输出配置->开漏输出关闭
    stcGpioCfg.enOD = GpioOdDisable;
    ///< 端口输入/输出值寄存器总线控制模式配置->AHB
    stcGpioCfg.enCtrlMode = GpioAHB;
    ///< GPIO IO USER KEY初始化
    Gpio_Init(enPort, enPin, &stcGpioCfg); 
	
//	  设置对应IO口的中断类型	
//	  Gpio_EnableIrq(STK_USER_PORT, STK_USER_PIN, GpioIrqFalling);

//    使能端口PORTA系统中断
//    EnableNvic(PORTD_F_IRQn, IrqLevel3, TRUE);
	
}

这边注释掉的两句话

第一句是中断类型是修改上升沿、下降沿、双边沿触发的

第二句是配置我们所需要开启外部中断的口是ABCDEF的哪一个,以及优先级的配置

需要根据情况灵活变通,下面是NVIC中断入口的映射,也就是第二句的第一个形参列表

typedef enum IRQn
{
    NMI_IRQn            = -14, /*  2 Non Maskable                            */
    HardFault_IRQn      = -13, /*  3 Hard Fault                              */
    SVC_IRQn            = -5,  /* 11 SV Call                                 */
    PendSV_IRQn         = -2,  /* 14 Pend SV                                 */
    SysTick_IRQn        = -1,  /* 15 System Tick                             */
    
    PORTA_IRQn          = 0 ,
    PORTB_IRQn          = 1 ,
    PORTC_E_IRQn        = 2 ,
    PORTD_F_IRQn        = 3 ,
    DMAC_IRQn           = 4 ,
    TIM3_IRQn           = 5 ,
    UART0_2_IRQn        = 6 ,
    UART1_3_IRQn        = 7 ,
    LPUART0_IRQn        = 8 ,
    LPUART1_IRQn        = 9 ,
    SPI0_IRQn           = 10,
    SPI1_IRQn           = 11,
    I2C0_IRQn           = 12,
    I2C1_IRQn           = 13,
    TIM0_IRQn           = 14,
    TIM1_IRQn           = 15,
    TIM2_IRQn           = 16,
    LPTIM_0_1_IRQn      = 17,
    ADTIM4_IRQn         = 18,
    ADTIM5_IRQn         = 19,
    ADTIM6_IRQn         = 20,
    PCA_IRQn            = 21,
    WDT_IRQn            = 22,
    RTC_IRQn            = 23,
    ADC_DAC_IRQn        = 24,
    PCNT_IRQn           = 25,
    VC0_IRQn            = 26,
    VC1_2_IRQn          = 27,
    LVD_IRQn            = 28,
    LCD_IRQn            = 29,
    FLASH_RAM_IRQn      = 30,
    CLKTRIM_IRQn        = 31,
    
    
} IRQn_Type;

下面是中断触发方式的形参列表(第一句话的第三个形参)

typedef enum en_gpio_irqtype
{
    GpioIrqHigh     = 0u,           ///< GPIO高电平触发
    GpioIrqLow      = 1u,           ///< GPIO低电平触发
    GpioIrqRising   = 2u,           ///< GPIO上升沿触发
    GpioIrqFalling  = 3u,           ///< GPIO下降沿触发
}en_gpio_irqtype_t;

 下面是中断优先级的形参(第二句话第二个形参)

typedef enum en_irq_level
{
    IrqLevel0  = 0u,               ///< 优先级0
    IrqLevel1  = 1u,               ///< 优先级1
    IrqLevel2  = 2u,               ///< 优先级2
    IrqLevel3  = 3u,               ///< 优先级3
} en_irq_level_t; 

 都配置完以后,就可以编写外部中断的中断服务函数了

//void PortF_IRQHandler(void)
//{
//	if(TRUE == Gpio_GetIrqStatus(STK_USER_PORT, STK_USER_PIN))
//	{
//		delay1ms(20);
//		if(Gpio_GetInputIO(STK_USER_PORT,STK_USER_PIN) == 0)
//			Gpio_WriteOutputIO(STK_LED_PORT, STK_LED_PIN,!Gpio_ReadOutputIO(STK_LED_PORT, STK_LED_PIN));
//	}

//		Gpio_ClearIrq(STK_USER_PORT, STK_USER_PIN);		
//	

//}

上面这段代码是基于我手上开发板的测试代码,不一定通用

在使用中主要还是 通过go to PortF_IRQHandler来看我们所需要用的中断服务函数叫什么

/*******************************************************************************
 *                       IRQ WEAK DEFINE
 ******************************************************************************/
__WEAK void SysTick_IRQHandler(void);


__WEAK void PortA_IRQHandler(void);
__WEAK void PortB_IRQHandler(void);
__WEAK void PortC_IRQHandler(void);
__WEAK void PortD_IRQHandler(void);
__WEAK void PortE_IRQHandler(void);
__WEAK void PortF_IRQHandler(void);
__WEAK void Dmac_IRQHandler(void);
__WEAK void Tim3_IRQHandler(void);
__WEAK void Uart0_IRQHandler(void);
__WEAK void Uart1_IRQHandler(void);
__WEAK void Uart2_IRQHandler(void);
__WEAK void Uart3_IRQHandler(void);
__WEAK void LpUart0_IRQHandler(void);
__WEAK void LpUart1_IRQHandler(void);
__WEAK void Spi0_IRQHandler(void);
__WEAK void Spi1_IRQHandler(void);
__WEAK void I2c0_IRQHandler(void);
__WEAK void I2c1_IRQHandler(void);
__WEAK void Tim0_IRQHandler(void);
__WEAK void Tim1_IRQHandler(void);
__WEAK void Tim2_IRQHandler(void);
__WEAK void LpTim0_IRQHandler(void);
__WEAK void LpTim1_IRQHandler(void);
__WEAK void Tim4_IRQHandler(void);
__WEAK void Tim5_IRQHandler(void);
__WEAK void Tim6_IRQHandler(void);
__WEAK void Pca_IRQHandler(void);
__WEAK void Wdt_IRQHandler(void);
__WEAK void Rtc_IRQHandler(void);
__WEAK void Adc_IRQHandler(void);
__WEAK void Dac_IRQHandler(void);
__WEAK void Pcnt_IRQHandler(void);
__WEAK void Vc0_IRQHandler(void);
__WEAK void Vc1_IRQHandler(void);
__WEAK void Vc2_IRQHandler(void);
__WEAK void Lvd_IRQHandler(void);
__WEAK void Lcd_IRQHandler(void);
__WEAK void Flash_IRQHandler(void);
__WEAK void Ram_IRQHandler(void);
__WEAK void ClkTrim_IRQHandler(void);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值