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非常见波特率调试应用笔记的更多相关文章
- (笔记)linux增加非标波特率的方法
1.内核修改 涉及到的内核文件包括driver/char/tty_ioctl.c和arch/xx/include/asm/termbits.h 在linux内核中,struct ktermios结构的 ...
- Linux的串口非标准波特率设置更改
用的是全志的R528 SDK,Linux内核是5.4,新增加一个250000的非标准波特率 参考网络大神文档,实践并记录宝贵的经验. 方法: 1.修改内核的/include/uapi/asm-gene ...
- 【转】Linux C下非特定波特率的配置和使用
https://blog.csdn.net/jinhongdu/article/details/43413071 对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL, p)和i ...
- OD调试学习笔记7—去除未注册版软件的使用次数限制
OD调试学习笔记7—去除未注册版软件的使用次数限制 本节使用的软件链接 (想自己试验下的可以下载) 一:破解的思路 仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需 ...
- Udacity调试课笔记之断言异常
Udacity调试课笔记之断言异常 这一单元的内容不是很多,如Zeller教授所说,就是如何写.检查断言,并如何使用工具实现自动推导出断言的条件. 现在,多数的编程语言,尤其是高级编程语言都会有内置的 ...
- Extjs4常见的调试问题
Extjs4常见的调试问题: 1.fireFn.apply of undefined方法名称对不上 2.新增页面居左解决:页面的宽度和高度需要调整,内容items有问题:或者:layout : 'co ...
- 研究怎么运用xcode处理常见的调试问题
本文转载至 http://blog.csdn.net/zhuzhihai1988/article/details/7749022 所谓磨刀不误砍柴工,这里菜鸟我在研究怎么运用xcode处理常见的调试问 ...
- EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配
EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 问题原因: 两个表A\B之间存在外键关系,当插入表A的时候,A的外键B在B表中不存在可以引起这个问题: ...
- PX01关于手机屏SPI触摸调试学习笔记
上位机工具:http://www.xk-image.com/download/blog/0002_TP调试/LcdTools20210605.rar 调试案例:http://www.xk-image. ...
- PX01关于手机屏IIC触摸调试学习笔记
相关文件下载: 上位机工具:http://www.xk-image.com/download/blog/0002_TP调试/LcdTools20210605.rar 调试案例:http://www.x ...
随机推荐
- 程序员必须掌握的java进制转换(全网最详细讲解)
前言 在上一篇文章中,壹哥给大家讲了Java里的各种运算符.其中在讲解位运算符时,我给大家提到了计算机中进制的概念.但是现在很多小白同学,对进制的概念还不够了解,比如二进制.八进制.十六进制都是怎么回 ...
- Go 语言 new 和 make 关键字的区别
原文链接: Go 语言 new 和 make 关键字的区别 本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的.那就是 new 和 make 这两个内置函数的区别. ...
- MySQL相关知识点思维导图整理
MySQL相关知识点思维导图整理 Xmind思维导图下载地址: 蓝奏云:https://shuihan.lanzoui.com/iXZw7frkn5a
- selenuim文件的下载
文件下载:谷歌浏览器则会自动实现下载,不会弹出框提示,会直接下载谷歌的默认路径:火狐浏览器下载会弹出提示框,此时火狐需要添加浏览器的配置参数信息: 火狐的相关浏览器配置参数可以通过about:conf ...
- 使用Kali复现永恒之蓝
使用Kali复现永恒之蓝 本次实验为离线靶机测试 实验步骤 确认测试环境:在开始测试之前,需要确认测试环境是否符合要求.我使用的是一台运行Kali的测试机和一台运行Windows 7 64位的靶机.确 ...
- ServiceAccounts 及 Secrets 重大变化
关于 ServiceAccounts 及其 Secrets 的重大变化 kubernetes v1.24.0 更新之后进行创建 ServiceAccount 不会自动生成 Secret 需要对其手动创 ...
- [Java/LeetCode]算法练习:转变日期格式(1507/simple)
1 题目描述 题目来源: https://leetcode-cn.com/problems/reformat-date 给你一个字符串 date ,它的格式为 Day Month Year ,其中: ...
- mac上传文件到obs需要配置的环境
本篇主要是使用mac对华为云 对象存储服务OBS 上传的一些说明. 配置环境 华为云obsutil下载地址 下载后得到.tar.gz格式的文件 解压 tar -xzvf xx.tar.gz 进入obs ...
- [数据分析与可视化] Python绘制数据地图2-GeoPandas地图可视化
本文主要介绍GeoPandas结合matplotlib实现地图的基础可视化.GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口.GeoPandas扩展了Pandas ...
- ros-python学习样例笔记
1.通信基本原理介绍 待写 2.三种通信方式的程序样例(python版) 2.1 topic 通信方式(非自定义和自定义) 2.1.1 创建工作空间和topic功能包 在ubuntu中打开命令行,输入 ...