首页 > 其他分享 >UART-UART非常见波特率调试应用笔记

UART-UART非常见波特率调试应用笔记

时间:2023-05-31 18:11:47浏览次数:46  
标签:DMA USART UART 串口 InitStructure GPIO 波特率 调试

UART非常见波特率调试

应用笔记

串口通信中的波特率选择,对于确保可靠的数据传输至关重要。波特率是衡量单位时间内传输的比特数,常见的波特率包括300、1200、2400、9600、115200等。不同波特率适用于不同的应用场景和通信要求。较低的波特率适用于较长的通信距离或对传输速度要求不高的应用,较高的波特率适用于较短的通信距离或对实时性要求较高的应用。

在选择波特率时,需要考虑通信设备的支持能力、噪声干扰、传输距离和所需的传输速度等因素。同时,通信双方必须使用相同的波特率设置,以确保通信的正确进行。在项目的开发中,有时需要使用一些非常见波特率,比如使用20M晶振,获得准确的2.5M波特率。此时诸如 CH340、343 就无法在此类波特率下完成通信。

此时,我们可以选用 CH347 芯片,其最大支持9M波特率,支持非常见波特率配置,用于辅助调试 CH32V 系列非常见波特率串口通信功能。这里选用 CH32V203C8T6 芯片进行测试,外部8M晶振,系统时钟选择120MHz,APB1&2 总线1分频.

1. GPIO_InitTypeDef GPIO_InitStructure = {0};

2. USART_InitTypeDef USART_InitStructure = {0};

3.  

4. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

6.  

7. /* USART2 TX-->A.2 RX-->A.3 */

8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

11. GPIO_Init(GPIOA, &GPIO_InitStructure);

12. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

14. GPIO_Init(GPIOA, &GPIO_InitStructure);

15.  

16. USART_InitStructure.USART_BaudRate = 2500000;

17. USART_InitStructure.USART_WordLength = USART_WordLength_8b;

18. USART_InitStructure.USART_StopBits = USART_StopBits_1;

19. USART_InitStructure.USART_Parity = USART_Parity_No;

20. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

21. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

22.  

23. USART_Init(USART2, &USART_InitStructure);

24.  

25. DMA_Cmd(DMA1_Channel7, ENABLE); /* USART2 Tx */

26. DMA_Cmd(DMA1_Channel6, ENABLE); /* USART2 Rx */

27.  

28. USART_Cmd(USART2, ENABLE);

29.  

30. DMA_InitTypeDef DMA_InitStructure = {0};

31. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

32.  

33. DMA_DeInit(DMA1_Channel7);

34. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DATAR);

35. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RxBuffer1;

36. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

37. DMA_InitStructure.DMA_BufferSize = TxSize1;

38. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

39. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

40. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

41. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

42. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

43. DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

44. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

45. DMA_Init(DMA1_Channel7, &DMA_InitStructure);

46.  

47. DMA_DeInit(DMA1_Channel6);

48. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DATAR);

49. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RxBuffer1;

50. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

51. DMA_InitStructure.DMA_BufferSize = TxSize1;

52. DMA_Init(DMA1_Channel6, &DMA_InitStructure);

串口2使用非常见波特率2.5M、8位数据位、1位停止位、无校验位、无硬件流控,DMA 发送与接收使用相同数组,目的是将接收后数据再次发送出来,使用 DMA 可有效避免串口数据的丢失,在一定程度上也能够提高单片机的工作效率。

1. USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);

2. while(DMA_GetFlagStatus(DMA1_FLAG_TC6) == RESET);

3.  

4. USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);

5. while(DMA_GetFlagStatus(DMA1_FLAG_TC7) == RESET);

主函数中首先使能了 DMA 接收通道,等待接收完成后,再使能发送通道,将接收的数据再次发送出去。执行完成后,由于 DMA 计数未复位,如果再次向串口发送数据,单片机也不会将数据转发出来。

我们可以通过示波器的解码功能,观察串口转发后的数据是否与发送的数据一致,也可通过 CH347 评估板以及提供的上位机 Demo 接收串口转发数据。通过将 CH347 串口2收发引脚与 CH32V203C8T6 串口2收发引脚交叉连接,并在上位机中配置 2.5M 串口波特率后,即可接收到经由芯片转发后的串口数据。

