1.1 串口简介
1.1.1 串口是什么??
串意思是连续在一起,但是互相独立,串口是用于收发数据的,所以意思是数据是连续收发但是独立存在的,为什么是独立存在的呢??数据收发要通过线,对于机器来说线上只有高低电平(0和1),所以数据只能一个位一个位这样传输,连续传的话看成一个串,这就是串口
总结:数据以一位一位方式传输,但是连续传的一种方式,被称之为串行传输方式,数据串行方式传输的接口就是串口。
1.1.2 串口的作用??
数据以串行方式传输,接收方和传输方就要进行协商(如果不协商传输方以为接收方是懂的,接收方不懂,数据就不正确)。为了保证数据传输正确就要协商好,协商好的东西被称之为协议,根据协议的不同串口有不同的称呼(232、485、IIC、SPI等都是串行通讯协议),但是一般情况下我们说的串口是通用串行传输口(USART),我们这里学习就是它。
总结:收发数据
为什么要收发数据??主控要控制外设,外设采用串口协议,主控传输的时候就也需要使用串口协议。
IO口不是也可用控制外设吗?为什么还要搞一个串口呢??串口是一种协议,传输数据用的还是IO口,收发双方用IO口传输数据,收发双方在数据处理上使用串口协议
1.1.3 串口怎么使用??
串行数据的传输一般分为两种:同步和异步。
同步:使用的时钟(传输数据的依据,其实就是产生频率的东西)是同一个;
异步:使用的时钟不是同一个;
USART里面我们使用异步收发模式,为了看到现象我们的数据是发送到电脑上的,由电脑上的软件显示收发的数据。
1.2 串口应用
1.2.1 异步收发协议
在异步通讯中数据或字符是逐帧(frame)传送的。帧定义为一个字符的完整的通信格式,通常也称为帧格式。最常见的帧格式一般是先用一个起始位“0”表示字符的开始,然后是5~8位数据,规定低位在前,高位在后,其后是奇偶校验位;最后是停止位,用以表示字符的结束,停止位可以是1位,1.5位,2位,不同的计算机规定不同。从起始位到结束位称为1帧。
- 起始位:通讯线上没有数据传输时,为高电平(逻辑1);当要发送数据时,首先发1个低电平信号(逻辑0),此信号称为“起始位”。表示开始传输1帧数据。
- 数据位:起始位之后的位即数据位,数据位可以是5、6、7、8位(不同计算机的规定不同),上图的数据位为8位,一般从最低位开始传输,最高位在最后。
- 奇偶校验位:数据位之后的位为奇偶校验位(可有可无),此位可以判断字符传送的正确性,具有3种可能选择,即奇、偶、无校验,用户自选。偶校验:数据位加上校验位,使“1”的个数为偶数。
- 停止位:一帧数据结束标志位。可以是1位,1.5位(每一位时间是固定的,1.5位就是高电平时间长度是1.5位占用的时间),2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能是通讯中2台设备间出现了小小的不同。因而停止位不仅仅是表示传输的结束,而且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
- 空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。
总结:异步收发时一帧数据是 起始位1+数据位8(+校验位1)+停止位1
1.2.2 传输速率
收发双方必须是速率一样的,这个速率被称之为波特率,常用的是9600和115200这两个。
用9600举例,意思是每秒传输9600个位,请问在没有校验位的情况下,每秒传输几个字节的数据??960字节。
1.2.3 串口的组成
1)控制器――控制串口的工作(CR1控制工作,SR标志工作状态)
2)发送器――向外发送数据的(TX)
3)接收器――接收外部的数据(RX)
4)波特率发生器――控制通信的速度(BRR)
1.3 USART配置与应用
1.3.1 看原理图
以串口1为例
TxD(发送)是PA9,复用推挽输出模式
RxD(接收)是PA10,浮空输入
1.3.2 配置引脚模式
1.3.3 引脚复用配置
1.3.4 串口的寄存器配置
CR2:
1.3.5 波特率发生器
USARTDIV = 84M/(8*2*115200)
1.3.6 开启串口时钟
1.3.7 如何发送数据
看SR寄存器。
位6和位7都能代表发送完成,发送完成上一次的数据就可以发送这一次了。
串口的总结:
1)它是什么?串口就是一位一位传输数据的接口,用于传输相对复杂的数据
2)它怎么用?先配置、然后将数据放入数据寄存器自动发送出去
3)怎么配置?首先配置引脚(PA9和PA10)、然后引脚复用映射、配置CR1寄存器、配置波特率发生器
4)怎么发送?判断SR寄存器中的标志位(这里判断发送寄存器空)、然后将数据放入DR寄存器、等待发送完成就可以下一次发送
源码:
/**************************************************
*函 数 名:Usart1_Init
*函数功能:串口1初始化配置
*返 回 值:无
*入口参数:bps 波特率
*出口参数:无
*备 注:串口1配置寄存器版
**************************************************/
void Usart1_Init(int bps)
{
float usartdiv;
int zs;
float xs;
//开GPIOA口时钟、串口usart1时钟
RCC->AHB1ENR |= 1<<0;
RCC->APB2ENR |= 1<<4;
//配置引脚
//PA9 TX
GPIOA->MODER &= ~(0x3<<2*9);
GPIOA->MODER |= 0x2<<2*9;//复用模式
GPIOA->OTYPER &= ~(0x1<<9);//推挽输出
GPIOA->OSPEEDR &= ~(0x3<<2*9);//清0
GPIOA->OSPEEDR |= 0x2<<2*9;//50Mhz
//PA10 RX
GPIOA->MODER &= ~(0x3<<2*10);//浮空输入模式
GPIOA->MODER |= 0x2<<2*10;//复用模式
GPIOA->PUPDR &= ~(0x3<<2*10);//清0 复位即浮空
//复用串口引脚功能
GPIOA->AFR[1] &= ~(0xFF<<4*(9-8));//清0
GPIOA->AFR[1] |= 0x77<<4*(9-8);//PA9 PA10
//配置波特率发生器
usartdiv =84000000/(2*8.0*bps);//波特率产生公式
zs = (int)usartdiv;//取整数
xs = usartdiv-zs;//取小数
USART1->BRR = zs<<4 | (int)(xs*16);//设置并存储波特率在16位BRR上(高12位存整数,低四位存小数)
//串口中断配置
NVIC->ISER[1] |= 1<<(37-32);//使能串口中断
NVIC->IP[37] = 0xA0;//使用4位优先级 1010 0000 设置抢占优先级为2,响应优先级为2 37为串口中断编号
//配置串口控制器
USART1->CR1 = 0;//清空配置
USART1->CR2 = 0;//设置1位停止位
USART1->CR3 = 0;//不使用控制寄存器3
USART1->CR1 |= 1<<2 | //使能接收
1<<3 | //使能发送
0<<10| //不进行奇偶校验
0<<12| //8位数据位
1<<5 | //开启接收中断
1<<4 | //开启空闲中断
1<<13; //使能串口
}
ok,就到这里了
至于串口收发数据,下期见!