目录
三.、USART配置源码,只作打印调试用,不作接收,所以不用配置中断
一、通信基础概念
1. 单工:一根线,单方向通信,代码写完后就确定了是A传给B,还是B传给A;
2. 半双工:一根线,双向传输,但同一时刻要么A传B,要么B传A;
3. 全双工:两根线,双向传输,可同时发送接收,A传B的同时B也可以传A
4. 同步:带时钟线,双方按照约定好的时钟边沿进行数据的加载、移位、发送
5. 异步:不用时钟线进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,某些通讯中还 需要双方约定数据的传输速率(波特率) ,以便更好地同步。
6. 串行:同一时刻只能传输一个数据位的数据,比并行通信的传输距离远,抗干扰能力强
7. 并行:同一时刻可以传输多个数据位的数据
8. 串口、COM口、UART口一般指的是硬件接口,TTL、RS-232、RS-485则是逻辑电平0和1的不同表示标准。
9.奇校验:数据流+校验位的1的个数是奇数
10.偶校验:数据流+校验位的1的个数是偶数
二.、USART协议原理
1. 全双工,异步收发
2. 硬件连线(借图)
3. 通信协议:
(1)空闲信号:数据位为高
(2)起始位:数据位为低
(3)停止位:数据位为高
(4)数据位:8位或者9位
(5)校验位:1位,最高位
4. 关于波特率
波特率:bps,即 bit/second。发送和接收由一共用的波特率发生器驱动,当发送器和接收器的使能位分别置位时,分别为其产生时钟,不需要额外的时钟线。
5. 关于几个重要寄存器
(1)TEN:使能发送控制器。
(2)TBE寄存器:当TBE=0,说明数据寄存器有数据待发送,将在下一周期取出到发送引脚,取 出后TBE=1。当CPU又写入新的数据,则TBE=0,如此循环。
(3)当TBE持续为1时,说明发送完成,将TC置1.
三.、USART配置源码,只作打印调试用,不作接收,所以不用配置中断
四、遇到的问题
1.用C自带的Printf()函数,串口调试助手不显示内容,打印失败!
问题原因:没有加入printf()重定向到串口的函数,把下面代码加入,好像放的位置无所谓,我直接加到串口配置的.c文件下
2.在别的工程上发现加入printf()重定向后也无法打印
问题原因:在KEIL的魔术棒Target勾选Use MicroLIB,就是使用C库的意思。问题解决。
3.PC端无法识别串口
问题原因:板子上的BOOT盖帽没盖 ,关于boot可参考http://t.csdn.cn/wxiIP
4.串口在while(1)里只打印一次
debug现象:程序卡死在如下的201行。
问题原因:B .表示触发了某个中断, 但是没有清除中断标志位,该行在systick_handler下,而且主函数里屏蔽掉systick_config()就可以正常打印,答案很明显了。出现该问题的原因是gd32f1x0_it.c这个文件是在官方的USBD库里面拷贝过去的,该文件没用systick的中断处理函数,一旦进入中断就会卡死。加入以下代码即可。
五、总结
1. 首先没有明确串口的实际项目需求:只作调试,那只需要打印就好了,一开始在接收数据方面花了较多时间;
2. 以前用STM32有搞过一次串口,但没有对问题进行总结,导致周而复始的去查询相关知识,浪费没必要的时间;
3. 遇到问题就慌了阵脚,自己写的每一行代码应该都要清除该代码的意义,对于一些外设核心代码也要知道个大概运作流程,否者出问题无从查起。