提示:文章
文章目录
前言
前期疑问:
1、一开始没有搞明白到底是USART还是UART。
2、其中还涉及到一个同步的概念。同步就是是否有时钟线同步。USART是串口同步异步发送接收器。USART没有时钟线是怎么实现同步的。
3、是在中断中读数据和发数据吗,如果是的话是怎么开启中断的或者是怎么实现中断中发送接收的。
应该是有是USART_IRQn中断吧,利用USART_IRQn中断吗?
4、stm32f10x手册里面的有时钟线的图叫什么图的?
**本文目标:**实现USART通讯。实现protues仿真通讯数据显示。
疑问解答
1、是USART,USART是同步通讯。一般使用串口通讯的时候都是设置波特率的,设置波特率就是使用了时钟。有时钟就是同步通讯。虽然USART只有两根线,但是USART中接入了一根时钟线,给USART提供同步时钟。所以USRAT编程时其中一部分也是要开启时钟。
【此处应该有一张USART电路图。是叫电路图吗?】
2、USART没有时钟线是怎么实现同步的? 内部提供时钟。
3、发送不需要中断,虽然发送是有中断的。发送中断是能寄存器应该是TXIE。但是接收是一定在中断中接收的。为什么?因为如果不是在中断中接收,那USART就要不断轮询接收信号,占用CPU,所以要中断来接收数据。同理按键中断检测信号。
一、背景
最近
二、梳理串口流程
https://blog.csdn.net/qq_40791635/article/details/83038678
2.1 软件开发
2.2 protues仿真
protues仿真没有实现
2.3 keil软件仿真
keil仿真,选择UART#1实现数据打印

说明本身程序没有太大问题,那为什么没有在protues仿真成功呢,哔哩哔哩、百度查查看
2.4 protues实现串口打印
实现串口打印:
提交记录:
SHA-1: a6b5d909c5726dc3472f42aa1b5e2ccb95b60bdd
- protues串口可以正常打印,需要注释掉两个函数

参考这篇教程实现串口打印
https://blog.csdn.net/weixin_48220838/article/details/128975779
遗留问题:
①实现rx中断
②为什么添加两个函数就不能打印了
③如何配置外部晶振时钟正常打印
④rx接受实验
2.5 配置成HSI二分频配置PLLCK实现串口打印
代码:SHA-1: 64efa29730d9080fdb45a50a23e7eac242b6f274
实现串口打印和led_running闪烁。
方法:
int main(void)
{
//RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
/* LED 端口初始化 */
LED_GPIO_Config();
//按键初始化函数
gpio_init();
//EXTI按键初始化函数
bsp_exti_key_gpio_init();
bsp_exti_key_nvic_init();
bsp_exti_key_exti_init();
//RCC初始化
RCC_Init();
//USART初始化
InitGPIO();
InitUsart(); //包含了NVIC中断初始化
while (1)
{
//key_process();
rcc_led_loop();
printf("hello world\r\n");
}
}
删除RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);也是可以实现的。

