USART总结

( 以 下 总 结 经 验 为 S T M 32 F 103 Z E T 6 系 列 ) (以下总结经验为STM32F103ZET6系列) STM32F103ZET6

USART 串口分两种,第一种是 USART ,第二种为 UART 。第一种被称作同步异步收发器,而第二种被称为异步收发器,在查询STM32芯片外设手册时,可以观察到的,USART存在五个外设口

(此处以 U S A R T 2 USART2 USART2为例)存在五个外设口

USART2_CTS USART2_RTS

USART2_TX USART2_RX USART2_CK

在这里插入图片描述
以上原图片出处

五个外设口分别为 允许发送 请求发送 发送数据 接收数据 串口时钟

(此处以 U A R T 4 UART4 UART4为例)存在两个外设口

UART4_TX UART4_RX

两个外设口分别为 发送数据 接收数据

此上是为芯片上的不一样,由此可以引出同步和异步的关系

同步和异步的区别就是发送数据端和接收数据端两端的内部时钟是否一样,若为一样的,则为同步,若不一样则为异步。

所以可以和明显的发现USART比UART更让人注意的外设口则是USART2_CK,直接表明了其存在同步发送数据的功能,初学阶段还经常只能停留在异步数据发送的阶段,在此也只讲述异步发送

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

该函数就是USART/UART初始化的函数,如果只用他的话就是异步通信

void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct);

该函数就是USART时钟初始化的函数,外加上他的的话就是同步通信初始化

#define USART_HardwareFlowControl_None ((uint16_t)0x0000)
#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100)
#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200)
#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300)

此四行是官方库函数的库定义,USART_HardwareFlowControl_None 是我们视频理看到的:无数据硬件流控制。

此函数就是影响USART2_CTS USART2_RTS的控制。

(以上是自己探索的关于串口的信息,以后领悟更加深了,会重新编辑文章)

接下来是自己写函数最重要的标志位的使用

1、USART_FLAG_RXNE 串口信号接收完成

2、USART_FLAG_TXE 数据预发送准备

3、USART_FLAG_TC数据发送完成

主要采取此三个标志位会让数据传输的更加准确,不会导致数据缺胳膊少腿的,2与3在发送数据时只需要一个标志位即可,这里有个很生动的比喻来形容USART_FLAG_TXE的功能,我们将手枪打子弹位数据传输,USART_FLAG_TC表示我的子弹打完了,USART_FLAG_TXE表示我子弹还没打完还有子弹时上膛着的

串口通信还有一个标志位USART_FLAG_ORE需要注意,如果接受数据出现缺陷,可能就要查看这个位是否置一,若置一的话表示,接收数据出现了数据过多导致数据溢出错误,需要检查程序的接收端是否能行之有效,

此下为转载:

if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
}

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
//rebuf[num++] = USART_ReceiveData(USART2); 读取串口数据
}

在此使用USART_ClearITPendingBit(USART1, USART_IT_ORE);清除ORE位是没有任何作用的。

原文章:ORE处理详解

以上为转载。

void DataRecevice1b(USART_TypeDef* USARTx)
{
for(RxCounter=0;RxCounter<5;RxCounter++)
{
DataRe[RxCounter]=USART_ReceiveData(USARTx);
while(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==RESET);
}
}

void DataSend(USART_TypeDef* USARTx,u8* Message)
{
while(* Message!=’\0’)
{
Send1Byte(USARTx,*Message++);
delay_ms(2);
}
}

TXRXstat Send1Byte(USART_TypeDef* USARTx,u8 dat)
{
vu32 cnt=0;
USART_SendData(USARTx,dat);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)!=RESET)
{
cnt++;
if(cnt>100000)
{
return ERR;
}
}
return OK;
}

void DataClearAll(u8 len)
{
u8 i;
for(i=0;i<len;i++)
{
DataRe[i]=0;
}
}

此处贴了四个我自己写的函数,很简单自己也可以理清楚,就不多言了

翔予有个秃头梦
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值