华大HC32F005单片机开发

文章目录

      • 芯片简介
      • 开发环境
      • Cortex-M0+内核
      • 基本功能开发
        • gpio配置
        • 外部中断
        • 时钟配置
        • 基本定时器
        • 延时函数
      • 特殊管脚配置
      • 休眠模式
      • 看门狗

芯片简介

华大HC32F005单片机开发_第1张图片

开发环境

使用Keil作为开发IDE。
第一次使用需要安装HDSC的Device支持包。可以通过Pack Installer安装或从HDSC官网下载Device支持包,拷贝到keil源目录。
安装后,创建工程时,选择MCU型号一栏选择HDSC系列可见,表示可以安装环境正常。

Cortex-M0+内核

华大HC32F005系列单片机采用了Cortex-M0+的内核。
Cortex-M0+内核内置了嵌套向量中断控制器(NVIC),参考内核的头文件(安装路径下D:\Keil_v5\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\Include)

/** \brief  Enable External Interrupt */
void NVIC_EnableIRQ(IRQn_Type IRQn);

/** \brief  Disable External Interrupt */
void NVIC_DisableIRQ(IRQn_Type IRQn);

/** \brief  Get Pending Interrupt */
uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn);

/** \brief  Set Pending Interrupt */
void NVIC_SetPendingIRQ(IRQn_Type IRQn);

/** \brief  Clear Pending Interrupt */
void NVIC_ClearPendingIRQ(IRQn_Type IRQn);

/** \brief  Set Interrupt Priority */
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority);

/** \brief  Get Interrupt Priority */
uint32_t NVIC_GetPriority(IRQn_Type IRQn);

/** \brief  System Reset */
void NVIC_SystemReset(void);

/*@} end of CMSIS_Core_NVICFunctions */

通过以上Cortex-M0+提供的中断操作接口来配置系统中断。

基本功能开发

gpio配置

/**
 *******************************************************************************
 ** \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);

根据实际使用要求配置成上拉、下拉、开漏、驱动能力模式。
无特殊要求的gpio可以简化配置:

en_result_t Gpio_InitIO(uint8_t u8Port, uint8_t u8Pin, en_gpio_dir_t enDir);

外部中断

外部中断配置流程:

void Gpio_IRQHandler(uint8_t u8Param)
{
    if (Gpio_GetIrqStat(WL_WAKEUP_GPIO, WL_WAKEUP_GPIO_Pin) == 1) {
        Gpio_ClearIrq(WL_WAKEUP_GPIO, WL_WAKEUP_GPIO_Pin);
    }
}

void gpio_config(void)
{
	Gpio_Init(GPIO, GPIO_Pin, GpioDirIn);
	// clear irq flag
	Gpio_ClearIrq(GPIO, GPIO_Pin);
	// enable irq
	Gpio_EnableIrq(GPIO, GPIO_Pin, GpioIrqFalling);
	EnableNvic(PORT0_IRQn, DDL_IRQ_LEVEL_DEFAULT, TRUE);
}

void gpio_deinit(void)
{
	Gpio_DisableIrq(GPIO, GPIO_Pin, GpioIrqRising);
    Gpio_ClearIrq(GPIO, GPIO_Pin);
}

时钟配置

HC32F005芯片支持内部高速时钟(4M、8M、16M、24M)可配,低速时钟32.8K。
时钟初始化流程如下所示:

void clk_init(void)
{
    stc_clk_config_t stcCfg;

    /* set system freq */
    Clk_SetRCHFreq(ClkFreq16Mhz);

    /* CLK config */
    DDL_ZERO_STRUCT(stcCfg);
    stcCfg.enClkSrc = ClkRCH;   // RCH  = 16M
    stcCfg.enHClkDiv = ClkDiv1; // HCLK = 16M/1
    stcCfg.enPClkDiv = ClkDiv1; // PCLK = 16M/1/1

    Clk_Enable(ClkRCL, TRUE);
    Clk_Enable(ClkRCH, TRUE);
    Clk_Init(&stcCfg);

    /* open peripheral clk */
    Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE);
    Clk_SetPeripheralGate(ClkPeripheralBt, TRUE);
    Clk_SetPeripheralGate(ClkPeripheralWdt,TRUE);
}

