打印
[开发工具]

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

[复制链接]
3223|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
慢醇|  楼主 | 2021-10-25 22:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、开发环境及工具
  • 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用于产生波特率

使用特权

评论回复
5
慢醇|  楼主 | 2021-10-25 23:34 | 只看该作者
为减少数据通讯出错概率,还需要提高系统时钟到24MHz(有时需要支持115200波特率)

使用特权

评论回复
6
慢醇|  楼主 | 2021-10-25 23:35 | 只看该作者

使用特权

评论回复
7
慢醇|  楼主 | 2021-10-25 23:37 | 只看该作者

使用特权

评论回复
8
慢醇|  楼主 | 2021-10-25 23:38 | 只看该作者

使用特权

评论回复
9
慢醇|  楼主 | 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
}

使用特权

评论回复
10
慢醇|  楼主 | 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_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);
}

使用特权

评论回复
11
慢醇|  楼主 | 2021-10-25 23:43 | 只看该作者
四、添加Amxlink协议及测试
有关于Amxlink协议请查看**《Amxlink通信协议-简介》

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

使用特权

评论回复
12
慢醇|  楼主 | 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协议解析
        }
}

使用特权

评论回复
13
慢醇|  楼主 | 2021-10-25 23:45 | 只看该作者
通过串口工具发送数据到MCU,MCU返回接收到的数据

使用特权

评论回复
14
慢醇|  楼主 | 2021-10-25 23:46 | 只看该作者
IAR仿真截图

使用特权

评论回复
15
MAA256| | 2021-10-26 08:14 | 只看该作者
楼主少了个02啊,写的很好,我会持续追更的

使用特权

评论回复
16
skyred| | 2021-11-9 15:33 | 只看该作者
好详细啊,就是一楼一楼的有点多

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

125

主题

1241

帖子

5

粉丝