完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
通信方式的分类
按照通信方式分类: 并行通信:8位(一个字节)数据同步传输,传输速度快,占用引脚资源多。 串行通信:8位数据按位传输,速度相对较慢,占用引脚资源少。 同步通信:带时钟信号同步传输,如SPI,IIC通信接口。同步通讯当中,需要外加一根时钟线,进行时钟同步,收发双方根据时钟信号的节奏来进行信号传输。 异步通信:不带时钟同步信号,比如UART(通用异步收发器),单总线。对于异步通讯,不需要时钟线,而是在数据信号中穿插一些用于同步的信号位,然后接受方根据约定的协议(波特率)对收到的数据进行解析。 按照数据传送方向分类: 单工:只支持数据单向传输。 半双工:允许数据在两个方向传输,但是在某一时刻,只允许数据在一个方向传输。 全双工:允许数据同时在两个方向传输。因此,全双工通信可以看作是两个单工通信方式的结合,需要独立的接收端和发送端。 通信接口及其说明如下图所示: STM32的串口通信 引脚接线 对于芯片之间的通信来说,其引脚接线方法如图所示:由于两块芯片之间都是TTL电平(5V为高,0V为低),因此可以直接相连(交叉接线) 对于芯片和PC机之间的通信,则不能直接相连,因为电平不兼容。所以要中间要接一个RS232的转换器,将TTL电平转换为RS232电平(+15/+13为0,-15/13为1) 串口通讯的过程 上图很形象的表示出了数据传输的过程。无论是输入还是输出,都是一位一位进行传输的。对于接收数据,一般是当一帧数据全部被移位寄存器接收以后,再并行的传输到RDR寄存器,最后被内核读取;对于发送来说,则是这个过程的逆向操作,当一帧完整的数据被发送到TDR寄存器以后,在并行的将数据报传给移位寄存器,最后由移位寄存器一位一位的发送出去。 UART串口通信都是以帧为单位,一帧数据通常包含以下几位: 1位起始位+8位数据位+1位奇偶校验位+1位停止位 如下图所示: 串口发送数据 当发送使能位(TE)被置1时,首先发送一个空闲帧,然后发送移位寄存器中的数据在陆续开始在TX引脚输出。 对于串口发送数据配置的流程如下: 1、通过CR1寄存器的UE位(USART使能)来使能USART。 2、通过CR1的M位定义字长。 3、通过BRR寄存器来设置波特率。 4、设置CR1的TE位(发送使能位),并发送一个空闲帧作为第一次数据发送。 5、把需要发送的数据依次写入DR寄存器,该动作同时清除TXE位(发送寄存器空),对于待发送的数据重复该步骤。 6、当DR寄存器中写入最后一个数据字以后,等待TC=1,其表示最后一个数据帧的传输结束(当需要关闭USART或者停机之前,都需要确认是否传输结束,避免破坏最后一次传输) 单字节通信: 对于清零TXE位,是通过对数据寄存器的写操作来实现的,TXE位由硬件来设置,TXE位置1表明: 1、数据已经从TDR移送到移位寄存器,数据发送已经开始; 2、TDR寄存器已经清空; 3、下一个数据可以被写进DR寄存器而不会覆盖先前的数据。 若设置了TXE位 ,当一帧数据发送完成以后,这时TC位被置1。如果要使用发送完成中断,那么要提前将CR1中的TCIE位置1 ,当TC为1时,就产生中断。 串口接收数据 对于接收数据,首先,要先侦测起始位,如果确认收到起始位,就设置RXNE标志位(置1),若RXNEIE为1(提前设定是否使用中断) ,则产生中断,在中断服务函数中进行数据的接收。 字符接收: 1、将CR1寄存器中的UE置1来使能USART。 2、确定CR1中的M位来调节字长。 3、在CR2中调节停止位的个数。 4、在BRR寄存器中选择波特率。 5、将CR1中的RE置1,使能接收器,并开始搜寻RX引脚上的起始位。 当一个字符被接收到以后: 此时RXNE位(读数据寄存器非空)被置位,表明移位寄存器中的数据被转移到RDR(即数据已经被接收,且可以被读出),如果需要使用到中断功能,那么需要提前将USART_CR1寄存器中的RXNEIE位(接受缓冲区非空中断使能)置1,当使能了该位以后,当USART_SR中的ORE或者RXNE位为1时,产生USART中断。 USART中断请求 在谈到串口中断请求之前,首先得知道为什么需要用到中断来进行数据的收发。假设不使用中断的功能来完成数据的收发,那还可以用轮询的方式来收发数据。这种方式是在主函数中写一个死循环来实现的,因此,这种方式效率低,在数据还有没有到来之时就一直在不停的扫描引脚,影响其他程序的执行,而中断则是在有数据到来时,才响应中断,转而执行中断服务函数,因此不会影响其他程序的执行。 要使用中断,必须在初始化的时候将下图中相应的使能位置1,否则不能产生中断。USART的各种中断事件被连接到同一个中断向量,以下各种中断事件均请求同一个中断服务函数,这些事件如下图所示:一般情况下,这几种中断事件在同一时刻只有一件事件发生。至于此刻到底是发生的什么事件,会在中断服务函数中进行判断,执行相应的响应函数。 若其中存在理解有误的地方还望大佬指出,谢谢! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 10:58 , Processed in 0.638615 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号