HC32F003C4PA GPIO Output

时间:2020-05-08 21:03:00 来源:互联网 作者: 神秘的大神 字体:

1、打开启动文件,找到并跳转至SystemInit函数

 

 1 void SystemInit(void)
 2 {
 3     stc_clk_systickcfg_t stcCfg;
 4 
 5     // TODO load trim from flash
 6     //hcr 4MHz manual trim.
 7     Clk_SetRCHFreq(ClkFreq4Mhz);//默认内部RCH  4M
 8     Clk_Enable(ClkRCH, TRUE);
 9                                 
10     SystemCoreClockUpdate();
11 
12     DDL_ZERO_STRUCT(stcCfg);
13     stcCfg.bNoRef = TRUE;
14     stcCfg.u32LoadVal = 0xFFFFFF;
15     Clk_SysTickConfig(&stcCfg);
16 }

系统默认使用内部RCH 4MHz时钟源,关于时钟部分介绍,请查阅《HC32F003系列_HC32F005系列用户手册》

2、接着我们进入main函数

int32_t main(void)
{
  
   
    //GPIO输出
    //初始化外部GPIO P03为输出、上拉、开漏,P03端口外接LED3
    Gpio_InitIOExt(3, 5, GpioDirOut, TRUE, FALSE, TRUE, FALSE);
        Gpio_InitIOExt(3, 6, GpioDirOut, TRUE, FALSE, TRUE, FALSE);

    while (1)
    {
        //输出高电平,LED3灭
        Gpio_SetIO(3, 5, TRUE);
        //delay1ms(1000);

        //输出低电平,LED3亮
        Gpio_SetIO(3, 6, FALSE);
        //delay1ms(1000);
    }
}

main函数中,GPIO外设的初始化函数Gpio_InitIOExt,关于参数配置请查看注释

/**
 *******************************************************************************
 ** \brief   GPIO 初始化2 
 ** 
 ** \param   [in]  u8Port             IO Port口
 ** \param   [in]  u8Pin              IO Pin脚
 ** \param   [in]  enDir              IO 方向(输入或输出)
 ** \param   [in]  bPullup            上拉开关
 ** \param   [in]  bPulldown          下拉开关
 ** \param   [in]  bOdr               开漏开关
 ** \param   [in]  bDrive             驱动能力 
 **                                   0 = 高
 **                                   1 = 低
 ** \retval     Ok         设置成功
 **             其他值     设置失败
 ******************************************************************************/
en_result_t Gpio_InitIOExt(uint8_t u8Port, uint8_t u8Pin,
                           en_gpio_dir_t enDir,
                           boolean_t bPullup,
                           boolean_t bPulldown,
                           boolean_t bOdr,
                           boolean_t bDrive)
{
    //force open clock
    M0P_CLOCK->PERI_CLKEN_f.GPIO = 1;
    //force set mode, ignore result.
    Gpio_SetAnalog(u8Port, u8Pin, FALSE);

    //fn
    *((volatile uint32_t *)((uint32_t)&M0P_GPIO->P01_SEL + u8Port * GPIO_GPSZ - 4 + u8Pin * 4)) = 0;
    //ADS
    //setBit((uint32_t)&M0P_GPIO->ADS0 + u8Port * GPIO_GPSZ, u8Pin, 0);
    //dir
    setBit((uint32_t)&M0P_GPIO->P0DIR + u8Port * GPIO_GPSZ, u8Pin, enDir);
    //dr
    setBit((uint32_t)&M0P_GPIO->P0DR + u8Port * GPIO_GPSZ, u8Pin, bDrive);

    setBit((uint32_t)&M0P_GPIO->P0PU + u8Port * GPIO_GPSZ, u8Pin, bPullup);
    setBit((uint32_t)&M0P_GPIO->P0PD + u8Port * GPIO_GPSZ, u8Pin, bPulldown);
    setBit((uint32_t)&M0P_GPIO->P0OD + u8Port * GPIO_GPSZ, u8Pin, bOdr);

    return Ok;
}

 

最后是GPIO输出高低电平,通过Gpio_SetIO实现

/**
 *******************************************************************************
 ** \brief GPIO IO输出值设定
 **
 ** \param [in]  u8Port          IO Port口
 ** \param [in]  u8Pin           IO Pin脚
 ** \param [in]  bVal            输出电平高低
 **
 ** \retval Ok         设置成功
 **         其他值     设置失败
 ******************************************************************************/
void Gpio_SetIO(uint8_t u8Port, uint8_t u8Pin, boolean_t bVal)
{
    bVal = !!bVal;
    setBit((uint32_t)&M0P_GPIO->P0OUT + u8Port * GPIO_GPSZ, u8Pin, bVal);
}

 

 

2020-05-08

 

注意:华大MCU资料下载链接   ftp://HdscCustomer:HdscGuest2019!@ftp.hdsc.com.cn/