在介绍之前,先简单介绍几种通信协议:
Usart:通用同步异步收发器,这篇文章会详细讲解的。
Uart:通用异步收发器,相当于Usart的异步通信功能。
SPI:串行外设接口,是一种同步协议。
IIC:集成电路总线,同步协议。
首先我个人通俗简单介绍一下几种协议,可以有一个基本的概念。
为什么会有协议产生呢???因为一个电子元器件想和另外一个电子元器件聊天,但是它们自己不会讲话,只会产生一些二进制代码,所以我们就要给这些二进制代码设定一些规则。举例说明,Res1想和Cap1说一句你好,它向电容发出了11100011,我们就可以规定,11100011就是“你好”的意思。不同的协议就像不同的语言,假设11100011在“语言”SPI中代表“你好”,但是在另一种“语言”IIC中,00011100才是代表“你好”,所以就会有了不同的协议产生。
同步异步的区别:我们可以这样区别,同步就相当于Res1在和Cap1打电话,所以它一直要和Cap1保持时刻联系,它在和Cap1打电话的时候不可以去和Cap2,Cap3打电话。异步呢就相当于发短信,Res1可以向Cap1,Cap2,Cap3…任何人发短信,它不需要等到Cap的回复再去继续下一步操作,它可以随时随地的发。
单工、半双工和全双工:这个需要结合图说明更加形象
假设每种方式的左边为A右边为B
单工:A发送给B,A只有发送功能,B只有接收功能;例如看电视
半双工:A可以发送给B,A也可以接收B的发送;(同一时间只可以存在一方传输给另一方)例如对讲机
全双工:A可以发送给B,A也可以接收B的发送;(同一时间双方可以互相传输)例如打电话。
基本内容就介绍到这里,后面设计到相关内容话会详细讲解,现在就开始Usart的讲解吧!
--------------------------------------------------------分割线------------------------------------
首先我们讲解的是个USART的四个寄存器:
CR(控制寄存器)SR(状态寄存器)DR(数据寄存器)BRR(波特比率寄存器)
首先是四个寄存器的描述:
CR寄存器:它是USART中的控制寄存器,主要负责USART使能、检验控制使能、校验选择(奇校验偶校验)、PE中断使能、发送缓冲区空中断使能、发送完成中断使能、接收缓冲区非空使能、发送使能、接受使能、字长等等,它只用到了低14位,其他位保留为空。
CR2,CR3的、这里不做过多的解释。。。之后看情况补充。
SR寄存器:SR寄存器用到了低10位,是用来判断USART状态的一种寄存器。发送寄存器空位、发送完成位、读数据寄存器非空位、检测到主线空闲位、过载错误为等等。
BRR寄存器是波特比率寄存器。高16位保存,低16位写数据。【15,4】是整数部分,【3,0】是小数部分。
举例:时钟是72M,波特率为115200
DIV=CLK/(16115200)=39.0625;
所以DIV_Mantissa=39=0x27;
DIV_Fraction=160.0626=1=0x01;
so DIV=0x0271
一般寄存器写的时候我们用来反推波特率的!!!
--------------------------------------------分割线------------------------------------------------
void My_Usart_Init(u32 clock,u32 bount)
{
double temp;
u16 mantissa;//分频器整数部分
u16 fraction;//分频器小数部分
temp=(double)(clock*Mhz)/(16*bount);//得到分频数
mantissa=temp;//分频器整数部分
fraction=temp-mantissa;//分频器小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2;//GPIOA时钟使能
RCC->APB2ENR|=1<<14;//USART1时钟使能
GPIOA->CRH&=0xfffff00f;//复位端口PA9/PA10
GPIOA->CRH|=0x000004B0;//PA9设置为复用推挽输出,速度50MHZ/PA10设置为浮空输入
RCC->APB2RSTR|=1<<14;//复位串口1
RCC->APB2RSTR|=~(1<<14);//停止复位1
USART1->BRR|=mantissa;//设置波特率
USART1->CR1|=0x200C;//使能串口,字节长度为8,停止位为1(CR2寄存器中设置),支持收发
#if EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
}
int main(void)
{
u8 res=0x01;
u8 rr;
My_Configuration();
while(!(USART1->SR&(1<<7)));
USART1->DR=res&0x01ff;
delay_ms(1);
while(!(USART1->SR&(1<<5)));
rr=USART1->DR&0x01ff;
if(rr==1)
{
GPIOA->BRR|=1<<8;
}
while(1)
{
}
}`
如果对您的问题有帮助的话可以帮忙点个赞,谢谢~QQ群:540093471 有问题大家可以一起交流沟通!