慢醇 发表于 2021-10-25 22:14

华大HC32-(03)-串口UART通信

一、开发环境及工具
[*]HC32F003 / HC32F005
[*]Keil uVision5 V5.33 / IAR For ARM 7.80.4 (J-Link)
[*]此工程源码下载路径 : https://gitee.com/amx/hc32ddl-app

慢醇 发表于 2021-10-25 22:15

二、串口模式的选择
我们选择Mode1,异步全双工:波特率:19200, 数据位:8, 校验位:None, 停止位:1, 流控:None

慢醇 发表于 2021-10-25 23:32

慢醇 发表于 2021-10-25 23:33

选择UART1作为通信口,同时需开启TIMER1用于产生波特率

慢醇 发表于 2021-10-25 23:34

为减少数据通讯出错概率,还需要提高系统时钟到24MHz(有时需要支持115200波特率)

慢醇 发表于 2021-10-25 23:35

慢醇 发表于 2021-10-25 23:37

慢醇 发表于 2021-10-25 23:38

慢醇 发表于 2021-10-25 23:42

三、代码实现
串口引脚配置,这里使用UART1的P35和P36引脚
static void App_UartPortInit(void)
{
    stc_gpio_cfg_t stcGpioCfg;

    DDL_ZERO_STRUCT(stcGpioCfg);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟

    ///<TX
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(UART_TX_PORT, UART_TX_PIN, &stcGpioCfg);
    Gpio_SetAfMode(UART_TX_PORT, UART_TX_PIN, GpioAf1);          //配置P35 端口为URART1_TX

    ///<RX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(UART_RX_PORT, UART_RX_PIN, &stcGpioCfg);
    Gpio_SetAfMode(UART_RX_PORT, UART_RX_PIN, GpioAf1);          //配置P36 端口为URART1_RX
}

慢醇 发表于 2021-10-25 23:43

串口初始化设置(波特率:19200, 数据位:8, 校验位:None, 停止位:1, 流控:None)
static void App_UartInit(void)
{
    uint16_t timer=0;

    stc_uart_baud_cfg_t stcBaud;
    stc_bt_cfg_t stcBtCfg;
    stc_uart_cfg_tstcCfg;

    DDL_ZERO_STRUCT(stcBaud);
    DDL_ZERO_STRUCT(stcBtCfg);

    //外设时钟使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralBt,TRUE);//模式0/2可以不使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);

    stcBaud.bDbaud= 0u;//双倍波特率功能
    stcBaud.u32Baud = 19200u;//更新波特率位置
    stcBaud.enMode= UartMode1; //计算波特率需要模式参数
    stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); //获取PCLK
    timer = Uart_SetBaudRate(M0P_UART1, &stcBaud);

    stcBtCfg.enMD = BtMode2;
    stcBtCfg.enCT = BtTimer;
    Bt_Init(TIM1, &stcBtCfg);//调用basetimer1设置函数产生波特率
    Bt_ARRSet(TIM1,timer);
    Bt_Cnt16Set(TIM1,timer);
    Bt_Run(TIM1);

    stcCfg.enRunMode = UartMode1;//测试项,更改此处来转换4种模式测试
    Uart_Init(M0P_UART1, &stcCfg);

    ///< UART中断配置
    Uart_EnableIrq(M0P_UART1, UartRxIrq);
    Uart_ClrStatus(M0P_UART1, UartRC);
    EnableNvic(UART1_IRQn, IrqLevel2, TRUE);
}

慢醇 发表于 2021-10-25 23:43

四、添加Amxlink协议及测试
有关于Amxlink协议请查看**《Amxlink通信协议-简介》

主函数实现(源码链接: https://gitee.com/amx/hc32ddl-app)

慢醇 发表于 2021-10-25 23:44

int32_t main(void)
{
        SystemInit();                // 系统时钟设置
        App_BtTimerTest();        // 基本定时器0
        Api_Init();                  // Amxlink串口数据缓存
        hc_uart_init();                // UART1初始化
       
        while (1)
        {
                Api_Poll_Parse(); // Amxlink协议解析
        }
}

慢醇 发表于 2021-10-25 23:45

通过串口工具发送数据到MCU,MCU返回接收到的数据

慢醇 发表于 2021-10-25 23:46

IAR仿真截图

MAA256 发表于 2021-10-26 08:14

楼主少了个02啊,写的很好,我会持续追更的

skyred 发表于 2021-11-9 15:33

好详细啊,就是一楼一楼的有点多
页: [1]
查看完整版本: 华大HC32-(03)-串口UART通信