华大HC32F460 GPIO口代码解读

一、GPIO口基础知识

HC32F460系列提供了PAy-PHy,y=0-16的IO口。主要是特性:

  1. 每组Port配有16个I/O Pin,根据实际配置可能不足16个

  1. 支持上拉、推挽,开漏输出模式

  1. 支持外部中断的输入

  1. 支持I/O Pin周边功能服用,一个I/O Pin最多可具有64个可选择的复用功能。

  1. 各个I/O Pin可独立编程

  1. 各个I/O Pin可以选择2个功能同时有效(不支持2个输出功能同时有效)

二、代码实现

首先 先看GPIO初始化的结构体

typedef struct {
    uint16_t u16PinState;       /*!< 设置使能引脚 >  */
    uint16_t u16PinDir;         /*!< 设置引脚模式  */
    uint16_t u16PinOutputType;  /*!< 设置输出类型:推挽、开漏   */
    uint16_t u16PinDrv;         /*!< 设置引脚驱动能力:高、中、低型驱动模式  */
    uint16_t u16Latch;          /*!< 设置引脚锁存   */
    uint16_t u16PullUp;         /*!< 设置上拉电阻是否使能     */
    uint16_t u16Invert;         /*!< 设置输入/输出翻转模式       */
    uint16_t u16ExtInt;         /*!< 设置外部中断引脚  */
    uint16_t u16PinAttr;        /*!< 设置引脚口是 数字 还是 模拟。 */
} stc_gpio_init_t;

在文件hc32f4xx_conf.h中开启宏

#define LL_GPIO_ENABLE                              (DDL_ON)

三、以点亮LED为例

定义LED相关IO口的宏

/* LED_R Port/Pin definition */
#define LED_R_PORT          (GPIO_PORT_D)
#define LED_R_PIN           (GPIO_PIN_03)
/* LED_G Port/Pin definition */
#define LED_G_PORT          (GPIO_PORT_D)
#define LED_G_PIN           (GPIO_PIN_04)
/* LED_Y Port/Pin definition */
#define LED_Y_PORT          (GPIO_PORT_D)
#define LED_Y_PIN           (GPIO_PIN_05)
/* LED_B Port/Pin definition */
#define LED_B_PORT          (GPIO_PORT_D)
#define LED_B_PIN           (GPIO_PIN_06)

使用华大官方提供的输入输出翻转功能

#define LED_R_TOGGLE()      (GPIO_TogglePins(LED_R_PORT, LED_R_PIN))
#define LED_G_TOGGLE()      (GPIO_TogglePins(LED_G_PORT, LED_G_PIN))
#define LED_Y_TOGGLE()      (GPIO_TogglePins(LED_Y_PORT, LED_Y_PIN))
#define LED_B_TOGGLE()      (GPIO_TogglePins(LED_B_PORT, LED_B_PIN))

详细看看GPIO_TogglePins()函数。

void GPIO_TogglePins(uint8_t u8Port, uint16_t u16Pin)
{
    __IO GPIO_REG_TYPE *POTRx;

    /* Parameter validity checking */
    DDL_ASSERT(IS_GPIO_PORT(u8Port));
    DDL_ASSERT(IS_GPIO_PIN(u16Pin));

    POTRx = &POTR_REG(u8Port); //PORT_REG对应是通用输出翻转寄存器(POTRx),具体看用户手册。
    SET_REG_BIT(*POTRx, (GPIO_REG_TYPE)u16Pin);//置1 对应引脚翻转,置0 无变化
}

实现延时

void DDL_DelayMS(uint32_t u32Count)
{
    __IO uint32_t i;
    const uint32_t u32Cyc = (HCLK_VALUE + 10000UL - 1UL) / 10000UL;

    while (u32Count-- > 0UL) {
        i = u32Cyc;
        while (i-- > 0UL) {
        }
    }
}

主函数:

#define DLY_MS              (100UL)
int32_t main(void)
{
    /* Register write enable for some required peripherals. */
    LL_PERIPH_WE(LL_PERIPH_GPIO);//使用寄存器前需要将相关的寄存器写保护关闭
    /* LED initialize */
    LED_Init();
    /* Register write protected for some required peripherals. */
    LL_PERIPH_WP(LL_PERIPH_GPIO);//使用完寄存器后 需要将相关的寄存器 写保护重新开启。
    for (;;) {
        LED_R_TOGGLE();
        DDL_DelayMS(DLY_MS);
        LED_G_TOGGLE();
        DDL_DelayMS(DLY_MS);
        LED_Y_TOGGLE();
        DDL_DelayMS(DLY_MS);
        LED_B_TOGGLE();
        DDL_DelayMS(DLY_MS);
        /* De-init port if necessary */
        // GPIO_DeInit();
    }
}

鉴于很多小白和我一样,不知道UL是什么,这里特别声明UL表示 unsigned long 类型。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于hc32f460GPIO的配置可以通过以下步骤进行: 1. 选择需要配置的GPIO,确定其对应的引脚号。 2. 打开GPIO模块时钟,使能GPIO模块。 3. 配置GPIO为输入或输出模式,设置输入或输出电平。 4. 配置GPIO的中断,使能GPIO中断。 下面是一个简单的示例代码: ```c #include "hc32f460_gpio.h" // 配置GPIO为输出模式,输出高电平 void gpio_config(void) { stc_gpio_config_t stcGpioCfg; // 打开GPIO模块时钟 CLK_FcgPeriphClockCmd(CLK_FCG_GPIO, Enable); // 配置GPIO为输出模式 stcGpioCfg.enDir = GpioDirOut; stcGpioCfg.enDrv = GpioDrvH; stcGpioCfg.enPuPd = GpioPu; stcGpioCfg.enOD = GpioOdDisable; stcGpioCfg.enCtrlMode = GpioAHB; // GPIO对应的引脚号为P10 Gpio_Init(GPIO1, GPIO_PIN_0, &stcGpioCfg); // 输出高电平 Gpio_SetIO(GPIO1, GPIO_PIN_0); } // 配置GPIO的中断 void gpio_interrupt_config(void) { stc_gpio_irq_t stcGpioIrq; // 配置GPIO的中断 stcGpioIrq.enIntMode = GpioIntRisingEdge; stcGpioIrq.pfnCallback = gpio_irq_handler; // GPIO对应的引脚号为P10 Gpio_EnableIrq(GPIO1, GPIO_PIN_0, &stcGpioIrq); } // GPIO中断回调函数 void gpio_irq_handler(void) { // 处理GPIO中断 } ``` 以上代码中,首先调用了`CLK_FcgPeriphClockCmd`函数打开GPIO模块时钟,然后调用`Gpio_Init`函数配置GPIO为输出模式,并输出高电平。接着调用`Gpio_EnableIrq`函数配置GPIO的中断,传入中断模式和中断回调函数。最后,在中断回调函数中处理GPIO中断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值