[方案相关] 华大HC32F460USART收发实验

[复制链接]
8608|14
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:49 | 显示全部楼层 |阅读模式
1.实验目标
       本实验主要通过对USART的配置及编程,使用查询的方式实现USART串口接收数据,同时将接收到的数据发送到USART。

2. 实验准备
        硬件搭建:ZW-HC32F460-BZ标准版开发板1套

        软件搭建:MDK5.22

3.硬件原理
8573465828e51e00c9.png

       这里我们使用板载的USB转串口来实现功能。USB转串口对应MCU的USART1,引脚使用PA11(TX)、PA12(RX)。

       需要注意:原理图中PA11、PA12通过J31、J32进行跳线切换连接到UART或USB,这里我们跳到UART。

6664465828e5fe33ef.png


 楼主| 怎么总是重复啊 发表于 2023-12-20 14:49 | 显示全部楼层
4.驱动代码
        为了简化编程,让用户快速上手,我公司针对USART驱动文件进行了深度优化编写,提供开源的Usart.c和Usart.h以供用户使用,现将源文件关键定义及函数做说明。

【USART定义】

       为了使用方便,在Usart.h中对USART使用的外部引脚及波特率进行了定义,用户无需配置勾选对应引脚或参数即可完成USART的配置。
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:50 | 显示全部楼层
  以USART1为例,分别地定义了RX和TX的端口、引脚以及波特率。
6222065828eab9b9d8.png
   关于USART其他参数的定义,在初始化函数中进行常规设置。
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:50 | 显示全部楼层
【USART初始化】

        根据以上配置对USART进行初始化。

        函数原型:   void UsartInt( void )

        功能说明:   USART初始化

        输入参数:   无

        输出参数:   无

        特殊备注:   需配合Usart.h中的配置
  1. void UsartInt( void )

  2. {

  3.     uint32_t u32Fcg1Periph = PWC_FCG1_PERIPH_USART1 | PWC_FCG1_PERIPH_USART2 | \ PWC_FCG1_PERIPH_USART3 | PWC_FCG1_PERIPH_USART4;

  4.     const stc_usart_uart_init_t stcInitCfg = {

  5.         UsartIntClkCkNoOutput,

  6.         UsartClkDiv_1,

  7.         UsartDataBits8,

  8.         UsartDataLsbFirst,

  9.         UsartOneStopBit,

  10.         UsartParityNone,

  11.         UsartSampleBit8,

  12.         UsartStartBitFallEdge,

  13.         UsartRtsEnable,

  14.     };

  15.     /* Enable peripheral clock */

  16.     PWC_Fcg1PeriphClockCmd(u32Fcg1Periph, Enable);

  17. #if (USART1_EN == 1 )

  18.     /* Initialize USART IO */

  19.     PORT_SetFunc( ( en_port_t )USART1_PORT, ( en_pin_t )RX1_PIN, Func_Usart1_Rx, Disable);

  20.     PORT_SetFunc( ( en_port_t )USART1_PORT, ( en_pin_t )TX1_PIN, Func_Usart1_Tx, Disable);

  21.     /* Initialize UART */

  22.     USART_UART_Init(USART1, &stcInitCfg);

  23.     /* Set baudrate */

  24.     USART_SetBaudrate(USART1, USART1_BAUD);

  25.     /*Enable RX && TX function*/

  26.     USART_FuncCmd(USART1, UsartRx, Enable);

  27.     USART_FuncCmd(USART1, UsartTx, Enable);

  28. #endif

  29. #if (USART2_EN == 1 )

  30. ………………………………………

  31. #endif

  32. #if (USART3_EN == 1 )

  33. ………………………………………

  34. #endif

  35. #if (USART4_EN == 1 )

  36. ………………………………………

  37. #endif

  38. }
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:50 | 显示全部楼层
   这里四个USART串口通信的基本参数配置为一致,也是最常用的模式

     UsartIntClkCkNoOutput:时钟为内部时钟不输出

        UsartClkDiv_1:1分频

        UsartDataBits8:8位数据位

        UsartDataLsbFirst:低位在前

        UsartOneStopBit:1位停止位

        UsartParityNone:无奇偶校验

        UsartSampleBit8:8位采样

        UsartStartBitFallEdge:起始位检测下降沿

        UsartRtsEnable:RTS允许

     以上只USART1完整代码,其他三个串口类似。
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:51 | 显示全部楼层
5. 主流程图
4889365828ed86a469.png
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:51 | 显示全部楼层
6.实验过程
【第一步:新建/配置工程】

       参见2.2.3节,将工程模板复制到实验目录下,将工程名改为EXINT。

       勾选FWLibCfg.h配置中的CLK_EN、EFM_EN、GPIO_EN、PWC_EN、SRAM_EN、UTILITY_EN、USART_EN选项
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:51 | 显示全部楼层
【第二步:添加USART模块驱动】

       将Usart.c和Usart.h复制到\实验10USART收发实验\Hardware\OnBoard路径下,同时将Usart.c添加到工程中Hardware/OnBoard下
7418765828ef06d721.png
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:51 | 显示全部楼层
【第三步:初始化编程】

        1)添加Usart头文件

             在main.c和Usart.c文件中添加 Usart.h头文件。

#include "Usart.h"
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:51 | 显示全部楼层
  2)配置USART

        打开Usart.h(一般将h文件添加到c文件并编译,即可在c文件下方显示出该h文件)文件,在下方选择 “Configuration Wizard”标签,即可出现配置界面。将Usart进行如下配置(与原理图引脚对应)。
5870165828f07eeccf.png
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:52 | 显示全部楼层
备注:引脚定义与原理图一致;其他USART配置类似。

     3)USART初始化

       在主函数中调用USART初始化函数UsartInt()。

UsartInt();
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:52 | 显示全部楼层
【第四步:功能实现】

       按照主逻辑编写while(1)功能即可。

  1. while (1)

  2. {

  3.        if (Set == USART_GetStatus(USART1, UsartRxNoEmpty))      

  4.        {

  5.               u8RxData = USART_RecData(USART1);

  6.               while (Reset == USART_GetStatus(USART1, UsartTxEmpty))

  7.               {

  8.               }

  9.               USART_SendData(USART1, u8RxData);            

  10.        }

  11. }
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:52 | 显示全部楼层
需要注意,这里在发送数据之前对USART发送是否为空进行了判断,保证上一次数据发送完成再发送下一次数据。
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:52 | 显示全部楼层
【第五步:结果验证】

      编译代码并下载至开发板运行程序,打开串口助手进行数据发送,串口数据接收到同样的数据。
4500365828f38a9fa7.png
 楼主| 怎么总是重复啊 发表于 2023-12-20 14:52 | 显示全部楼层
7.实验扩展
       1)修改USART波特率为9600进行实验;

       2)使用开发板RS232公或RS232母进行实验。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

262

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部