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

本文介绍了基于HC32F003/HC32F005微控制器的UART串口配置,包括选择Mode1异步全双工模式,设置波特率为19200,数据位8,校验位None,停止位1,流控None,并使用TIMER1生成波特率。同时,展示了如何通过KeiluVision5或IARForARM进行开发,以及如何配置UART1的P35和P36引脚。此外,还提到了Amxlink通信协议的使用,并给出了主函数的实现,实现了数据接收与解析。最后,通过IAR仿真验证了串口通信的正确性。

一、开发环境及工具

  1. HC32F003 / HC32F005
  2. Keil uVision5 V5.33 / IAR For ARM 7.80.4 (J-Link)
  3. 此工程源码下载路径 : https://gitee.com/amx/hc32ddl-app

二、串口模式的选择

  1. 我们选择Mode1,异步全双工:波特率:19200, 数据位:8, 校验位:None, 停止位:1, 流控:None
    在这里插入图片描述

  2. 选择UART1作为通信口,同时需开启TIMER1用于产生波特率
    在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


三、代码实现

  1. 串口引脚配置,这里使用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
    }
    
  2. 串口初始化设置(波特率: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_t  stcCfg;
    
        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);
    }
    

四、添加Amxlink协议及测试

  1. 有关于Amxlink协议请查看文章《Amxlink通信协议-简介

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

    int32_t main(void)
    {
    	SystemInit();		// 系统时钟设置
    	App_BtTimerTest();	// 基本定时器0
    	Api_Init();		    // Amxlink串口数据缓存
    	hc_uart_init();		// UART1初始化
    	
      	while (1)
    	{
    		Api_Poll_Parse(); // Amxlink协议解析
    	}
    }
    
  3. 通过串口工具发送数据到MCU,MCU返回接收到的数据

在这里插入图片描述

  1. IAR仿真截图

在这里插入图片描述


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AizBot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值