STM32F4学习笔记7——USART Part2

发布者:吾道明亮最新更新时间:2017-09-20 来源: eefocus关键字:STM32F4  USART 手机看文章 扫描二维码
随时随地手机看文章

硬件流控制 
使用 nCTS 输入和 nRTS 输出可以控制 2 个器件间的串行数据流。如图显示了在这种模式 下如何连接 2 个器件: 
两个USART间的硬件流控制 
分别向 USART_CR3 寄存器中的 RTSE 位和 CTSE 位写入 1,可以分别使能 RTS 和 CTS 流 控制。

RTS 流控制 
如果使能 RTS 流控制 (RTSE=1),只要 USART 接收器准备好接收新数据,便会将 nRTS 变 为有效(连接到低电平)。当接收寄存器已满时,会将 nRTS 变为无效,表明发送过程会在 当前帧结束后停止。下图图显示了在使能 RTS 流控制的情况下进行通信的示例。 
RTS流控制

CTS 流控制 
如果使能 CTS 流控制 (CTSE=1),则发送器会在发送下一帧前检查 nCTS。如果 nCTS 有效 (连接到低电平),则会发送下一数据(假设数据已准备好发送,即 TXE=0);否则不会进 行发送。如果在发送过程中 nCTS 变为无效,则当前发送完成之后,发送器停止。 
当 CTSE=1 时,只要 nCTS 发生变化,CTSIF 状态位便会由硬件自动置 1。这指示接收器是 否已准备好进行通信。如果 USART_CR3 寄存器中的 CTSIE 位置 1,则会产生中断。下图 显示了在使能 CTS 流控制的情况下进行通信的示例。 
CTS流控制 
注意:停止帧的特殊行为:当使能 CTS 流后,发送器发送停止信号时将不检查 nCTS 输入状态。

USART中断 
USART中断请求 
USART 中断事件被连接到相同的中断向量(请参见图 270)。 
● 发送期间:发送完成、清除以发送或发送数据寄存器为空中断。 
● 接收期间:空闲线路检测、上溢错误、接收数据寄存器不为空、奇偶校验错误、LIN 断路检测、噪声标志(仅限多缓冲区通信)和帧错误(仅限多缓冲区通信) 
如果相应的使能控制位置 1,则这些事件会生成中断。 
USART中断映射图

USART的配置模式 
USART配置模式

使用 DMA 进行连续通信 
使用 DMA 进行发送 
将 USART_CR3 寄存器中的 DMAT 位置 1 可以使能 DMA 模式进行发送。当 TXE 位置 1 时, 可将数据从 SRAM 区(通过 DMA 配置,参见 DMA 部分)加载到 USART_DR 寄存器。要 映射一个 DMA 通道以进行 USART 发送,请按以下步骤操作(x 表示通道编号): 
1.在 DMA 控制寄存器中写入 USART_DR 寄存器地址,将其配置为传输的目标地址。每次 发生 TXE 事件后,数据都会从存储器移动到此地址。 
2. 在 DMA 控制寄存器中写入存储器地址,将其配置为传输的源地址。每次发生 TXE 事件 后,数据都会从这个存储区域加载到 USART_DR 寄存器中。 
3. 在 DMA 控制寄存器中配置要传输的总字节数。 
4. 在 DMA 寄存器中配置通道优先级 
5. 根据应用的需求,在完成一半或全部传输后产生 DMA 中断。 
6. 向 SR 寄存器中的 TC 位写入 0,将其清零。 
7. 在 DMA 寄存器中激活该通道。 
当达到在 DMA 控制器中设置的数据传输量时,DMA 控制器会在 DMA 通道的中断向量上产 生一个中断。 
在发送模式下,DMA 对所有要发送的数据执行了写操作(DMA_ISR 寄存器中的 TCIF 标志 置 1)后,可以对 TC 标志进行监视,以确保 USART 通信已完成。在禁止 USART 或进入 停止模式前必须执行此步骤,以避免损坏最后一次发送。软件必须等待直到 TC=1。TC 标志 在所有数据发送期间都必须保持清零状态,然后在最后一帧发送结束后由硬件置 1。 
使用DMA进行发送

