历史上的今天
今天是:2024年10月14日(星期一)
2021年10月14日 | STM32 Uart及其配置
2021-10-14 来源:eefocus
重要的事情要说三遍,这个通信口,非常重要!非常重要!非常重要!
Uart = Universal Asynchronous Receiver/Transmitter,通用异步接收器/发送器,它的特点就在于它的名字,通用,很多地方都用到;异步,它没有同步时钟;接收器/发送器:能收能发,全能小超人。
一般用在上位机(比如PC,比如中控等)与单片机的通信,单片机与模块间的通信,单片机与单片机的通信等等,主要用于两个不同设备间的通信,总之,它很通用!
它的主要特点除了它的名字之外,还要明白几个:1.一对一;2.全双工;3.传输距离不长,15m以内,长了干扰啊,还得取决于硬件设计电路;
PC如何与单片机通信呢?
PC相关的通信接口叫COM口,它有9个pin,是RS-232的电平标准,+15/+13V表示1,-15/-13V表示0;
单片机的相关通信接口叫UART口,它有4个pin,是TTL电平标准,+5V表示1,0V表示0;
这两个接口标准不一样,引脚数目不一样的通信接口,如何连接呢?
1. 电平标准不一样,需要一个电平转换芯片,MAXxxxx,所以,大家看到的,单片机跟PC机的接口连接上,有一个电路,如下图:

2. 引脚数目不一样,
Uart有四个引脚,VCC(电源),RXD(接收),TXD(发送),GND(地);
COM口有9个引脚,我们只用第2个pin(RXD)和第3个pin(TXD)就行了,其它引脚暂时不管;
需要注意的是,要把PC的RXD和板子的TXD连接起来,板子发送对PC接收,把PC的TXD和板子的RXD连接起来,PC发送对板子接收,还要记得共地,也就是把串口的铁壳子和板子的地连接起来;
具体的设计原理和细节,软件工程师不需要了解太多,知道有这么一回事就行了。
同理,单片机与单片机,单片机与模块通信,也就是把不同设备的RXD和TXD交叉连接起来。
如下图:上面的是板子上的接口,下面的是PC的接口,USB转COM口;

这两个长这样子的口,怎么连接起来呢?都是针针的,咋个连接?
这里普及一下公头和母头,
如上图,带有很多针针的,就是公头;
如下图,带有很多孔的,就是母头;
由于我用的两个都是公头,就必须要用两端都是母头的线连接起来;

如何连接?两端连接上去咯,连接后的图如下图:

好了,硬件接口讲解完毕,现在开始软件接口的配置了,
1. 找原理图,找到 RXD = PC11,TXD = PC10,这个根据原理图来,不能千篇一律;
2. 建一个STM32Cube工程,参照STM32CubeMx 创建第一个工程;
3. 在Pinout页,看一下PC11/PC10,可以设置为UART4,那就把它设置为 UART4吧,设置标示的 1)和 2);

4. 配置完引脚,在Configuration页,点刚刚配置引脚的UART4,可以配置UART4;

讲解一个Baud Rate、Word Length、Parity、Stop Bits、Data Direction、Over Sampling的含义吧。
先来一个串口时序图,如下图:先发一个 Start bit,接下来发几位数据,再接下来发个 Stop bit,一个数据帧结束,接下来发下一帧;

Baud Rate:波特率,通信的速率,表示每秒传多少个Bits,我们设置成 115200 Bits/s,一秒钟能传115200个Bits,通信的速率越高,传输数据越快,当然,传输距离就越短,出错的可能性也越大;
Word Length:一帧数据帧的位数,一个Start Bit到一个Stop Bit,就算一帧数据,一个BYTE为8 Bit,一般设置为8;
Parity:奇偶校验位,数据位为“1”的个数,加上这个位,使得"1"的个数为偶数(偶校验)或者奇数(奇)校验,以此来校验数据的正确性,如果想用8 Bit数据和校验位,可以把上面的Word Length设置为9,奇偶校验位设置为奇或者偶;不过我们这里不使用奇偶校验位;
Stop Bits:停止位,表示数据帧结束;另外,由于是异步传输,没有专门的时钟,每个设备有不同的时钟源,可能会有一点点点小小的偏差,这个停止位还可以用来提供通信双方校正通信同步的机会;
Data Direction:这个还用说,当然选收发咯,当然,你也可以选单收或者单发,你喜欢,你愿意!
Over Sampling:对这东东,只要知道 1. 主要用来做接收采样的,8倍波特率或者16倍波特率;2. 波特率计算跟这个有关系,反正不用自个计算;3. 我们平常用的波特率都在1MBps之下,选啥没什么区别;具体就不上图了,RM0033文档满上,撸一把!
总之,通信双方,参数,一定要一致!一定要一致!!一定要一致!!!
好了,生成代码,生成的代码是这样的,有没有熟悉的感觉撒:

