USART 串口分两种,第一种是 USART ,第二种为 UART 。第一种被称作同步异步收发器,而第二种被称为异步收发器,在查询STM32芯片外设手册时,可以观察到的,USART存在五个外设口
(此处以U S A R T 2 USART2USART2为例)存在五个外设口
USART2_CTS USART2_RTS
USART2_TX USART2_RX USART2_CK
以上原图片出处
五个外设口分别为 允许发送 请求发送 发送数据 接收数据 串口时钟
(此处以U A R T 4 UART4UART4为例)存在两个外设口
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)
{undefined
USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
}
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{undefined
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
//rebuf[num++] = USART_ReceiveData(USART2); 读取串口数据
}
在此使用USART_ClearITPendingBit(USART1, USART_IT_ORE);清除ORE位是没有任何作用的。
原文章:ORE处理详解
以上为转载。
void DataRecevice1b(USART_TypeDef* USARTx)
{undefined
for(RxCounter=0;RxCounter<5;RxCounter++)
{undefined
DataRe[RxCounter]=USART_ReceiveData(USARTx);
while(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==RESET);
}
}
void DataSend(USART_TypeDef* USARTx,u8* Message)
{undefined
while(* Message!=’\0’)
{undefined
Send1Byte(USARTx,*Message++);
delay_ms(2);
}
}
TXRXstat Send1Byte(USART_TypeDef* USARTx,u8 dat)
{undefined
vu32 cnt=0;
USART_SendData(USARTx,dat);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)!=RESET)
{undefined
cnt++;
if(cnt>100000)
{undefined
return ERR;
}
}
return OK;
}
void DataClearAll(u8 len)
{undefined
u8 i;
for(i=0;i<len;i++)
{undefined
DataRe[i]=0;
}
}