HC32F003C4PA GPIO Output

一、打開啓動文件,找到並跳轉至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系列用戶手冊》ui

二、接着咱們進入main函數spa

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,關於參數配置請查看註釋code

/**
 *******************************************************************************
 ** \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實現blog

/**
 *******************************************************************************
 ** \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-08flash

 

注意:華大MCU資料下載連接   ftp://HdscCustomer:HdscGuest2019!@ftp.hdsc.com.cn/it

相關文章
相關標籤/搜索