STM32F4学习笔记7——USART Part2

硬件流控制

使用 nCTS 输入和 nRTS 输出可以控制 2 个器件间的串行数据流。如图显示了在这种模式 下如何连接 2 个器件:

分别向 USART_CR3 寄存器中的 RTSE 位和 CTSE 位写入 1,可以分别使能 RTS 和 CTS 流 控制。

RTS 流控制

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

CTS 流控制

如果使能 CTS 流控制 (CTSE=1),则发送器会在发送下一帧前检查 nCTS。如果 nCTS 有效 (连接到低电平),则会发送下一数据(假设数据已准备好发送,即 TXE=0);否则不会进 行发送。如果在发送过程中 nCTS 变为无效,则当前发送完成之后,发送器停止。

当 CTSE=1 时,只要 nCTS 发生变化,CTSIF 状态位便会由硬件自动置 1。这指示接收器是 否已准备好进行通信。如果 USART_CR3 寄存器中的 CTSIE 位置 1,则会产生中断。下图 显示了在使能 CTS 流控制的情况下进行通信的示例。

注意:停止帧的特殊行为:当使能 CTS 流后,发送器发送停止信号时将不检查 nCTS 输入状态。

USART中断

USART 中断事件被连接到相同的中断向量(请参见图 270)。

● 发送期间:发送完成、清除以发送或发送数据寄存器为空中断。

● 接收期间:空闲线路检测、上溢错误、接收数据寄存器不为空、奇偶校验错误、LIN 断路检测、噪声标志(仅限多缓冲区通信)和帧错误(仅限多缓冲区通信)

如果相应的使能控制位置 1,则这些事件会生成中断。

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 进行接收

将 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 位。

多缓冲区通信中的错误标志和中断生成

在多缓冲区通信中,如果事务中发生任何错误,都会在当前字节后放置错误标志。如果中断使能置 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()

时间: 2024-10-24 14:25:46

STM32F4学习笔记7——USART Part2的相关文章

STM32F4学习笔记(一)

新建工程 由于使用固件库开发的高效便捷,我选择了使用STM32F4标准外设库.开发板的芯片为STM32F429XX,其他的可根据相关情况进行变化. 在标准固件库中,存在在CMSIS和STM32F4xx_StdPeriph_Driver两个文件夹.在工程中新建一个文件夹Drivers,在此目录中再新建两个目录Inc和Src,分别用于 保存头文件和源文件.将STM32F4xx_StdPeriph_Driver目录下的头文件和源文件,分别拷贝到Drivers目录下的录中.再将CMSIS目录中的需要的文

STM32F4学习笔记2——时钟与复位系统

STM32F4采用了三种不同的时钟用来驱动系统时钟(SYSCLK) ·HSI振荡器时钟(内部时钟) ·HSE振荡器时钟(外部时钟) ·PLL时钟(锁相环时钟) 这些设备有以下两种二级时钟源 ·32kHz低速内部RC,可用于驱动独立看门狗和通过程序选择驱动RTC.RTC用于从停机/待机模式下自动唤醒系统. ·32.768kHz低速外部晶振也可以用来通过程序选择驱动RTC(RTCCLK). AHB总线最高支持168MHz的时钟,通过AHB总线分频APB2最高支持84MHz,APB1最高支持42MHz

STM32F4学习笔记10——RTC实时时钟

RTC实时时钟 实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器.RTC 提供一个日历时钟.两个可编程 闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志.RTC 还包含用于管理低功耗模 式的自动唤醒单元. 两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒.分钟.小时(12 或 24 小时制).星 期几.日期.月份和年份.此外,还可提供二进制格式的亚秒值. 系统可以自动将月份的天数补偿为 28.29(闰年).30 和 31 天.并且还可以进行夏令时 补偿. 其它 32 位寄

STM32学习笔记——USART串口(向原子哥和火哥学习)

一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. STM32 的串口资源相当丰富的,功能也相当强劲.STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器,支持同步单向通信和半双工单线通信,支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作.它还允许多处理器通信.

js便签笔记(12)——浏览TOM大叔博客的学习笔记 part2

1. 前言 昨天写了<js便签笔记(11)——浏览TOM大叔博客的学习笔记 part1>,简单记录了几个问题.part1的重点还是在于最后那个循环创建函数的问题,也就是多个子函数公用一个闭包数据的问题.如果觉得有兴趣,可以再重新翻出来看看. 今天继续把剩下的问题写完. 2. 作用域链 学js的人,即使初级入门的也都知道“原型链”,但是“作用域链”,可能好多人没有听说过.大部分人都知道或者听说过“闭包”,但是可能有好多人不知道闭包其实和作用域链有莫大的联系.如果理解闭包不从作用域链开始理解,那么

Hadoop入门学习笔记---part4

紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操作,前提是按照<Hadoop入门学习笔记---part2>中的已经在虚拟机中搭建好了Hadoop伪分布环境:并且确定现在linux操作系统中hadoop的几个进程已经完全启动了. 好了,废话不多说!实际的例子走起. 在myeclipse中新建一个java工程: 在项目工程中新建一个lib包用于存放

Hadoop入门学习笔记---part1

随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力,好好做.正是因为选题和hadoop有关,现在正式开始学习hadoop.将笔记整理于此,希望与志同道合的朋友共同交流. 作者:itRed 邮箱:[email protected] 个人博客链接:http://www.cnblogs.com/itred 好了,废话不多说.进入正题!开始hadoop的学习

STM32学习笔记(四)——串口控制LED(中断方式)

目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类型并使能串口中断 七.编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号). 八.主函数的实现. 一.时钟使能,包括GPIO的时钟和串口的时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //

STM32学习笔记之一(初窥STM32)

怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个什么东西(如:寄存器---寄存东西(数据)的地方嘛) 学习知识--有了自我感知后,就需要验证自己的感知是否正确,请记住,带着自己思想的学习是最高效的学习(如:寄存器---存什么东西呢?) 归纳总结--学习了大量知识后,就该汇总汇总了(如:寄存器---存数据(通用寄存器),存命令(PC),存地址(LR)) 自我