STM32
直播中

李伟

7年用户 1503经验值
私信 关注
[问答]

怎样去设计一种STM32的串口通信接口呢

串行通信的通信方式有哪几种?
怎样去设计一种STM32的串口通信接口呢?

回帖(1)

陈福蓓

2021-12-13 15:09:17
一、串行通信的通信方式
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);                    //使能串口
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分