- 串口
- 串口:USART,通用(a) 同步(s)/异步(a) 收发(t)器,串行 全双工 同/异步
- 协议:串行通信协议
- 起始位:通常是逻辑0,标志着传输开始
- 数据位:常用8位,也有9位
- 奇偶校验位:通常不用
- 停止位:传输结束的标志,通常设置1位
- 空闲位:总线空闲的标志,通常是逻辑1
- 速率:双方约定波特率,常用9600,115200 (速率单位bit)
- STM32串口工作原理
- 发送
- Data->TDR(发送数据寄存器)->发送移位寄存器->TX,TDR数据会自动转移到移位寄存器,当TDR的数据全部转移至发送移位寄存器时,TXE标志位置1,发送移位寄存器逐位将数据移至TX,此时TDR可以再次写入发送数据。
- 接收
- RX->接收移位寄存器(接收数据寄存器)->RDR->Data,RX将数据逐位放进接收移位寄存器(先收的在高位),当移位寄存器满8位后将数据放进RDR中,此时RXNE置1,数据可以被读出。
- 标志位
- TXE:
- 1 TDR空,可以开始发送
- 0 TDR非空,还有数据没有转移完毕
- TC:
- 1 发送完成,此时TXE==1
- 0 未发送成功
- RXNE:
- 1 RDR非空,还不可以读数据
- 0 RDR空,可以开始读数据
- IDLE:
- 1 检测到总线空闲,产生中断
- 0 总线非空闲
- 例程
void Usart1_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_InitStruct);
USART_InitTypeDef USART_InitStruct = {0};
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1,&USART_InitStruct);
USART_Cmd(USART1,ENABLE);
USART1->CR1 |= 0x1<<5;
NVIC_SetPriority(USART1_IRQn,7);
NVIC_EnableIRQ(USART1_IRQn);
}
void USART1_IRQHandler(void)
{
uint8_t data;
if((USART1->SR&0x1<<5)!=0){
data = USART1->DR;
}
}