本节为——正点原子笔记,海创电子学习笔记
我们先来看看我们学习的内容
一、 串行接口的基本知识
而我们今天主要说说 串行通信
而这些又是怎么样理解的?
接下来还有一个问题——即是串行通讯的同步与异步的问题
而 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函数里面加上这个函数,然后继续重定向一下简单的说就是用这句话来代替这个勾
___________________________________________________________________________