[STM32F1] STM32F103 UART通信讲解

[复制链接]
815|12
 楼主| 慢醇 发表于 2022-8-22 17:13 | 显示全部楼层 |阅读模式

一、串行通信的通信方式

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

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

二、STM32的串口通信接口

UART:通用异步收发器。

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

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3ODY4ODU2,size_16,color_FFFFFF,t_70.jpg

都是TTL电平交叉相连即可


watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3ODY4ODU2,size_16,color_FFFFFF,t_70.jpg

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



评论

———————————————— 版权声明:本文为CSDN博主「MC_J」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37868856/article/details/91400046  发表于 2022-8-22 22:54
 楼主| 慢醇 发表于 2022-8-22 17:49 | 显示全部楼层
三、通信引脚
347406303511550bb8.png
 楼主| 慢醇 发表于 2022-8-22 17:50 | 显示全部楼层
四、常用串口相关寄存器

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的波特率对应的寄存器值。
 楼主| 慢醇 发表于 2022-8-22 19:25 | 显示全部楼层
五、串口操作相关库函数

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);

清除中断状态标志位
 楼主| 慢醇 发表于 2022-8-22 22:55 | 显示全部楼层
六、串口配置一般步骤

1.串口时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);  
 楼主| 慢醇 发表于 2022-8-22 22:56 | 显示全部楼层
2.串口复位(不是必须的)

USART_DeInit();

3.GPIO模式设置

对GPIO口输入输出的设置

4.串口初始化设置

USART_Init(USART1, &USART_InitStructure);

5.开启中断并且初始化NVIC

NVIC_Init();

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 楼主| 慢醇 发表于 2022-8-22 23:15 | 显示全部楼层
6.使能串口

USART_Cmd(USART1, ENABLE);  
 楼主| 慢醇 发表于 2022-8-22 23:17 | 显示全部楼层
7.编写中断处理函数

void USART1_IRQHandler(void)  
 楼主| 慢醇 发表于 2022-8-22 23:20 | 显示全部楼层
8.串口数据收发

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
 楼主| 慢醇 发表于 2022-8-22 23:23 | 显示全部楼层
9.串口传输状态获取

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
 楼主| 慢醇 发表于 2022-8-22 23:24 | 显示全部楼层
七、串口初始化程序编写

  1. void uart_init(u32 bound){

  2.     GPIO_InitTypeDef GPIO_InitStructure;

  3.     USART_InitTypeDef USART_InitStructure;

  4.     NVIC_InitTypeDef NVIC_InitStructure;

  5.      

  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);   

  7.   

  8.     //GPIOA.9发送GPIO配置

  9.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  10.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  12.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  13.    

  14.   //GPIOA.10接收GPIO配置

  15.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

  16.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  17.   GPIO_Init(GPIOA, &GPIO_InitStructure);



  18.   // NVIC 配置(在主函数中需要对NVIC设置分组)

  19.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  20.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;

  21.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        

  22.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           

  23.     NVIC_Init(&NVIC_InitStructure);   

  24.   

  25.    //对USART配置波特率、停止位、校验位等配置

  26.     USART_InitStructure.USART_BaudRate = bound;

  27.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  28.     USART_InitStructure.USART_StopBits = USART_StopBits_1;

  29.     USART_InitStructure.USART_Parity = USART_Parity_No;

  30.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  31.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   

  32.     USART_Init(USART1, &USART_InitStructure);



  33.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能接收中断

  34.     USART_Cmd(USART1, ENABLE);                    //使能串口
七毛钱 发表于 2022-8-23 11:09 来自手机 | 显示全部楼层
感谢分享,学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

1382

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部