在不使用外部晶振的仿真中,单片机设置成36M可以实现打印。在使用HSE外部晶振,画了外部晶振电路的时候,将晶振频率设置成8M是没有打印的,设置成36M是乱码,原因不明。查了不少资料,还是没找到原因。
2.6 protues外部晶振实现仿真
添加晶振
proteus添加晶振
在Proteus软件中添加晶振的步骤如下:1
打开Proteus软件。
在左侧组件栏中找到“P”字母开头的选项,这通常代表元件。
在“关键字”栏中输入“CRYSTAL”,这会列出所有晶振元件。
从列表中选择第一个晶振元件并点击“确定”。
此时鼠标指针会变成一个十字形,可以在图纸上拖动以放置晶振。
在合适的位置点击鼠标左键,晶振就会被添加到电路图中。
OSC32_IN、OSC32_OUT和OSCIN、OSCOUT区别:
https://blog.csdn.net/qq_52251819/article/details/134956228
注意:protues好像不能仿真晶振啊。。。。
三、
3.1
2025年6月3日13:44:51
关于两个图我还有疑问
| 1、 | ![]() |
这个图里,PA9的TX引脚接的是CH340的RX引脚,但是下面的图例,TXD接的是TXD |
| 2、 | ![]() |
这边是TXD接TXD |
![]() |
查看STM32F103ZET6的引脚图,PA9是TX,PA10是RX。实际上图2也没有问题,虽然是TXD接TXD,但是TXD网络标号接的是PA10,PA10是RX引脚。也就是说stm32引脚tx、rx接的是ch3340的rx和tx。 |
看了教程重新梳理一下USART的代码逻辑:
| 1、 | GPIO口时钟开启 | |
| 2、 | USART时钟开启 | |
| 3、 | GPIO口初始化 | |
| 4、 | USART初始化 | |
| 5、 | 中断初始化 | |
| 6、 | 开启接收中断 | |
| 7、 | 使能中断 |
关于fputc函数和fgetc函数,实现这两个函数并且在这两个函数中调用USART_SendData和USART_ReceiveData函数,可以读取和写入串口数据。实现了fputc函数和fgetc函数,在c代码中可以使用printf函数和scanf、getchar函数实现对串口数据的操作。
关于中断,PA9、PA10是USART1,所以中断向量为USART1_IRQHandler,中断函数也是这个。
3.2 野火开发板实现代码
在野火开发板实现代码。
梳理实现过程是,
1、开启GPIO时钟
2、对GPIO口初始化;TX设置成推挽输出,RX设置成浮空输入
3、开启UART时钟
4、对UART初始化;比特率、数据字长、奇偶校验、停止位
、硬件控制流、配置工作模式(收发一体)、UARTInit;
5、串口中断优先级配置
6、配置接收中断(确定中断向量);发送中断不配置,没必要将发送配置称中断;
7、使能中断
8、编写发送函数;轮询发送。调用USART_SendData函数发送,使用USART_FLAG_TC寄存器标志位判断是否发送成功,寄存器为空可以再次发送;
9、在stm32f10x_it.c文件中编写接收中断函数;接收中断中,将接收到的数据在通过USART_SendData发送出去。JD是将数据存在队列中,成功的话就处理;
实验现象

四、其他相关
2025年6月26日10:56:23
使用了232转485的工具,电脑接232串口线,232和485工具通过BD9针口连接,485接装置COM口,具体485上的T/R+和T/R-端口接COM口哪个口,得看说明书
| 1、 | ![]() |
232转485 |
| 2、 | ![]() |
接线方式 |
2025年7月2日17:10:42
今天看到烧写器上有RX/TX标志,应该是可以进行串口通讯。就在想这个烧写器里面是有ch340芯片吗,不然怎么可以进行串口通讯。
想到自己家里的串口工具,就是有个ch340芯片,是进行UART转USB的。那么有个问题,串口工具里面有stm32主控芯片吗?我的理解是有的。那么是怎么实现的呢?
电路板上的TTL信号,进入串口调试工具的USART1引脚,然后通过USART2传出,经过CH340的引脚,通过USB传出。实现TTL转USB。

查一下资料,验证一下自己的想法,查到了下面的这篇文章;USB转TTL/RS232工具硬件设计,应该就是我想要的效果。
看了文章,发现和自己预估的不一样。
看了jd电路图,ttl就是从单片机引脚直接引出的,所以串口工具需要用ch340ttl转usb。为什么要使用ch340转,因为是用usb插到电脑上。
又提出一个问题,就是为什么要使用ch340,如果直接连usb口的D+/D-引脚直接传给电脑不行吗?
问了copilot,不行。理由如下:电脑usb无法识别3.3v的ttl信号。电脑使用的是复杂的usb协议,需要一个ch340元件进行协议转换。







1767

被折叠的 条评论
为什么被折叠?



