yinwuqing110 发表于 2020-7-20 00:55

【华大测评】华大HC32F460-EVB开发板篇一

本帖最后由 yinwuqing110 于 2020-7-20 00:58 编辑

   收到HC32F460-EVB开发板有半个月,前段时间由于外地出差,没有及时分享评测贴,实感抱歉,趁周末的时间,把玩了一下HC32F460-EVB开发板,该开发板采用HC32F460PETB作为主核心MCU。HC32F460系列是基于ARM Cortex-M4 32-bit RISC CPU,最高工作频率168MHz的高性能 MCU。Cortex-M4内核集成了浮点运算单元(FPU)和DSP,实现单精度浮点算术运算,支持所有ARM单精度数据处理指令和数据类型,支持完整DSP指令集。集成了MPU单元。HC32F460系列集成了高速片上存储器,包括最大512KB的Flash,最大192KB的 SRAM。集成了Flash访问加速单元,实现CPU在Flash上的单周期程序执行,集成了丰富的外设功能。关于HC32F460-EVB开发板的SDK包下载地址说明如下:

   根据华大官方给出的命名规则,可知HC32F460PETB的性能是相当全面的
   
    收到板卡时,外形包装如下:

   拆开包装袋,看看主角的正视图

    然后将OLED模块,“黑匣子”拆下来

   看看板卡的背面,布线规范,四个脚用胶柱支撑固定,MCU旁边有明显PCB加线长的画板方法

    整个板子的功能框图如下

   引脚配置图如下

   模块的详细说明如下

   三个调试接口详情如下

       接着进入https://github.com/hdscmcu/hc32f460/archive/master.zip,下载好“hc32f460-master.zip”文件,解压后打开“hc32f460-master\hc32f460_sdk\驱动库及样例\hc32f46x_ddl\example\usart\uart_polling_rx_tx”工程,简单测试一下串口收发功能。开发板搭载串行通信接口模块(USART 4个单元,串行通信接口模块(USART)能够灵活地与外部设备进行全双工数据交换;本USART支持通用异步串行通信接口(UART),时钟同步通信接口,智能卡接口(ISO/IEC7816-3)。支持调制解调器操作(CTS/RTS操作),多处理器操作。实现UART的部分代码如下:
#include "hc32_ddl.h"

/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/* USART channel definition */
#define USART_CH                        (M4_USART3)

/* USART baudrate definition */
#define USART_BAUDRATE                  (115200ul)

/* USART RX Port/Pin definition */
#define USART_RX_PORT                   (PortE)
#define USART_RX_PIN                  (Pin04)
#define USART_RX_FUNC                   (Func_Usart3_Rx)

/* USART TX Port/Pin definition */
#define USART_TX_PORT                   (PortE)
#define USART_TX_PIN                  (Pin05)
#define USART_TX_FUNC                   (Func_Usart3_Tx)

/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
static void ClkInit(void);
static void UsartRxErrProcess(void);

