串口简括及配置(寄存器版、源码)

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,就到这里了

至于串口收发数据,下期见!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值