STM32F103 UART通信讲解

一、串行通信的通信方式

1.同步通信:带时钟同步信号传输,有一根线是同步时钟。例如SPI(全双功)、IIC(半双工)通信接口

2.异步通信:不带时钟同步信号,必须约定好波特率。例如UART(全双功)

二、STM32的串口通信接口

UART:通用异步收发器。

USART:通用同步异步收发器。

STM32F10x系列包含3个USART和2个UART。

STM32F103 UART通信讲解_第1张图片

都是TTL电平交叉相连即可

 

STM32F103 UART通信讲解_第2张图片

与PC机可以使用USB-TTL进行通信。

三、通信引脚

STM32F103 UART通信讲解_第3张图片

四、常用串口相关寄存器

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);                    //使能串口

}

你可能感兴趣的:(STM32)