使用 DMA 进行接收 
将 USART_CR3 寄存器中的 DMAR 位置 1 可以使能 DMA 模式进行接收。接收数据字节 时,数据会从 USART_DR 寄存器加载到 SRAM 区域中(通过 DMA 配置,参见 DMA 规 范)。要映射一个 DMA 通道以进行 USART 接收,请按以下步骤操作: 
1.在 DMA 控制寄存器中写入 USART_DR 寄存器地址,将其配置为传输的源地址。每次发 生 RXNE 事件后,数据都会从此地址移动到存储器。 
2. 在 DMA 控制寄存器中写入存储器地址,将其配置为传输的目标地址。每次发生 RXNE 事 件后,数据都会从 USART_DR 寄存器加载到此存储区。 
3. 在 DMA 控制寄存器中配置要传输的总字节数。 
4. 在 DMA 控制寄存器中配置通道优先级。 
5. 根据应用的需求,在完成一半或全部传输后产生中断。 
6. 在 DMA 控制寄存器中激活该通道。 
当达到在 DMA 控制器中设置的数据传输量时,DMA 控制器会在 DMA 通道的中断向量上产 生一个中断。在中断子程序中,USART_CR3 寄存器中的 DMAR 位应由软件清零。 
注意:如果 DMA 用于接收,则不要使能 RXNEIE 位。 
使用DMA进行接收 
多缓冲区通信中的错误标志和中断生成 
在多缓冲区通信中,如果事务中发生任何错误,都会在当前字节后放置错误标志。如果中断使能置 1,则会产生中断。在单字节接收过程中,与 RXNE 一同置位的帧错误、上溢错误和噪声标志具有单独的错误标志中断使能位(USART_CR3 寄存器中的 EIE 位);如果该位置 1, 则会因其中任何一个错误而在当前字节后产生中断。

STM32F4库 
串口配置流程 
使能USART时钟 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE);//1和6USART 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE);//2、3、4、5USART 
使能GPIO 
RCC_AHB1PeriphClockCmd();//IO可以是TX,RX,CTS和SCLK 
设置外设的复用功能 
1、GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);//将引脚连接到相应的复用功能 
2、通过GPIO_InitStruct->GPIO_Mode_AF配置引脚到相应复用功能 
3、通过GPIO_PuPd,GPIO_OType和GPIO_Speed选择IO的上下拉,IO类型和IO速度 
4、(异步)通过USART_Init()配置Baud Rate,Word Length,Stop Bit,Parity,硬件数据了,模式(发送接收)。 
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); 
5、对于同步模式通过USART_ClockInit()使能时钟和polarity,phase和last bit 
void USART_StructInit(USART_InitTypeDef* USART_InitStruct); 
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct); 
void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct); 
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); 
void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler); 
void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState); 
void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState); 
6、如果需要使能中断,那么使能NVIC并通不过函数USART_ITConfig使能相应中断位 
7、当使用DMA模式时 
——通过DMA_Init()函数配置DMA 
——通过函数USART_Cmd()激活需要带的通道 
8、通过USART_Cmd()使能USART 
9、当使用DMA时,通过DMA_Cmd()使能DMA 
10、Multi-Processor,LIN,half-duplex,Smartcard,IrDA详见M4权威指南

为了获得更高的波特率,可以通过函数 USART_OverSampling8Cmd()设置 8倍的过采样(默认是 16 倍的过采样),这个函数 需要在时钟RCC_APBxPeriphClockCmd()之后, USART_Init() 之前调用。 
void USART_DeInit(USART_TypeDef* USARTx)通过复位时钟实现

数据传输函数 
通过函数USART_ReceiveData()来读取寄存器USART_DR的数值这个数据来自RDR缓存器;通过函数USART_SendData()实现对寄存器USART_DR的写操作,数据将被存储到TDR缓存器上。 
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) 

/* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_DATA(Data));

/* Transmit Data */ 
USARTx->DR = (Data & (uint16_t)0x01FF); 
}

uint16_t USART_ReceiveData(USART_TypeDef* USARTx) 

/* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx));

/* Receive Data */

return (uint16_t)(USARTx->DR & (uint16_t)0x01FF); 
}

DMA传输和管理函数 
函数USART_DMACmd用于使能DMA的发送和接收请求 
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState) 

/* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_DMAREQ(USART_DMAReq)); assert_param(IS_FUNCTIONAL_STATE(NewState));

if (NewState != DISABLE) 

/* Enable the DMA transfer for selected requests by setting the DMAT and/or DMAR bits in the USART CR3 register */ 
USARTx->CR3 |= USART_DMAReq; 

else 

/* Disable the DMA transfer for selected requests by clearing the DMAT and/or DMAR bits in the USART CR3 register */ 
USARTx->CR3 &= (uint16_t)~USART_DMAReq; 

}

