嵌入式(3串口编程)

USARTx串口和管脚

串口比较

MCS51单片机 C8051F41X系列单片机 C8051F02X系列单片机 ARM9 S3C2410 STM32F103Cx单片机
有1个UART(通用异步接收和发送器) 有1个通用异步串行发送接收端口UART0 有2个通用异步串行发送接收端口UART0,UART1 有3个UART(通用异步接收和发送器) 有3个USART(通用同步/异步接收和发送器)

串行通信的分类

  • 同步串行通信:以数据块为单位进行传送
  • 异步串行通信:以字符为单位进行传送

串行通信的制式

串行通信的制式分三种:①单工(simplex)②半双工(half duplex)③全双工(full duplex)。若只有一根线用于数据通信,那只能是半双工;必须有二根线用于数据通信,才能实现全双工。

STM32F103Cx拥有的3个USART,它们都可以“全双工”通信

嵌入式(3串口编程)_第1张图片

STM32单片机的USART串口:采用分数波特率发生器,串行发送、接收数据的最高速率=72M/16=4.5Mb/s。USART1接口通信速率可达4.5兆位/秒,其他接口的通信速率可达2.25兆位/秒。

波特率:是一个衡量通信速度的参数。如果数据不压缩,它表示每秒钟传送的位数,单位是bps。(在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数 称为 码元传输速率,简称波特率。其单位是波特)

PC机串口和单片机串口相连接

电平转换芯片:MAX232和MAX3232

MAX232 MAX3232
供电 5V 5V或3.3V
功耗 功耗较大,供电电压5V时,耗电5mA 功耗较小,供电电压5V或3.3V时,耗电 0.3mA
外接电容 4个1uF电容 4个0.1uF电容
  • PC机 与 STM32单片机 的连接
    • 连线:要完成串口发送、接收,只需要TXD、RXD、GND三根线
    • 连接方法:两者的TXD和RXD交叉相连
    • 交叉方法:①通过串口(连接)线交叉,②在电路板上交叉(这时的串口(连接)线用直通线)

USARTx串口配置

USARTx串口定义

每个USART口共有7个设置寄存器

寄存器 描述 偏移地址 复位值
USART_SR 一个状态寄存器 0x00 0x00C0
USART_DR 一个数据寄存器,它是由两个寄存器组成的,一个给发送用(发送寄存器 TDR),一个给接收用(接收寄存器 RDR) 0x04 不确定
USART_BRR 一个波特率寄存器 0x08 0x0000
USART_CR1 一个控制寄存器1 0x0C 0x0000
USART_CR2 一个控制寄存器2 0x10 0x0000
USART_CR3 一个控制寄存器3 0x14 0x0000
USART_GTPR 一个保护时间和预分频寄存器 0x18 0x0000

USART_InitTypeDef

/*
USART_InitTypeDef   
结构体定义了串口参数,用于串口参数设置
在文件“stm32f10x_usart.h”中定义
*/
/* USART Init Structure definition */
typedef struct
{
  u32 USART_BaudRate;  // 用于设置USART传输的波特率
  u16 USART_WordLength;  // 用于设置一个帧中,传输或接收到的数据位数目
  u16 USART_StopBits;  // 用于设置所发送的数据的停止位数目
  u16 USART_Parity;  // 用于设置奇偶校验模式
  u16 USART_Mode;  // 用于使能或者失能串口发送和接收模式
  u16 USART_HardwareFlowControl;  // 用于使能或失能硬件流控制模式
} USART_InitTypeDef;

参数设置选择

USART_BaudRate

嵌入式(3串口编程)_第2张图片

USART_WordLength

USART_WordLength 描述
USART_WordLength_8b 8位数据(默认)
USART_WordLength_9b 9位数据

USART_StopBits

USART_StopBits 描述
USART_StopBits_1 在帧结尾传输1个停止位(默认)
USART_StopBits_0.5 在帧结尾传输0.5个停止位
USART_StopBits_2 在帧结尾传输2个停止位
USART_StopBits_1.5 在帧结尾传输1.5个停止位

USART_Parity

USART_Parity 描述
USART_Parity_No 奇偶失能(默认)
USART_Parity_Even 偶模式
USART_Parity_Odd 奇模式

奇偶校验一旦使能,在发送数据的MSB位插入经计算的奇偶位(字长是9位时的第9位,字长是8位时的第8位)。

USART_HardwareFlowControl

USART_HardwareFlowControl 描述
USART_HardwareFlowControl_None 硬件流控制失能(默认)
USART_HardwareFlowControl_RTS 发送请求RTS使能
USART_HardwareFlowControl_CTS 清除发送CTS使能
USART_HardwareFlowControl_RTS_CTS RTS和CTS使能

USART_Mode

USART_Mode 描述
USART_Mode_Tx 发送使能
USART_Mode_Rx 接收使能

USART_Init函数

USART_Init:根据USART_InitTypeDef中指定的参数,初始化外设USARTx串口

// 例如:初始化USART1串口
USART_Init(USART1, &USART_InitStructure);

USART_Cmd

USART_Cmd:使能USARTx外设 (或 失能USARTx外设),使能后,让外部管脚通过多路交叉开关与对应的USARTx相连。

USART_Cmd(USARTx, [ENABLE, DISABLE]);  // ENABLE使能  DISABLE失能

发送和接收数据

// 以发送一串字符为例,时钟使能和初始化自行设置
int main()
{
    u16 i;
    u8 a[] = "abcdef";
    for(i=0; a[i]!='\0'; i++)
    {
        USART_SendData(USARTx,a[i]); // 发送数据
        while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET); // 等待发送完成
    }
}

// 接收程序如下,以下程序只接收一个字节
int main()
{
    u8 i;
    while(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==RESET); // 等待有数据发送来
    i = USART_ReceiveData(USARTx); // 数据发送来了保存在变量i中
}

脑图

嵌入式(3串口编程)_第3张图片

有需要的自取



串口编程这一块还是比较简单的,如果有记录不完整或则错误的地方,欢迎反馈,我会积极汲取大家的宝贵建议。现在STM32编程的整体框架结构我心里已经有一条比较清晰的轮廓了,多编程,多实践就好了,大家一起加油↖(^ω^)↗

你可能感兴趣的:(嵌入式)