历史上的今天
返回首页

历史上的今天

今天是:2024年12月08日(星期日)

正在发生

2021年12月08日 | STM32F4学习笔记7——USART Part2

2021-12-08 来源:eefocus

硬件流控制

使用 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 */

1

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()

推荐阅读

史海拾趣

Eagle-Picher公司的发展小趣事

Eagle-Picher公司的历史可以追溯到1843年,最初是由Edgar和他的兄弟Stephen J. Conkling在俄亥俄州辛辛那提成立的,专注于生产商业涂料颜料。随着时间的推移,公司经历了多次转型和变革。1847年,Stephen离开公司后,Edgar引入了新的合伙人威廉·伍德,并更名为康克林木业公司。随后,公司在不同的业务领域内扩展,直到1922年,Eagle-Picher正式进入电池市场,开始了其电子行业的历程。

安碁科技(AKER)公司的发展小趣事

1990年,安碁科技股份有限公司正式成立,标志着其进军石英振荡器领域的起点。公司初创时期,面临着激烈的市场竞争和技术挑战。然而,安碁科技凭借对技术的执着追求和对市场的敏锐洞察,逐步在行业中崭露头角。通过不断的技术研发和产品创新,公司逐渐建立了自己的品牌地位,为后续的发展奠定了坚实的基础。

Cygnal Integrated Products Inc公司的发展小趣事

为了加快技术发展和市场拓展的步伐,Cygnal积极寻求与其他公司的战略合作。通过与半导体制造商、软件开发商等公司的合作,Cygnal获得了更多的技术支持和市场资源。这些合作不仅提升了Cygnal的技术实力和市场竞争力,还为其未来的发展奠定了坚实的基础。

华宇创公司的发展小趣事

面对不断变化的市场环境和客户需求,华宇创始终将创新作为企业发展的核心动力。公司不断投入研发资源,探索新的技术方向和应用场景。同时,华宇创还关注行业发展趋势和未来市场需求,及时调整产品策略和市场布局。展望未来,华宇创将继续秉承创新、品质、合作的理念,致力于成为全球领先的智能电子设备供应商和服务商。

EM Devices Corporation公司的发展小趣事

作为一家有社会责任感的企业,EM Devices Corporation不仅关注自身的经济效益,还积极履行社会责任。公司严格遵守环保法规,采取了一系列环保措施,减少生产过程中的污染排放。此外,公司还积极参与公益事业,为社会做出了积极的贡献。这种可持续发展的理念为公司赢得了广泛的社会赞誉和尊重。

安普康(AMPCOM)公司的发展小趣事

安普康的成功离不开其独特的企业文化和优秀的团队。公司注重员工的培训和发展,为员工提供广阔的职业发展空间和良好的福利待遇。同时,公司还积极营造积极向上、团结协作的工作氛围,使得员工能够充分发挥自己的才能和潜力。这种企业文化不仅吸引了大量优秀人才加入安普康,也使得公司在面对市场挑战时能够保持强大的凝聚力和战斗力。


请注意,这些故事是基于已知信息创作的,并不代表安普康公司的真实发展历程。如需了解安普康公司的真实故事,建议查阅公司官方发布的资料或相关新闻报道。

问答坊 | AI 解惑

新材料可实现超快光电开关,提高光通信速度

作者:崔晓楠  日期:2006-11-1   来自 今日电子 美国华盛顿州立大学物理系研究人员近日设计出一种新型分子,其对光的传播的控制能力比现有的最好材料提高了近20倍,一旦成功用于超快光电开关,将能大大提高互联网与光通信的速度。 研究 ...…

查看全部问答>

请教 STM32 CAN_Filter的查询问题

怎样在can中断程序中 查出当前的报文是来自于那个filter的阿 看资料说的是结构体中的FMI参数   可我在实验的时候明明filter12收到的 查询fmi却是 8    百思不得其解阿 有哪位知道的请指教一下阿 以下为该语句 if(RxMessa ...…

查看全部问答>

请教高手二极管的性能区别问题

2种二极管除了封装不同外,使用中有什么区别吗…

查看全部问答>

基于LPC1114的LED控制系统

思路:   1. 通过上位机软件编辑处理效果数据,并存入SD卡中;   2. 通过SSP0读取SD卡中的数据信息到RAM中;   3. 更加效果数据的结构,进行数据转换,转换成LED灯具可以设别的灰度数据;   4. 通过SSP1发送灰度数据到LE ...…

查看全部问答>

达芬奇DSP算法很慢的问题

问题是这样,我用videnc_copy修改,加入我的放大算法代码,在process里面要用到width height pitch等值, 要传参数,我把这些变量放到process里面声明称局部变量并赋初值,程序就跑的很快(20ms),但是我把这几个变量 复制到process的外面(全局 ...…

查看全部问答>

探讨一下关于symbian智能手机操作系统的技术问题

探讨一下关于symbian智能手机操作系统的技术问题 各位从事symbian 智能手机研发或者从事相关电信领域工作的同弟姐妹们,我从事这方面的工作有相当长 的时间,对这个行业,包括有些技术领域有些困惑,想结识一些有同样背景的朋友们,做一下各方 ...…

查看全部问答>

通过TSP利用3700系列系统开关/万用表和2600系列SourceMeter®

在2005年,随着2600系列第一款一体化源表的引进,吉时利推出了安装有板上测试脚本处理器(Test Script Processors,TSP™)的测试测量仪器。TSP执行基于文本的程序,非常类似于SCPI,具有增强的测试序列/流程控制、决策判断以及利用用户自定义 ...…

查看全部问答>

hercules菜鸟步步新建工程点亮LED(HET0)

一、环境说明:HALCoGen :版本03.05.02CCS        :版本Code Composer Studio Version:5.4.0.00091硬件        :TMS570LS031USB 二、工作目录:     CCS工作 ...…

查看全部问答>

【PSoC4心得】试用评价

        接触PSOC4这个板子也差不多1个月了,也在网上发表了几篇应用的例程和心得,但很惭愧的事情是接触这个板子后还没有上过官网(总连不上)和看关于这个芯片的数据手册,所以写的几个例程都是从软件自带的例程中 ...…

查看全部问答>

给中年工程师的忠告

几年前写了《给年轻工程师的十大忠告》系列文章,不知不觉自己已经步入中年。做了十几年工程师,酸甜苦辣、百感交集,感觉中中年工程师命运更为令人忧虑。因此想写篇《给中年工程师的忠告》,算是姊妹篇,希望对中年工程师能有所启发,同时也给年轻 ...…

查看全部问答>