串口(USART)的含义
USART:
U-Universal通用
S-Synchronous同步(共享时钟)
A-Asynchronous异步(不共享时钟)
R-Reciver接收
T-Transmitter发射器
如何使用用USART
cpu通过发送数据寄存器发送控制到TX引脚,通过Rx引脚从接收数据寄存器接收数据到CPU。
USART的工作原理
串并转换电路:在CPU向发送数据寄存器发送数据时采用的是并行写入收发控制到TX引脚,向外部设备发送采用的是串行发送,同理外部接收数据时采用的是RX引脚串行接收数据,紧接着CPU并行读取接收数据寄存器中的数据。
USART的完整框图
数据帧格式设置
寄存器:配置寄存器
M-(Word Length)数据位长度
M=0,8位;M=1,9位
PCE-奇偶校验使能
PCE=0,禁止;PCE=1,使能
PS(Selection)奇偶选择
PS=0,偶校验;PS=1,奇校验
STOP-停止位长度
TXE,发送,RXE,接收
UE-USART的总开关
波特率设置
波特率:每秒钟传输码元的个数
数据发送过程
2.2.4.1双缓冲与连续发送
TXE发送数据寄存器空
TC发送完成
RXNE标志位
RXNE接收数据寄存器非空
RXNE=0,无数据,RXNE=1,有数据
错误标志位
示例代码
void My_USART1_Init(void)
{
GPIO_InitTypeDef GPIOInitStruct;
//初始化TX PB6 10MZ AF_PP
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIOInitStruct.GPIO_Mode =GPIO_Mode_AF_PP;
GPIOInitStruct.GPIO_Pin=GPIO_Pin_6;
GPIOInitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIOInitStruct);
//初始化RX PB7 IPU
GPIOInitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIOInitStruct.GPIO_Pin=GPIO_Pin_7;
GPIO_Init(GPIOB,&GPIOInitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIOInitStruct.GPIO_Mode=GPIO_Mode_Out_OD;
GPIOInitStruct.GPIO_Pin=GPIO_Pin_13;
GPIOInitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&GPIOInitStruct);
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
//重映射USART的Tx和Rx的引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
//使能USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//设置USART1的参数
USART_InitTypeDef USARTInitStruct;
USARTInitStruct.USART_BaudRate=9600;
USARTInitStruct.USART_WordLength=USART_WordLength_8b ;
USARTInitStruct.USART_StopBits=USART_StopBits_1;
USARTInitStruct.USART_Parity=USART_Parity_No;
USARTInitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USARTInitStruct.USART_Mode =USART_Mode_Tx|USART_Mode_Rx;
USART_Init(USART1,&USARTInitStruct);
//闭合USART的总开关
USART_Cmd(USART1,ENABLE);
}