华大HC32F005单片机开发

    xiaoxiao2022-07-03  102

    文章目录

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

    芯片简介

    开发环境

    使用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)低速模式深度睡眠(10uA@32.768KHz)浅度睡眠三种模式(30uA/MHz@3V)

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

    看门狗

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

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