/*******************************************************************************
** \brief Initialize Clock.
**
** \param None
**
** \retval None
**
******************************************************************************/
static void ClkInit(void)
{
    stc_clk_xtal_cfg_t   stcXtalCfg;
    stc_clk_mpll_cfg_t   stcMpllCfg;
    en_clk_sys_source_tenSysClkSrc;
    stc_clk_sysclk_cfg_t stcSysClkCfg;

    MEM_ZERO_STRUCT(enSysClkSrc);
    MEM_ZERO_STRUCT(stcSysClkCfg);
    MEM_ZERO_STRUCT(stcXtalCfg);
    MEM_ZERO_STRUCT(stcMpllCfg);

    /* Set bus clk div. */
    stcSysClkCfg.enHclkDiv= ClkSysclkDiv1;/* Max 168MHz */
    stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;/* Max 84MHz */
    stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;/* Max 168MHz */
    stcSysClkCfg.enPclk1Div = ClkSysclkDiv2;/* Max 84MHz */
    stcSysClkCfg.enPclk2Div = ClkSysclkDiv4;/* Max 60MHz */
    stcSysClkCfg.enPclk3Div = ClkSysclkDiv4;/* Max 42MHz */
    stcSysClkCfg.enPclk4Div = ClkSysclkDiv2;/* Max 84MHz */
    CLK_SysClkConfig(&stcSysClkCfg);

    /* Switch system clock source to MPLL. */
    /* Use Xtal as MPLL source. */
    stcXtalCfg.enMode = ClkXtalModeOsc;
    stcXtalCfg.enDrv = ClkXtalLowDrv;
    stcXtalCfg.enFastStartup = Enable;
    CLK_XtalConfig(&stcXtalCfg);
    CLK_XtalCmd(Enable);

    /* MPLL config. */
    stcMpllCfg.pllmDiv = 1ul;
    stcMpllCfg.plln = 50ul;
    stcMpllCfg.PllpDiv = 4ul;
    stcMpllCfg.PllqDiv = 4ul;
    stcMpllCfg.PllrDiv = 4ul;
    CLK_SetPllSource(ClkPllSrcXTAL);
    CLK_MpllConfig(&stcMpllCfg);

    /* flash read wait cycle setting */
    EFM_Unlock();
    EFM_SetLatency(EFM_LATENCY_5);
    EFM_Lock();

    /* Enable MPLL. */
    CLK_MpllCmd(Enable);

    /* Wait MPLL ready. */
    while (Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
    {
    }

    /* Switch system clock source to MPLL. */
    CLK_SetSysClkSource(CLKSysSrcMPLL);
}

/*******************************************************************************
** \brief USART RX error process function.
**
** \param None
**
** \retval None
**
******************************************************************************/
static void UsartRxErrProcess(void)
{
    if (Set == USART_GetStatus(USART_CH, UsartFrameErr))
    {
      USART_ClearStatus(USART_CH, UsartFrameErr);
    }

    if (Set == USART_GetStatus(USART_CH, UsartParityErr))
    {
      USART_ClearStatus(USART_CH, UsartParityErr);
    }

    if (Set == USART_GetStatus(USART_CH, UsartOverrunErr))
    {
      USART_ClearStatus(USART_CH, UsartOverrunErr);
    }
}

/*******************************************************************************
** \briefMain function of project
**
** \paramNone
**
** \retval int32_t return value, if needed
**
******************************************************************************/
int32_t main(void)
{
    uint16_t u16RxData;
    en_result_t enRet = Ok;
    uint32_t u32Fcg1Periph = PWC_FCG1_PERIPH_USART1 | PWC_FCG1_PERIPH_USART2 | \
                           PWC_FCG1_PERIPH_USART3 | PWC_FCG1_PERIPH_USART4;
    const stc_usart_uart_init_t stcInitCfg = {
      UsartIntClkCkNoOutput,
      UsartClkDiv_1,
      UsartDataBits8,
      UsartDataLsbFirst,
      UsartOneStopBit,
      UsartParityNone,
      UsartSamleBit8,
      UsartStartBitFallEdge,
      UsartRtsEnable,
    };

    /* Initialize Clock */
    ClkInit();

    /* Enable peripheral clock */
    PWC_Fcg1PeriphClockCmd(u32Fcg1Periph, Enable);

    /* Initialize USART IO */
    PORT_SetFunc(USART_RX_PORT, USART_RX_PIN, USART_RX_FUNC, Disable);
    PORT_SetFunc(USART_TX_PORT, USART_TX_PIN, USART_TX_FUNC, Disable);

    /* Initialize UART */
    enRet = USART_UART_Init(USART_CH, &stcInitCfg);
    if (enRet != Ok)
    {
      while (1)
      {
      }
    }

    /* Set baudrate */
    enRet = USART_SetBaudrate(USART_CH, USART_BAUDRATE);
    if (enRet != Ok)
    {
      while (1)
      {
      }
    }

    /*Enable RX && TX function*/
    USART_FuncCmd(USART_CH, UsartRx, Enable);
    USART_FuncCmd(USART_CH, UsartTx, Enable);

    while (1)
    {
      if (Set == USART_GetStatus(USART_CH, UsartRxNoEmpty))         /* Warit Rx data register no empty */
      {
            u16RxData = USART_RecData(USART_CH);

            while (Reset == USART_GetStatus(USART_CH, UsartTxEmpty))/* Warit Tx data register empty */
            {
            }

            USART_SendData(USART_CH, u16RxData);
      }

      UsartRxErrProcess();
    }
}
    串口打印的信息如下:


   实物连线图如下所示,此次就大略的分享到这里,后续再持续体验HC32F460-EVB开发板的高配置全功能性啦,感谢各位围观,欢迎吐槽,咱们后会有期。





LM莫 发表于 2020-7-31 08:30

核心板的外设资源很丰富呀,就是板子画的有点丑而已。

jimmhu 发表于 2020-8-3 17:02

HC32F460-EVB开发板给力呢。   

cemaj 发表于 2020-8-3 17:03

支持国产芯片。                     

youtome 发表于 2020-8-3 17:03

这个板子很棒。集成了丰富的外设功能

houjiakai 发表于 2020-8-3 17:03

HC32F460的频率多大呢?

lzbf 发表于 2020-8-3 17:03

期待楼主多分享HC32F460的资料。   

1988020566 发表于 2020-8-3 17:03

ARM Cortex-M4比DSP的速度快了。   

mmbs 发表于 2020-8-3 17:04

没有完整的工程文件吗   

pmp 发表于 2020-8-3 17:04

                     

i1mcu 发表于 2020-8-3 17:04

现在的单片机的功能太强大了。   

51xlf 发表于 2020-8-3 17:04

工作频率168MHz?低功耗吗?

hxf0756 发表于 2020-11-3 16:09

哪里能买到这款板子呢?

nongfuxu 发表于 2023-2-3 16:14

ftp://HdscCustomer:HdscGuest2019!@ftp.hdsc.com.cn/,用FTP软件链接不上,关闭了嘛?
页: [1]
查看完整版本: 【华大测评】华大HC32F460-EVB开发板篇一