看下MX_UART4_Init(),是不是就是刚才配置的参数?

再次回到main()函数里面,看看while(1){}里面,是不是空空如也呀?有没有觉得,应该加点什么?
我们就做一个收到什么,就把收到的自加1,再发送出去的功能吧。
首先,声明个变量,用来存放收到的数据;

接下来,将收到的数据自加1,发送出去:

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
作用是接收/发送串口数据,
*huart:句柄
*pData:数据指针,该指针的内容就是接收/发送的数据
Size:接收/发送数据的长度,因为这里只接收一个字节,就写1,如果要接收多个数据,可以填其它数,但pData可以传入一个数组;
Timeout:时间,因为直接在循环里面轮询,就直接填0;
这两个函数在HAL库里面有实现的源码,有兴趣的话可以看看,对照着RM0033阅读代码,看看它是如何实现的,会有很大收获;
编译,运行,在PC机上用串口调试助手测试下;

串口配置一定要和MCU配置一致;
请钩上HEX发送,HEX显示;
这里是直接用轮询的方式接收串口数据,后面,我们再讲解一下用中断和DMA的方式接收串口数据并处理吧。
整个工程及代码呢,请上百度网盘上下载咯;
链接:https://pan.baidu.com/s/19usUcgZPX8cCRTKt_NPcfg 密码:07on
在Code/UartTest文件夹里面;
史海拾趣
|
Aeroflex 5800系列设备满足不断发展的自动测试需求 如果您是一位工程师,而且正在进行混合信号测试、器件编程、功能测试、在系统编程或者简单协议通信,那么Aeroflex设计的5800系列自动测试设备(ATE系统)能够让您的工作更轻松。5800系列ATE设备采用开放式并且高度可配置的结构,因而能轻松适应不断发 ...… 查看全部问答> |
|
请教高手! 急用!!!!利用汇编实现D/A、A/D转换产生波形并显示. 内容如下:1.利用D/A设计一个波形发生器,能分别产生三角波、正弦波、锯齿波和方波。 2.并利用按键(自行定义)进行输出波形选择。 3.并对应按键选择输出波形 ...… 查看全部问答> |
|
下面是本人下载的的RV MDK微控制器开发平台的视频讲解 。。 里面对国内国际所使用的RV MDK开发工具做出了详细的指导,给出了他们个人的见解。 对于学习CORTEX M3和ARM技术有相当好的帮助。。。 用MDK ...… 查看全部问答> |
|
各位好, 我把STM32 用串口ISP烧写了 IAP (DfuSe需要与之通讯),并且对STM32 作了读保护。 然后用 DfuSe 软件 更新了我的用户程序(APP)。 是可以读保护了,因为 用Jlink 的 JTAG口 是读不出来, ...… 查看全部问答> |
|
MSP430F2274中uart通信,程序没有问题,但是用串口精灵测试就是没有数据 //****************************************************************************** // MSP430F22x4 Demo - USCI_A0, Ultra-Low Pwr UART 9600 String, 32kHz ACLK // // Description: This program demonstrates a f ...… 查看全部问答> |
|
上次看科学网报道 说德国教授说中国有大量的技工但是工程师不多 上次看科学网报道 说德国教授说中国有大量的技工但是工程师不多感觉确实是这样,工程师是解决问题的,而技工只是体力活,没有创造性劳动。并且工程师有理论基础,为什么ic厂的设备技校出来的都可以操作为什么还要找研究生呢?就是因为研究生理论基 ...… 查看全部问答> |
|
摘要:目前很多嵌入式系统以DSP 为核心构建,但是,采用汇编语言开发DSP 系统存在开发难度大、开发周期长、维护性差等缺点,应用C 语言开发DSP 系统是广大嵌入式开发者的迫切要求。有关单片机的C 语言开发有相当多的资料可以参考,而DSP 系统的C 语 ...… 查看全部问答> |




