硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1143|回复: 1
收起左侧

[客户分享] 基于华大L170MCU的GPIO模块化程序编写

[复制链接]

4

主题

3

回帖

15

积分

新手上路

积分
15
发表于 2021-11-2 16:28:23 | 显示全部楼层 |阅读模式
基于华大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
********************************************************************************
*/














回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2021-11-4 08:39:24 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-21 21:55 , Processed in 0.247168 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表