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);
7482

被折叠的 条评论
为什么被折叠?



