打印
[STM32F1]

STM32F103 UART通信讲解

[复制链接]
418|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
慢醇|  楼主 | 2022-8-22 17:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

一、串行通信的通信方式

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

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

二、STM32的串口通信接口

UART:通用异步收发器。

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

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

都是TTL电平交叉相连即可


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



使用特权

评论回复
评论
慢醇 2022-8-22 22:54 回复TA
———————————————— 版权声明:本文为CSDN博主「MC_J」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37868856/article/details/91400046 
沙发
慢醇|  楼主 | 2022-8-22 17:49 | 只看该作者
三、通信引脚

使用特权

评论回复
板凳
慢醇|  楼主 | 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);

清除中断状态标志位

使用特权

评论回复
5
慢醇|  楼主 | 2022-8-22 22:55 | 只看该作者
六、串口配置一般步骤

1.串口时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);  

使用特权

评论回复
6
慢醇|  楼主 | 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);

使用特权

评论回复
7
慢醇|  楼主 | 2022-8-22 23:15 | 只看该作者
6.使能串口

USART_Cmd(USART1, ENABLE);  

使用特权

评论回复
8
慢醇|  楼主 | 2022-8-22 23:17 | 只看该作者
7.编写中断处理函数

void USART1_IRQHandler(void)  

使用特权

评论回复
9
慢醇|  楼主 | 2022-8-22 23:20 | 只看该作者
8.串口数据收发

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

使用特权

评论回复
10
慢醇|  楼主 | 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);

使用特权

评论回复
11
慢醇|  楼主 | 2022-8-22 23:24 | 只看该作者
七、串口初始化程序编写

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

使用特权

评论回复
12
七毛钱| | 2022-8-23 11:09 | 只看该作者
感谢分享,学习学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

116

主题

1186

帖子

4

粉丝