STM32学习笔记(八)USART(Universal synchronous asynchronous receiver transmitter)

通用同步异步收发器

USART通讯协议

同步通讯 和 异步通讯

根据通讯的数据同步方式,又分为同步和异步两种,可以根据通讯过程中是否有使用到时钟信号进行简单的区分。

在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据,见下图。通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。

同步通讯

在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,见下图,某些通讯中还需要双方约定数据的传输速率,以便更好地同步 。

异步通讯

在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。

USART寄存器

USART框图
  • 状态寄存器 --- SR(Status register):存放各种状态的标志位;

    • 复位值:0x0000 00C0
  • 数据寄存器 --- DR(Data register):存放发送或接收的数据;

    • 复位值:未定义
  • 波特比率寄存器 --- BRR(Baud rate register):储存USART分频器除法因子,需要使用者赋值;

    • 作用---储存USART分配器除法因子:低16位有效;其中高12位存储整数部分,低4位存储小数部分;除法因子与波特率的关系如图所示;


      波特率与除法因子的换算式
    • 复位值:0x0000 0000

  • 控制寄存器1 --- CR1(Control register 1):USART使能、发送接收使能、校验、字长设定;

    • 复位值:0x0000 0000
  • 控制寄存器2 --- CR2(Control register 2):时钟与停止位设定;

    • 复位值:0x0000 0000
  • 控制寄存器3 --- CR3(Control register 3):CTS、RTS、DMA、智能卡、半双工、红外模式使能;

    • 复位值:0x0000 0000
  • 保护时间和预分频寄存器 --- GTPR(Guard time and prescaler register):保护时间值与预分频值;

    • 复位值:0x0000 0000

常用USART固件库函数(stm32f10x_usart.h)

使用USART时仍然要初始化GPIO口,并且不需要打开AFIO(因为可以直接通过RCC寄存器使能USART时钟)。
发送端(Tx)设置为 复用模式,接收端(Rx)设置为 输入模式

USART初始化函数 --- USART_Init

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
  • USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
  • USART_InitStructUSART_InitTypeDef 结构体
    • USART_BaudRate:串口的波特率;
    • USART_WordLength:字长,可选8bit或9bit;
    • USART_StopBits:停止位的长度,可选0.5、1、1.5、2位;
    • USART_Parity:校验的方式,可选无校验、奇校验、偶校验;
    • USART_HardwareFlowControl:是否启动硬件流控制,一般不启动,即 None;(硬件流控制:在半双工情况下,当接收端数据处理不过来或要进行收发转换时,硬件自动发出不再接收/发送数据的信号)
    • USART_Mode:工作模式,选择是接收数据(Rx)或者发送数据(Tx),或者均可(Rx | Tx);
  • 示例:
//创建GPIO初始化结构体
GPIO_InitTypeDef GPIO_InitStructure;
//创建USART初始化结构体
USART_InitTypeDef USART_InitStructure;

//打开USART1对应GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//打开USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//备注:必须先时钟使能再配置
//将串口 USART1-Tx 的 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);
//将串口 USART-Rx 的 GPIO 设置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//配置串口工作参数
//配置波特率为115200
USART_InitStructure.USART_BaudRate = 115200;
//配置 针数据字长
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使能函数 --- USART_Cmd

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
  • USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
  • NewState:使能或关闭,ENABLE、DISABLE;
  • 示例:
//使能USART1
USART_Cmd(USART1, ENABLE);

USART中断使能函数 --- USART_ITConfig

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
  • USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;

  • USART_IT:开启的中断类型;

    USART_IT

  • NewState:使能或关闭,ENABLE、DISABLE;

  • 示例:

//使能USART1的接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)

USART发送数据函数 --- USART_SendData

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
  • USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
  • DATA:需要发送的16位数据;
  • 示例:
uint32_t Data = 0x10;
//向 USART1 发送 Data
USART_SendData(USART1, Data);
//等待发送完成
while( USART_GetFlagStatus(USARTx,USART_FLAG_TXE) != SET );

USART获取标志位函数 --- USART_GetFlagStatus

typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
  • USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;
  • USART_FLAG:对应的标志位;
    标志位

USART接收数据函数 --- USART_ReceiveData

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
  • USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;

USART读取中断标志位函数 --- USART_GetITStatus

typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
  • USARTx:选择串口端口,可以为 USART1、USART2、USART3、UART4、UART5;

  • USART_IT:对应的中断标志位;

    中断标志位

  • 示例:

//当接收寄存器非空时
if( USART_GetITStatus(DEBUG_USART, USART_IT_RXNE) != RESET )
{
  //处理程序
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容