标签:DMA,USART,UART,串口,InitStructure,GPIO,波特率,调试
From: https://www.cnblogs.com/wchmcu/p/17446961.html

相关文章

  • 关于第一次学习JavaScript程序调试心得
    源程序如上,源代码来源(刘永富博士-ExcelVBA编程开发下册)。运行之后,网页无反应,alert不弹窗。经查询https://www.runoob.com/jsref/event-body-onload.htmlhttps://blog.csdn.net/sinat_29398599/article/details/65450485需添加onload事件。Bodyonload事件,onload事件在页......
  • 小程序调试
    1.小程序测试原生模式网页模式混合模式2.微信小程序调试开关·如果是x5内核,请打开调试开关·在聊天窗口输入网址并打开即可:http://debugtbs.qq.com(安卓手机only)·如果是非x5内核,默认是开启的·x5内核切换开关:http://debugmm.qq.com/?forcex5=tr......
  • UE4字符串调试日志
    #在运行时打印输出信息原作者:Rama(opensnewwindow)此文为Logs,PrintingMessagesToYourselfDuringRuntime(opensnewwindow)的原创翻译,本文内容版权归原文所有,仅供学习,如需转载望注本文地址,翻译不易,谢谢理解。#概述Logs很重要,因为它通过给你反馈来让你知道:你的......
  • 不懂这10个命令,别说你会调试网络设备
    我的网工朋友大家好啊好久没跟你们聊思科设备了。虽然目前大方向上,企业用的设备越来越偏向国产化,学习华为、华三等厂商知识的人也越来越多。但不可否认的是,思科仍然是厂商老大哥。交换机、路由器这两块,思科占的全球市场份额还是大。目前一些外企或是大厂原厂,也还是有一些仅招思科方......
  • Linux内核调试方法
    内核配置选项中要使能CONFIG_MAGIC_SYSRQ选项,这样系统启动之后,会生成/proc/sysrq-trigger节点用于调试。其次,可以在/etc/sysctl.conf中设置kernel.sysrq=1默认使能sysq功能。也可以通过写/proc/sys/kernel/sysrq节点动态使能sysrq功能。写入不同的值使能不同的功能:0-disa......
  • go语言笔记——defer作用DB资源等free或实现调试
    defer和追踪关键字defer允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数(为什么要在返回之后才执行这些语句?因为 return 语句同样可以包含一些操作,而不是单纯地返回某个值)。关键字defer的用法类似于面向对象编程语言Java和C#的 fi......
  • Quartz使用实践
    Quartz是一个开源的作业调度框架,它允许开发人员根据特定的时间规则来执行任务。Quartz提供了灵活的配置选项和丰富的功能,可以用于定时执行任务、定期重复任务、分布式任务调度等。下面是Quartz的介绍以及使用Java代码实现的入门示例:Quartz的介绍:Quartz是一个功能强大的作业调度......
  • windows驱动开发之网络双机调试(三)
    一、配置目标计算机首先在被调试机上也安装上WDK环境,随后在WDK的安装目录下运行该工具 WDKTestTargetSetup,默认路径:C:\ProgramFiles(x86)\WindowsKits\10\Remote\x64\WDKTestTargetSetupx64-x64_en-us.msi;在之后调试机中的 VisualStudio 将连接被调试机的 WDK......
  • gdb调试c++多线程死锁问题初步
    https://blog.csdn.net/zsiming/article/details/126695393 总结:psaux|grepfilename //找出进程IDtop-HpPID //列出进程号为PID下的所有线程gdbatattchPID //用gdb调试正在运行的进程(进程号为PID)(需要sudo权限)threadapplyallbt //这里涉及2个命令:thr......
  • 测试环境,调试gnn服务
    #1.关闭tafnodeps-ef|greptafnode/usr/local/app/taf/tafnode/util/stop.sh#2.启动程序gdb/usr/local/app/taf/tafnode/data/HQExtend.StockPoolAlarmServer/bin/StockPoolAlarmServerbreakReminderMgr.cpp:782--config=/usr/local/app/taf/tafnode/data/HQExtend.S......