|
基于华大L170MCU的GPIO模块化程序编写,接口可兼容L130
以下是.h文件
#ifndef HAL_GPIO_H
#define HAL_GPIO_H
#include "hc32l17x.h"
/******************************************************************************
钢铁侠出品
qq:1036839164
抖音号:202937710
本程序只供学习使用,未经作者许可,不得用于其它任何用途
版本:V1.0
版权所有,盗版必究。
绍兴科立新电子科技有限公司
All rights reserved
********************************************************************************
*/
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
typedef enum
{
HAL_GPIO_RESET = 0U,
HAL_GPIO_SET
}eHalGpioPinState;
#define HAL_PORT_A ((uint32_t*)0x00000000u)
#define HAL_PORT_B ((uint32_t*)0x00000040u)
#define HAL_PORT_C ((uint32_t*)0x00000080u)
#define HAL_PORT_D ((uint32_t*)0x000000c0u)
#define HAL_PORT_E ((uint32_t*)0x00001000u)
#define HAL_PORT_F ((uint32_t*)0x00001040u)
#define HAL_GPIO_PIN_0 ((uint16_t)0) /* Pin 0 selected */
#define HAL_GPIO_PIN_1 ((uint16_t)1) /* Pin 1 selected */
#define HAL_GPIO_PIN_2 ((uint16_t)2) /* Pin 2 selected */
#define HAL_GPIO_PIN_3 ((uint16_t)3) /* Pin 3 selected */
#define HAL_GPIO_PIN_4 ((uint16_t)4) /* Pin 4 selected */
#define HAL_GPIO_PIN_5 ((uint16_t)5) /* Pin 5 selected */
#define HAL_GPIO_PIN_6 ((uint16_t)6) /* Pin 6 selected */
#define HAL_GPIO_PIN_7 ((uint16_t)7) /* Pin 7 selected */
#define HAL_GPIO_PIN_8 ((uint16_t)8) /* Pin 8 selected */
#define HAL_GPIO_PIN_9 ((uint16_t)9) /* Pin 9 selected */
#define HAL_GPIO_PIN_10 ((uint16_t)10) /* Pin 10 selected */
#define HAL_GPIO_PIN_11 ((uint16_t)11) /* Pin 11 selected */
#define HAL_GPIO_PIN_12 ((uint16_t)12) /* Pin 12 selected */
#define HAL_GPIO_PIN_13 ((uint16_t)13) /* Pin 13 selected */
#define HAL_GPIO_PIN_14 ((uint16_t)14) /* Pin 14 selected */
#define HAL_GPIO_PIN_15 ((uint16_t)15) /* Pin 15 selected */
/*#define HAL_GPIO_PIN_All ((uint16_t)) */ /* All pins selected */
/*#define HAL_GPIO_PIN_MASK (0x0000FFFFU)*/ /* PIN mask for assert test */
/****************************端口模式配置*********************************************/
/*输入和输出等模式选择*/
#define HAL_GPIO_MODE_OUTPUT (0x00000000U)
#define HAL_GPIO_MODE_INPUT (0x00000001U)
#define HAL_GPIO_MODE_ANALOG (0x00000002U)
/*外部中断触发类型,只开放上升沿和下降沿*/
#define HAL_GPIO_MODE_IN_IT_RISING (0x00000003U) /*上升沿中断*/
#define HAL_GPIO_MODE_IN_IT_FALLING (0x00000004U) /*下降沿中断 */
/*#define HAL_GPIO_MODE_IT_RISING_FALLING (0x00000005U) */ /*上升沿和下降沿都中断*/
/*#define HAL_GPIO_MODE_IT_HIGH_LEVEL (0x00000006U)*/ /*高电平中断*/
/*#define HAL_GPIO_MODE_IT_LOW_LEVEL (0x00000007U)*/ /*低电平中断*/
/*高、低驱动能力*/
#define HAL_GPIO_HIGH_DRV (0x00)
#define HAL_GPIO_LOW_DRV (0x01)
/*上拉使能禁能*/
#define HAL_GPIO_PULL_UP_DISABLE (0x00)
#define HAL_GPIO_PULL_UP_ENABLE (0x01)
/*下拉使能禁能*/
#define HAL_GPIO_PULL_DOWN_DISABLE (0x00)
#define HAL_GPIO_PULL_DOWN_ENABLE (0x01)
/*开漏使能禁能*/
#define HAL_GPIO_OD_DISABLE (0x00)
#define HAL_GPIO_OD_ENABLE (0x01)
/*复用功能配置,详见华大gpio.h各管脚复用功能分配表*/
#define HAL_GPIO_AF_DISABLE (0x00) /*不配置*/
#define HAL_GPIO_AF_1 (0x01) /*配置复用功能1*/
#define HAL_GPIO_AF_2 (0x02) /*配置复用功能2*/
#define HAL_GPIO_AF_3 (0x03) /*配置复用功能3*/
#define HAL_GPIO_AF_4 (0x04) /*配置复用功能4*/
#define HAL_GPIO_AF_5 (0x05) /*配置复用功能5*/
#define HAL_GPIO_AF_6 (0x06) /*配置复用功能6*/
#define HAL_GPIO_AF_7 (0x07) /*配置复用功能7*/
/*****************************************参数检查*********************************************************/
#define IS_HAL_GPIO_MODE(MODE) (((MODE) == HAL_GPIO_MODE_OUTPUT) ||\
((MODE) == HAL_GPIO_MODE_INPUT) ||\
((MODE) == HAL_GPIO_MODE_ANALOG) ||\
((MODE) == HAL_GPIO_MODE_IN_IT_RISING) ||\
((MODE) == HAL_GPIO_MODE_IN_IT_FALLING))
/************************************抽象数据结构****************************************************/
/*typedef enum
{
HAL_GPIO_IRQ_NONE,
HAL_GPIO_IRQ_RISING,
HAL_GPIO_IRQ_FALLING,
HAL_GPIO_IRQ_EDGE,
HAL_GPIO_IRQ_LOW,
HAL_GPIO_IRQ_HIGH,
} eHalGpioIrqDef;*/
/*定义中断配置相关*/
typedef struct
{
uint32_t pin; /*端口号*/
uint32_t mode; /*模式*/
uint32_t high_low_drv; /*高低驱动能力*/
uint32_t pull_up; /*上拉配置*/
uint32_t pull_down; /*下拉配置*/
uint32_t open_drain; /*开漏*/
/*uint32_t ctr_mode;*/ /*总线控制模式-华大-暂不使用*/
uint32_t alternate; /*第二功能*/
}sHalGpioInitTypeDef;/*对上配置接口*/
/*定义GPIO_TypeDef,根据官方库进行定义*/
//typedef struct
//{
// uint32_t port; /*端口号--针对华大*/
// /*
// __IO uint32_t *MODER;
// __IO uint32_t *OTYPER;
// __IO uint32_t *OSPEEDR;
// __IO uint32_t *PUPDR;
// __IO uint32_t *IDR;
// __IO uint32_t *ODR;
// __IO uint32_t *BSRR;
// __IO uint32_t *LCKR;
// __IO uint32_t *AFR[2];
// */
//} sHalGpioTypeDef;/*对下寄存器接口*/
#define sHalGpioTypeDef uint32_t/*与STM32库保持一致*/
/**********************************对外接口*********************************************************************/
/*初始化配置*/
extern uint8_t HalGpioInit(sHalGpioTypeDef *gpio_reg, sHalGpioInitTypeDef *gpio_cfg);
/*端口操作*/
extern uint8_t HalGpioPinWrite(sHalGpioTypeDef *gpio_reg, uint16_t pin_num, eHalGpioPinState pin_state); /*写操作*/
extern eHalGpioPinState HalGpioPinRead(sHalGpioTypeDef *gpio_reg, uint16_t pin_num); /*读操作*/
/*extern eHalGpioPinState HalGpioDirCfg(sHalGpioRegDef *gpio_reg, uint16_t pin_num);*/ /*方向配置*/
#endif
/******************************************************************************
钢铁侠出品
qq:1036839164
抖音号:202937710
本程序只供学习使用,未经作者许可,不得用于其它任何用途
版本:V1.0
版权所有,盗版必究。
绍兴科立新电子科技有限公司
All rights reserved
********************************************************************************
*/
以下是.c文件
#include "hal_gpio.h"
#include "gpio.h"/*华大库*/
/******************************************************************************
钢铁侠出品
qq:1036839164
抖音号:202937710
本程序只供学习使用,未经作者许可,不得用于其它任何用途
版本:V1.0
版权所有,盗版必究。
绍兴科立新电子科技有限公司
All rights reserved
********************************************************************************
*/
/*IO总线模式选择-华大MCU*/
#define HAL_GPIO_FAST_IO (0x00) /*FAST IO 总线控制模式*/
#define HAL_GPIO_AHB (0x01) /*AHB 总线控制模式*/
/*************************************************************第三种方式:直接调用官方库,接口做统一**********************************************************************/
/*
返回0:成功,1:失败
*/
uint8_t HalGpioInit(sHalGpioTypeDef *gpio_reg, sHalGpioInitTypeDef *gpio_cfg)
{
uint8_t ret=0u;
stc_gpio_cfg_t cfg={0,};/*华大模式*/
ret=(uint8_t)IS_HAL_GPIO_MODE(gpio_cfg->mode);
if(ret == 1u)
{
ret = 0u;/*数据校验正确*/
}
else
{
ret = 1u;
}
if(ret == 0u)
{
/*结构体数据清零,即默认状态*/
cfg.bOutputVal = 0x00;/*默认低*/
cfg.enCtrlMode = GpioFastIO;
cfg.enDir = GpioDirIn;/*默认输入*/
cfg.enDrv = GpioDrvH;/*高驱动能力默认*/
cfg.enOD = GpioOdDisable;
cfg.enPd = GpioPdDisable;
cfg.enPu = GpioPuDisable;
/*输出配置*/
if(gpio_cfg->mode == (uint32_t)HAL_GPIO_MODE_OUTPUT)
{
/*方向赋值*/
cfg.enDir = (en_gpio_dir_t)gpio_cfg->mode;
/*驱动能力配置*/
if((gpio_cfg->high_low_drv == (uint32_t)HAL_GPIO_HIGH_DRV) || (gpio_cfg->high_low_drv == (uint32_t)HAL_GPIO_LOW_DRV))
{
cfg.enDrv = (en_gpio_drv_t)gpio_cfg->high_low_drv;
}
else
{
ret = 1u;
}
/*开漏配置*/
if((gpio_cfg->open_drain == (uint32_t)HAL_GPIO_OD_DISABLE) || (gpio_cfg->open_drain == (uint32_t)HAL_GPIO_OD_ENABLE))
{
cfg.enOD = (en_gpio_od_t)gpio_cfg->open_drain;
}
else
{
ret = 1u;
}
}
/*输入配置*/
if(gpio_cfg->mode == (uint32_t)HAL_GPIO_MODE_INPUT)
{
/*方向赋值*/
cfg.enDir = (en_gpio_dir_t)gpio_cfg->mode;
}
/*上拉配置*/
if((gpio_cfg->pull_up == (uint32_t)HAL_GPIO_PULL_UP_DISABLE) || (gpio_cfg->pull_up == (uint32_t)HAL_GPIO_PULL_UP_ENABLE))
{
cfg.enPu = (en_gpio_pu_t)gpio_cfg->pull_up;
}
else
{
ret = 1u;
}
/*下拉配置*/
if((gpio_cfg->pull_down == (uint32_t)HAL_GPIO_PULL_DOWN_DISABLE) || (gpio_cfg->pull_down == (uint32_t)HAL_GPIO_PULL_DOWN_ENABLE))
{
cfg.enPd = (en_gpio_pd_t)gpio_cfg->pull_down;
}
else
{
ret = 1u;
}
/*控制模式6*/
cfg.enCtrlMode = GpioAHB;/*固定为AHB模式*/
/*输入输出调用接口进行初始化*/
if((gpio_cfg->mode == (uint32_t)HAL_GPIO_MODE_INPUT)||(gpio_cfg->mode == (uint32_t)HAL_GPIO_MODE_OUTPUT))
{
/*if((gpio_cfg->ctr_mode == (uint32_t)HAL_GPIO_FAST_IO) || (gpio_cfg->ctr_mode == (uint32_t)HAL_GPIO_AHB))
{
cfg.enCtrlMode = (en_gpio_ctrl_mode_t)gpio_cfg->ctr_mode;
}
else
{
ret = 1u;
}*/
Gpio_Init((uint32_t)gpio_reg, (en_gpio_pin_t)gpio_cfg->pin, (stc_gpio_cfg_t*)&cfg);
}
/*外部中断配置,默认为输入*/
if(gpio_cfg->mode == HAL_GPIO_MODE_IN_IT_RISING)/*上升沿中断配置*/
{
Gpio_Init((uint32_t)gpio_reg, (en_gpio_pin_t)gpio_cfg->pin, (stc_gpio_cfg_t*)&cfg);
Gpio_EnableIrq((uint32_t)gpio_reg, (en_gpio_pin_t)gpio_cfg->pin,GpioIrqRising);
}
if(gpio_cfg->mode == HAL_GPIO_MODE_IN_IT_FALLING)/*上升沿中断配置*/
{
Gpio_Init((uint32_t)gpio_reg, (en_gpio_pin_t)gpio_cfg->pin, (stc_gpio_cfg_t*)&cfg);
Gpio_EnableIrq((uint32_t)gpio_reg, (en_gpio_pin_t)gpio_cfg->pin,GpioIrqFalling);
}
/*模拟功能ad功能等*/
if(gpio_cfg->mode == (uint32_t)HAL_GPIO_MODE_ANALOG)
{
Gpio_SetAnalogMode((uint32_t)gpio_reg, (en_gpio_pin_t)gpio_cfg->pin);
}
/*复用功能串口等*/
if(gpio_cfg->alternate != 0)
{
Gpio_SetAfMode((uint32_t)gpio_reg, (en_gpio_pin_t)gpio_cfg->pin, (en_gpio_af_t)gpio_cfg->alternate);
}
}
return ret;
}
/*写特定端口*/
uint8_t HalGpioPinWrite(sHalGpioTypeDef *gpio_reg, uint16_t pin_num, eHalGpioPinState pin_state)
{
Gpio_WriteOutputIO((uint32_t)gpio_reg, (en_gpio_pin_t)pin_num, pin_state);
return 0;
}
/*读特定端口*/
eHalGpioPinState HalGpioPinRead(sHalGpioTypeDef *gpio_reg, uint16_t pin_num)
{
return (eHalGpioPinState)(Gpio_ReadOutputIO((uint32_t)gpio_reg, (en_gpio_pin_t)pin_num));
}
/******************************************************************************
钢铁侠出品
qq:1036839164
抖音号:202937710
本程序只供学习使用,未经作者许可,不得用于其它任何用途
版本:V1.0
版权所有,盗版必究。
绍兴科立新电子科技有限公司
All rights reserved
********************************************************************************
*/
|
|