STM32(六)——串口通信原理

本节为——正点原子笔记,海创电子学习笔记

我们先来看看我们学习的内容

一、 串行接口的基本知识

而我们今天主要说说 串行通信

而这些又是怎么样理解的?

接下来还有一个问题——即是串行通讯的同步与异步的问题

 而 UART 是属于全双工 异步通讯 —— 即可以自己主动发送消息不需要对方等待,并且可以同时在两个地方同时发送,接收

SPI 为全双工 同步通讯     IIC 为半双工(只有一定时间内) 同步通讯

当然UART 也是有对应的引脚

 ——————————————————————————————————————————

编写流程

1.串口时钟 ,GIPO时钟使能  ——  RCC_ABP2PeriphClockCmd();

2.GPIO端口模式设置  ——  GPIO_Init();

3.串口参数初始化 —— USART_Init();

4.开启中断并初始化NVIC —— NVIC_Iint();USART_ITConflg();

5.使能串口 —— USART_Cmd();

6.编写中断处理函数 —— USARTx_IRQHandler();

这张图片主要是针对,单片机对外发送数据 和 接收 数据 所使用的

1.得到一个标志位状态,第一个参数是指定一个串口,第二个参数是一个普通的变量

2. 和1. 是一对,是用来清除标志位的

3.获取中断状态

4.清除中断相关状态

 不管接收还是发送都需要两个寄存器

接收和发送使用都是数据寄存器

整个过程由CPU 或 DMA 处理

 我们对他做一个总结

———————————————————————————————————————————我们这节课就要进行简单的实验,单片机把一个简单的字符发到我们的电脑上 

 1. 

 2.

 3.

 

 我们只是简单的发送字符,没有使用中断,所以省略了中断服务函数和NVIC的配置

在主函数里调用,就可以了。

之后我们就可以在串口助手看到单片机发的 'H'了(把上面的初始化都完成后调用我们定义的函数——即 包括一系列流程的函数) 

———————————————————————————————————————————

关于TXE的标志位的小知识

举个好理解的例子

我们的八个人要从 A 到达 D ,但是我们不能直接到达,需要经过 B 和 C

首先呢 从 A 到 B 再到 C ,八个人都是一起行动的,但是从 C 到 D只能一个一个过

 从C 到 D 的过程 就相当于我们的串行通信

——————————————————————————————————————————

关于TC标志位的小知识

这个是什么意思呢?

我们理解一下 TXE  是先写入DR,然后再读SR,让下一位补上来,然后发送清空,所以我们上面程序能正常发送,但是如果是TC的话,就无法进行了,因为TC是相反的

我们看看这个,执行的是先写入DR,再读取SR

所以用TC的话,TC会读取1,而不是0,所以会直接跳转到下一行 ,而在一一行因为已经执行过了,所以会是 0 

 所以我们修改一下

这样字节就都出现了

————————————————————————————————————————

发送字符串功能

 同样用一个例子

 

 我们再来回顾一下这个内容,所以在上面。我们首先需要4个TEX,把这些组从 B 全部 都送到 C,同时我们在最后也需要一个 TC 来让最后一个字节过去 到 D ,因为如果没TC的话,当我们的B没有字符时候,就不会再继续送了

 以上是我们发送字符的库函数,接下来我们对他进行一些修改

 依次发送字符串中的字符,每发送一次检查一下 TXE位,到最后的字符发完后,他就会跳出中间的while循环来到最后一个 判断TC位

int main(void)
{
		LED_GPIO_Config();
		delay_init();
		//KEY_GPIO_Config();
	
		//TIM2_Init(4999,7199);
	    My_USART1();
	    USART_SendString(USART1, "ROSCAR 王x ");
		while(1)			
		{
			//KEY_Scan();	
			//LED_Change();			
		
		};
}

这样就可以了

————————————————————————————————————————

接收字符实验

我们需要用到一个新的函数

在上面这两个函数中,第一个是我们库函数里面所带有的,但是我们对他进行一点修改,进行标志位的一个判断,所以我们有了一个新的函数ReceiveByte,用我们的ReceiveData作为我们的返回值

再在主函数里补上

 把我们接收到的字符赋值给temp,然后再由SendByte发送我们所接收到的字符,这样我们就在串口助手里发送字符(串)了

————————————————————————————————————————

Printf函数的相关知识

在单片机里面是没有控制台的,所以我们要用到 fputc 和 fgetc 对 printf 函数进行重定向

 在串口的原文件里

把printf函数定位到我们的串口1,两个函数和  sandbytes  和  receiverbytes  很像 

只有这两个还是不够的,因为我们的printf函数使用的是半主机模式,这样会导致程序是无法执行的,所以我们就需要关掉我们的半主机模式

这个时候我们就只要使用了微库,就默认关掉了半主机模式

然后在 库函数里调用#include “stdio.h”

 第二种方法就是在我们的usart函数里面加上这个函数,然后继续重定向一下简单的说就是用这句话来代替这个勾

___________________________________________________________________________

 

 

 

 

猜你喜欢

转载自blog.csdn.net/ArtoriaLili/article/details/122341148