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非常见波特率调试应用笔记的更多相关文章

  1. (笔记)linux增加非标波特率的方法

    1.内核修改 涉及到的内核文件包括driver/char/tty_ioctl.c和arch/xx/include/asm/termbits.h 在linux内核中,struct ktermios结构的 ...

  2. Linux的串口非标准波特率设置更改

    用的是全志的R528 SDK,Linux内核是5.4,新增加一个250000的非标准波特率 参考网络大神文档,实践并记录宝贵的经验. 方法: 1.修改内核的/include/uapi/asm-gene ...

  3. 【转】Linux C下非特定波特率的配置和使用

    https://blog.csdn.net/jinhongdu/article/details/43413071  对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL,  p)和i ...

  4. OD调试学习笔记7—去除未注册版软件的使用次数限制

    OD调试学习笔记7—去除未注册版软件的使用次数限制 本节使用的软件链接 (想自己试验下的可以下载) 一:破解的思路 仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需 ...

  5. Udacity调试课笔记之断言异常

    Udacity调试课笔记之断言异常 这一单元的内容不是很多,如Zeller教授所说,就是如何写.检查断言,并如何使用工具实现自动推导出断言的条件. 现在,多数的编程语言,尤其是高级编程语言都会有内置的 ...

  6. Extjs4常见的调试问题

    Extjs4常见的调试问题: 1.fireFn.apply of undefined方法名称对不上 2.新增页面居左解决:页面的宽度和高度需要调整,内容items有问题:或者:layout : 'co ...

  7. 研究怎么运用xcode处理常见的调试问题

    本文转载至 http://blog.csdn.net/zhuzhihai1988/article/details/7749022 所谓磨刀不误砍柴工,这里菜鸟我在研究怎么运用xcode处理常见的调试问 ...

  8. EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配

    EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 问题原因: 两个表A\B之间存在外键关系,当插入表A的时候,A的外键B在B表中不存在可以引起这个问题: ...

  9. PX01关于手机屏SPI触摸调试学习笔记

    上位机工具:http://www.xk-image.com/download/blog/0002_TP调试/LcdTools20210605.rar 调试案例:http://www.xk-image. ...

  10. PX01关于手机屏IIC触摸调试学习笔记

    相关文件下载: 上位机工具:http://www.xk-image.com/download/blog/0002_TP调试/LcdTools20210605.rar 调试案例:http://www.x ...

随机推荐

  1. 基于深度学习的车型识别系统(Python+清新界面+数据集)

    摘要:基于深度学习的车型识别系统用于识别不同类型的车辆,应用YOLO V5算法根据不同尺寸大小区分和检测车辆,并统计各类型数量以辅助智能交通管理.本文详细介绍车型识别系统,在介绍算法原理的同时,给出P ...

  2. IDEA配置JDK版本的地方, 适用于Compilation failed: internal java compiler error

    错误原因: 1. 编译版本不匹配 2.当前项目jdk版本不支持 解决方法 查看项目的jdk 查看工程的jdk 查看java编译器版本 讲这些改成自己需要的版本, 一般就可以解决编译版本出现的错误

  3. AQS 锁核心类详解

    系统性学习,异步IT-BLOG AQS(AbstractQuenedSynchronizer 抽象队列同步器) 是一个用来构建锁和同步器的框架,使用 AQS能简单且高效地构造出应用广泛的大量的同步器, ...

  4. 涉及面试题:有几种方式可以实现存储功能,分别有什么优缺点?什么是 Service Worker ?

    cookie,localStorage,sessionStorage,indexDB 特性 cookie localStorage sessionStorage indexDB 数据生命周期 一般由服 ...

  5. 一次因生产事故与chatGpt的对话

    一次因生产事故与chatGpt的对话 前言:生产出现了一个内存溢出的事故,记录错误信息.错误日志如下 org.springframework.web.util.NestedServletExcepti ...

  6. 几个对js帮助挺多的大佬写的博客

    深入理解javascript原型和闭包(完结) JavaScript系列文章 同步异步回调DEMO知乎大佬的this与new解释 宏任务与微任务解析 js闭包 Vue项目中技巧ts学习 ES6基础入门 ...

  7. AcWing 1353. 滑雪场设计

    原题链接 思路 本题如果以贪心的思路来理解,则会遇到如果根据贪心算法变更后的最高峰和最低峰会发生改变,产生后效性,导致贪心算法无效,再考虑到本题目数据量不大,山峰数量在1k以内,山峰高度在100之内, ...

  8. TypeScript 学习笔记 — 基于对象操作的内置类型的使用(十二)

    目录 1.Partial 转化可选属性 (?) 2.Required 转化必填属性 (-?) 3.Readonly 转化仅读属性 (readonly) Mutate(非内置,与 Readonly 相对 ...

  9. Proxmox VE镜像分析与定制

    Proxmox VE(Proxmox Virtual Environment,简称PVE)是一个开源的服务器虚拟化环境Linux发行版,基于Debian,使用给予Ubuntu的定制内核.相比于其他虚拟 ...

  10. [Shell] Windows上支持Linux Shell的工具/方法

    0 概述 1 方式一 : Windows Terminal 局限性: 不支持 xargs等命令 支持sed,find等命令 安装方式 安装Windows Terminal的最简单方法是通过Micros ...