中断标志管理函数 
查询模式 
(#) USART_FLAG_TXE : to indicate the status of the transmit buffer register 
(#) USART_FLAG_RXNE : to indicate the status of the receive buffer register 
(#) USART_FLAG_TC : to indicate the status of the transmit operation (#) USART_FLAG_IDLE : to indicate the status of the Idle Line 
(#) USART_FLAG_CTS : to indicate the status of the nCTS input 
(#) USART_FLAG_LBD : to indicate the status of the LIN break detection (#) USART_FLAG_NE : to indicate if a noise error occur 
(#) USART_FLAG_FE : to indicate if a frame error occur 
(#) USART_FLAG_PE : to indicate if a parity error occur 
(#) USART_FLAG_ORE : to indicate if an Overrun error occur 
在查询模式,建议使用下面两个函数: 
(+) FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); 
(+) void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);

中断模式 
挂起标志Pending Bits: 
(##) USART_IT_TXE : to indicate the status of the transmit buffer register 
(##) USART_IT_RXNE : to indicate the status of the receive buffer register 
(##) USART_IT_TC : to indicate the status of the transmit operation (##) USART_IT_IDLE : to indicate the status of the Idle Line 
(##) USART_IT_LBD : to indicate the status of the LIN break detection (##) USART_IT_NE : to indicate if a noise error occur 
(##) USART_IT_FE : to indicate if a frame error occur 
(##) USART_IT_PE : to indicate if a parity error occur 
(##) USART_IT_ORE : to indicate if an Overrun error occur 
中断源Interrupt Source: 
(##) USART_IT_TXE : specifies the interrupt source for the Tx buffer empty interrupt. 
(##) USART_IT_RXNE : specifies the interrupt source for the Rx buffer not empty interrupt. 
(##) USART_IT_TC : specifies the interrupt source for the Transmit complete interrupt. 
(##) USART_IT_IDLE : specifies the interrupt source for the Idle Line interrupt. 
(##) USART_IT_CTS : specifies the interrupt source for the CTS interrupt. 
(##) USART_IT_LBD : specifies the interrupt source for the LIN break detection interrupt. 
(##) USART_IT_PE : specifies the interrupt source for the parity error interrupt. 
(##) USART_IT_ERR : specifies the interrupt source for the errors interrupt. 
上面的标志和中断源可以在函数组合使用 
在这个模式下,建议使用下面三个函数 
(+) void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); 
(+) ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); 
(+) void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

DMA模式 
USART在DMA模式下有两个请求需要管理,一个是发送请求,另一个是接收请求 
(#) USART_DMAReq_Tx: specifies the Tx buffer DMA transfer request (#) USART_DMAReq_Rx: specifies the Rx buffer DMA transfer request 
在这个模式下建议使用面函数 
(+) void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);

void USART_ITConfig() 
这个函数用于使能相关的 8个中断源,就是前面介绍的那 8个。

FlagStatus USART_GetFlagStatus()

void USART_ClearFlag() 
根据前面的介绍,这两个配套使用,主要于查询模式对中断有另外函数两个函数 
ITStatus USART_GetITStatus() 
void USART_ClearITPendingBit()


关键字:STM32F4  USART 引用地址:STM32F4学习笔记7——USART Part2

上一篇:STM32F4学习笔记8——NIVC向量中断
下一篇:STM32F4学习笔记6——USART Part1

推荐阅读最新更新时间:2024-03-16 15:37

e络盟使STM32F4 Discovery MCU开发套件实现无线网络连接
e络盟近日宣布提供用于意法半导体(ST)STM32F4 Discovery微控制器开发套件的Discover Wi-Fi开发板,以实现无线连接。Discover Wi-Fi开发板采用Murata SN8200无线网络控制器模块,可提供板载Wi-Fi功能及网络软件栈,是各种高性能、低功耗无线解决方案的完美选择。 Discover Wi-Fi开发板插入意法半导体的STM32F4 Discovery套件后,借助UART和SPI命令接口以及工作频段在2.4 GHz的 IEEE802.11b/g/n标准可提供一系列的广泛功能。Discover Wi-Fi开发板还配备源代码、文档及软件演示,有利于快速启动无线网络项目。 亚太区用户现可
[单片机]
STM32开发笔记47:STM32F4+DP83848以太网通信指南系列(一)
单片机型号:STM32F407VGT 本章为系列指南第一章,主要是介绍一下项目思路,并且尽可能列出从零开始着手开发这个项目过程中,所需要理解的各类知识点,关于这些知识点,如果需要更详细的介绍,请列为看官自行百度谷歌。 STM32F407简介 STM32F407主频168MHz,主频这个数值的意义可以这么理解:每秒执行168,000,000步简单指令,也就是每毫秒168,000次,每微秒168次。我们工业以太网进入实时通信后的数据传输周期大概每2ms交互4次,每次60个Byte,最差的算法复杂度计算下来需要每毫秒4 / 2 * 60byte = 120步(事实上用不了这么多步),而这颗STM32F07的芯片提供每毫秒168,00
[单片机]
STM32开发笔记47:<font color='red'>STM32F4</font>+DP83848以太网通信指南系列(一)
avr单片机USART串口通讯初始化配置及说明
avr atmega16 单片机通用同步和异步串行接收器和转发器 (USART) 是一个高度灵活的串行通讯设备,其工作模式及其初始化,寄存器说明如下。 //*****************************USART 控制和状态寄存器A(UCSRA)******************************** /*USART 控制和状态寄存器A(UCSRA) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RXC TXC UDRE FE DOR PE U2X MPCM RXC: USART 接收结束
[单片机]
stm32f407】独立看门狗 iwdog
独立看门狗 STM32F4的独立看门狗由内部专门的32Khz低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的32Khz,而是在15~47Khz之间的一个可变化的时钟,只是我们在估算的时候,以32Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。独立看门狗有几个寄存器与我们这节相关,我们分别介绍这几个寄存器,首先是关键字寄存器IWDG_KR 在关键字寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其 复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号
[单片机]
【<font color='red'>stm32f4</font>07】独立看门狗 iwdog
第33章 STM32F429的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)
33.1 初学者重要提示 学习本章节前,务必优先学习第31章。 对于DAC8562和DAC8563,教程中不做区分,因为DAC8562和DAC8563完全兼容,区别仅仅在于CLR引脚有效时,DAC8562数据设置为0, DAC8563数据设置为32767。 本章涉及到的知识点比较多,需要大家掌握STM32H7的SPI , DMA,TIM,DMAMUX和DAC8563的一些细节用法。 我们的H7板子配套了SPI + DMA方式控制DAC856X,而F4系列不方便实现,确切的说是可以用DMA方式,但是不方便控制写入速度,需要借助定时器中断进行更新,实用价值不是很大。 DAC856X数据手册,模块原理图和接线图都已经放到
[单片机]
第33章 <font color='red'>STM32F4</font>29的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)
STM32F4学习笔记之GPIO(使用固件库)
1.使能GPIO的AHB时钟,使用函数: RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); 2.配置GPIO工作模式用GPIO_Init()函数 数据类型说明 typedef struct { uint32_t GPIO_Pin; //引脚配置 GPIOMode_TypeDef GPIO_Mode; //GPIO_Mode_IN(输入),GPIO_Mode_OUT(输出),GPIO_Mode_AF(备用),GPIO_Mode_AN(模拟) GPIOSpeed_TypeDef GPIO_Speed;// GPIO_Speed_2MHz,GPIO_Spe
[单片机]
STM32F4跑马灯实验
硬件连接:LED分别接在PF9和PF10脚,且低电平点亮led; 用到的库函数: 头文件 源文件对应的都有头文件,需添加到工程; 源文件(lib目录) misc.c(一般我们都不会删掉这个头文件) stm32f4xx_rcc.c(所有的工程都会用到,涉及到时钟的使能) stm32f4xx_gpio.c stm32f4xx_usart.c(正点原子程序需要) led跑马灯函数实现流程 使能IO口的时钟。(调用RCC_AB1PeriphClockCmd(); 不同的外设调用的时钟使能函数可能不一样;) 初始化IO口的模式; 操作IO口; main.c文件 /**************** 实现功能:实现LED
[单片机]
STM32F429 >> 12. I²C 通讯(Code)
硬件I²C 在此我们使用硬件I²C 通讯,即使用I²C 外设帮助我们控制数据的发送和时钟的规律跳变。 若是使用模拟I²C 即是51 风格的编程,用程序手动控制两根总线的数据和时钟变化。 编程指南 初始化I²C GPIO引脚; 初始化I²C; 根据事件相应顺序编写相应的读/写操作程序; 编写页写入程序;(非必要) 编写缓冲区buffer 写入程序。(非必要) bsp_i2c.h /** ****************************************************************************** * @file bsp_i2c.h * @author Waao * @ver
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved