一、串行通信的通信方式
1.同步通信:带时钟同步信号传输,有一根线是同步时钟。例如SPI(全双功)、IIC(半双工)通信接口
2.异步通信:不带时钟同步信号,必须约定好波特率。例如UART(全双功)
二、STM32的串口通信接口
UART:通用异步收发器。
USART:通用同步异步收发器。
STM32F10x系列包含3个USART和2个UART。
都是TTL电平交叉相连即可
与PC机可以使用USB-TTL进行通信。
三、通信引脚
四、常用串口相关寄存器
1.USART_SR状态寄存器:里面一些相关位可以用来判断是否发送接收完成等。
2.USART_DR数据寄存器:通过读写这个寄存器来发送接收数据
3.USART_BRR波特率寄存器:
波特率计算方法:波特率=fPLCLKX /(16*USARTDIV);USARTDIV=72000000/(115200*16)=39.0625
DIV_Fraction=16*0.0625=1=0X01;(小数部分)
DIV_Mantissa=39=0X27;(整数部分)
从而得到USART_BRR波特率寄存器的值为0X0271,这就是115200的波特率对应的寄存器值。
五、串口操作相关库函数
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
串口初始化:波特率,数据字长,奇偶校验,硬件控制流以及收发使能。
第一个成员变量是串口标号,第二个成员变量是结构体
typedef struct
{
uint32_t USART_BaudRate; //波特率
uint16_t USART_WordLength; //位长,8位或9位
uint16_t USART_StopBits; //停止位
uint16_t USART_Parity; //奇偶校验位
uint16_t USART_Mode; //使能输入输出
uint16_t USART_HardwareFlowControl; //硬件流控制
} USART_InitTypeDef;
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
使能串口
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
使能相关中断
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
发送数据到串口
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
从串口接收数据
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
获取状态标志位
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);
清除状态标志位
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
获取中断状态标志位
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
清除中断状态标志位
六、串口配置一般步骤
1.串口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
2.串口复位(不是必须的)
USART_DeInit();
3.GPIO模式设置
对GPIO口输入输出的设置
4.串口初始化设置
USART_Init(USART1, &USART_InitStructure);
5.开启中断并且初始化NVIC
NVIC_Init();
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
6.使能串口
USART_Cmd(USART1, ENABLE);
7.编写中断处理函数
void USART1_IRQHandler(void)
8.串口数据收发
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
9.串口传输状态获取
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
七、串口初始化程序编写
void uart_init(u32 bound){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
//GPIOA.9发送GPIO配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIOA.10接收GPIO配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// NVIC 配置(在主函数中需要对NVIC设置分组)
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//对USART配置波特率、停止位、校验位等配置
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能接收中断
USART_Cmd(USART1, ENABLE); //使能串口
}