//串口(UART)------------------------:
//1.同步:
步调一致,两个设备之间的通信速度相同
//2.异步:
步调不一致,两个设备之间的通信速度不相同
//总结:
同步通信:有时钟线连接,并且时钟线可以控制两个设备之间的速度,让速度保持一致
异步通信:没有时钟线连接,需要用户自行规定两个设备的数据传输速度
//单工、半双工、全双工:
单工: 一根数据线,A与B之间单向传输
半双工: 一根数据线,A传输给B结束后,B才能给A传输
双工: 两根数据线,A与B之间能同时相互传递数据
//说明:一般全双工通信都会有发送端(TX/TXD)和接收端(RX/RXD)
//会有两根数据线负责数据传输发送要比接收先
//UART全双工
//串行与并行: 数字量由0/1组成,数据一般以字节为单位,1byte=8bit
串行: 数据一个一个发送
并行: 多车道,多个数据同时发送
//UART:是一种异步全双工串行通信方式
//波特率公式:
USARTDIV = Fck / (8*(2 - OVER8)) / 波特率;
DIV_M = (u32)USARTDIV;
DIV_F = (USARTDIV - DIV_M) * (8 * (2 - over8));
//USART1的初始化方法:
/*
函数功能:USART1初始化
返回值:void
形参:u32 bps(对应的波特率)
函数说明:
USART1_TX --- PA9 --- 复用模式
USART1_RX --- PA10 --- 复用模式
低位复用寄存器:GPIOA->AFR[0]
高位复用寄存器:GPIOA->AFR[1]
*/
{
float USARTDIV = 0;
u32 DIV_M,DIV_F;
//打开GPIOA的时钟、Usart1的时钟
//PA9、PA10初始化
1.清零
2.打开配置模式为复用
//配置复用关系
根据映射分别配置USART1的TX与RX(AFR)
//USART1初始化
1.SR
2.CR1
3.CR2
//计算波特率
USARTDIV = 84000000.0 / (8*(2 - OVER8)) / bps;
DIV_M = (u32)USARTDIV;//强转为整型
DIV_F = (USARTDIV - DIV_M) * (8 * (2 - OVER8));//小数部分
USART1->BRR |= DIV_M << 4 | DIV_F;//设置BRR寄存器
//使能USART1
USART1->CR1 |= 1 << 13;//使能串口1(CR1中)
}
//发送一字节函数:
/*
函数功能:发送一字节数据
返回值:void
形参:u8 data
函数说明:
1.等待数据可以发送
2.发送数据
*/
void usart1_send_byte(u8 data)
{
while(!(USART1->SR & 1 << 7));
USART1->DR = data;
}
//接收一字节函数:
/*
函数功能:接收一字节数据
返回值:u8
形参:void
函数说明:
1.等待数据可以接收
2.接收一字节数据
*/
u8 usart1_rec_byte(void)
{
while(!(USART1->SR & 1 << 5));
return USART1->DR;
}
//发送一字符串数据:
/*
函数功能:发送一个字符串
返回值:void
形参:u8 *str
函数说明:
通过while循环,按字节一字节一字节发送字符串,最后在末尾补'\0'
*/
void usart1_send_str(u8 *str)
{
while(*str != '\0')
{
usart1_send_byte(*str);
str++; //按字节偏移
}
usart1_send_byte('\0'); //字符串末尾补零
}
//接收一个字符串数据:
/*
函数功能:接收一个字符串
返回值:void
形参:u8 *str
函数说明:
通过为while(1)一字节一字节循环接收数据,在遇到'\r'或'\n'之前结束循环,最后在末尾补0
*/
void usart1_rec_str(u8 *str)
{
u8 a;
while(1)
{
*str = usart1_rec_byte()
if(*str == '\r')
{
break;
}
str++;
}
*str = '\0';
a = usart1_rec_byte(); //将末尾的'\n'接收到一个字符中,不然会出错
}