基本定时器

Timer0/1/2可以作为三个16位自动重载或32位无重载定时器/计数器使用。
例如,需要配置100us间隔定时器,参考代码:

void timer_irq_handler(void)
{
    if (Bt_GetIntFlag(TIM0)) {
        Bt_ClearIntFlag(TIM0);
    }
}

void timer_init(void)
{
    stc_bt_config_t stcConfig;
    uint16_t u16ArrData = (0xffff - 0x190);
    uint16_t u16InitCntData = 0xC000;

    /* (0xffff - x) * y = 100us * 16M */
    stcConfig.enGateP = BtPositive;
    stcConfig.enGate = BtGateDisable;
    stcConfig.enPRS = BtPCLKDiv4;
    stcConfig.enTog = BtTogDisable;
    stcConfig.enCT = BtTimer;
    stcConfig.enMD = BtMode2;
    stcConfig.pfnTim0Cb = timer_irq_handler;
    Bt_Init(TIM0, &stcConfig);

    // TIM1 enable interrupt
    Bt_ClearIntFlag(TIM0);
    Bt_EnableIrq(TIM0);
    EnableNvic(TIM0_IRQn, 3, TRUE);

    // set load value and calc value
    Bt_ARRSet(TIM0, u16ArrData);
    Bt_Cnt16Set(TIM0, u16InitCntData);
    Bt_Run(TIM0);
}

延时函数

官方历程库ddl.c中提供了一组延时函数:

void delay1ms(uint32_t u32Cnt);
void delay100us(uint32_t u32Cnt);

这组函数使用轮询的方式来做延时,对于需要精确延时的场景不能满足要求。
可以采用通用的定时器方式来实现,参考如下:

static uint16_t timer_timeout = 0;

void timer_irq_handler(void)
{
    if (Bt_GetIntFlag(TIM0)) {
        Bt_ClearIntFlag(TIM0);

        /* 100us timer */
        if (timer_timeout != 0) {
            timer_timeout--;
        }
    }
}

void sleep_100us(unsigned short usec)
{
    timer_timeout = usec;
    while(timer_timeout != 0);
}

特殊管脚配置

  • RESET管脚复用
    RESET管脚默认作为复位输入端口,低有效;
    RESET管脚复用成普通IO口使用时,只支持输入模式;
    启动后需要配置管脚复用:Clk_SetFunc(ClkFuncRstPinIOEn, TRUE);
  • SWD管脚复用
    SWD管脚复用成普通IO口使用时,无法进入调试模式;
    启动后需要配置管脚复用:Clk_SetFunc(ClkFuncSwdPinIOEn, TRUE);
    如果需要通过SWD烧录程序,那么在设备上电后,最好延时2-3s,预留烧录初始化的时间再配置复用。否则设置了复用后会导致无法使用SWD功能。

休眠模式

进入休眠前可以配置休眠模式,可选:

  • 深度睡眠(5uA@3V)
  • 低速模式深度睡眠([email protected]
  • 浅度睡眠三种模式(30uA/MHz@3V)

进入休眠的代码:__WFI();
在休眠模式下,可以使用外部中断触发唤醒设备,需要在设备休眠前配置使能中断。

看门狗

该型号HC32F005系列的看门狗,支持设置看门狗超时重启和超时进中断两种模式;
缺陷:开门狗一旦开启,无法关闭或停止;
特殊使用场景下需要做特殊处理,例如:需要设备在运行和休眠模式切换时,进入休眠前无法关闭看门狗。此处处理方法为:

  1. 设置看门狗中断,不使能看门狗重启;
  2. 在看门狗中断中根据使用场景来选择重启设备。
    重启设备的代码:NVIC_SystemReset();

你可能感兴趣的:(项目开发)