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

这篇具有很好参考价值的文章主要介绍了UART-UART非常见波特率调试应用笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 串口波特率后,即可接收到经由芯片转发后的串口数据。

UART-UART非常见波特率调试应用笔记文章来源地址https://www.toymoban.com/news/detail-465906.html

到了这里,关于UART-UART非常见波特率调试应用笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机CAN波特率及采样点设置

    预分频比位(BRP) 同步段 (Sync_Seg) 传播时间段 (Prop_Seg) 相位缓冲段 1 (Phase_Seg1) 相位缓冲段 2 (Phase_Seg2) 时间份额TQ(us) = (2*(BRP+1))/Fosc(MHz); 标称位时间 = TQ * (Sync_Seg + Prop_Seg  + Phase_Seg1 + Phase_Seg2); 采样点 = (1 + Prop_Seg  +Phase_Seg1 )/(1|+Prop_Seg  + Ph

    2024年04月26日
    浏览(37)
  • J-link虚拟串口波特率异常问题

    J-LINK V9以上自带了虚拟串口,使用非常方便。 但最近遇到问题,发现打开虚拟串口时电脑接收到的是乱码。到官网搜索了一下,发现最高波特率是115200,我使用的是256000,于是降低波特率。 官网说明:[已解决]J-Link VCOM 最特率。- J-Link/Flasher 相关 - SEGGER - 论坛 再测试,发现经

    2024年03月09日
    浏览(46)
  • STM32-串口通信波特率计算以及寄存器的配置详解

    处理器与外部设备通信的两种方式 并行通信 传输原理:数据各个位同时传输。 优点:速度快 缺点:占用引脚资源多 串行通信 传输原理:数据按位顺序传输 优点:占用引脚资源少 缺点:速度相对较慢 按照数据传送方向,分为: 单工 :数据传输只支持数据在一个方向上传输

    2024年02月05日
    浏览(99)
  • CAN总线(五)STM32的CAN波特率设置方法(完整版)

     ①HSI是高速内部时钟,RC振荡器,频率为8MHz。   ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤PLL为锁相环倍频输出,其时钟输入

    2024年02月07日
    浏览(30)
  • 一文搞清楚码元速率(波特率)和比特速率(比特率)的区别

    比特:记为bit,是最小的单位。取值为一位二进制数,0或1。 字节:记为Byte,简写B。1B=8bits 码元 在数字通信中常用时间间隔相同的符号来表示一个二进制数字,这样的时间间隔内的信号称为(二进制)码元。而这个间隔被称为码元长度。值得注意的是当码元的离散状态有大于

    2024年02月06日
    浏览(40)
  • PCIe转多串口CH382/CH384时钟和波特率、分频与倍频

    一、相互关系与计算 1.1 时钟、频率和波特率的关系  PCIE串口所支持的波特率与串口基准频率有关,需要根据实际使用的目标波特率调整串口基准频率。串口内部基准时钟来源包括: 外接晶体提供串口时钟:芯片内部具有频率振荡器,可通过外接晶体及电容产生串口所需时钟

    2024年02月14日
    浏览(35)
  • 【Linux】调试常见的应用程序奔溃“Segmentation fault (core dumped)”

    Linux程序开发者,日常遇到程序奔溃时,应该如何调试,如何寻找原因和解决呢?本文就介绍了遇到Segmentation fault (core dumped)问题时最常规的定位方法。 当你在命令行执行一个程序时,遇到Segmentation fault (core dumped)后,第一时间查看当前目录下是否产生了core-xxxxx文件。 如果没

    2024年02月10日
    浏览(48)
  • [从零开发JS应用] 如何在VScode中配置Javascript环境,常见的调试方法有哪些?

    记录环境配置:本文配置的环境主要针对单独JS文件的断点调试,主要是为了调试LeetCode里面的代码。 首先在官网下载对应的版本:https://nodejs.org/en/ 开始安装,可以自定义选择安装路径。 这里 选择Add Path ,系统变量会自动设置,但是用户变量并没有自动设置,需要的话可以

    2024年02月04日
    浏览(56)
  • DSP篇--C6678功能调试系列之TIMER、UART调试

    目录 1、TIMER计时器调试  2、UART串口调试 2.1 核传输 2.2 EDMA传输 The TMS320C6678 device has sixteen 64-bit timer

    2024年02月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包