datasheet

STM32串口发送数据详解

2016-10-10来源: eefocus关键字:STM32  串口  发送数据
串口的中断方式:

/**
* @brief Enables or disables the specified USART interrupts.
* @param USARTx: where x can be 1 or 2 to select the USART peripheral.
* @param USART_IT: specifies the USART interrupt sources to be enabled or disabled.
* This parameter can be one of the following values:
* @arg USART_IT_WU: Wake up interrupt. //唤醒中断
* @arg USART_IT_CM: Character match interrupt.//字符匹配中断
* @arg USART_IT_EOB: End of block interrupt. //块结束中断
* @arg USART_IT_RTO: Receive time out interrupt. //接收超时中断
* @arg USART_IT_CTS: CTS change interrupt. //CTS变化中断
* @arg USART_IT_LBD: LIN Break detection interrupt. //终止检测中断
* @arg USART_IT_TXE: Tansmit Data Register empty interrupt. //发送数据寄存器空中断
* @arg USART_IT_TC: Transmission complete interrupt. //发送完成中断
* @arg USART_IT_RXNE: Receive Data register not empty interrupt. //接收寄存器非空中断
* @arg USART_IT_IDLE: Idle line detection interrupt. //空闲线检测中断
* @arg USART_IT_PE: Parity Error interrupt. //奇偶校验错误中断
* @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) //错误中断
* @param NewState: new state of the specified USARTx interrupts.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/

 
 
首先把数据手册的这部分内容贴出来
 
Character transmission procedure
1. Program the M bits in USARTx_CR1 to define the word length.
2. Select the desired baud rate using the USARTx_BRR register.
3. Program the number of stop bits in USARTx_CR2.
4. Enable the USART by writing the UE bit in USARTx_CR1 register to 1.
5. Select DMA enable (DMAT) in USARTx_CR3 if Multi buffer Communication is to take 
place. Configure the DMA register as explained in multibuffer communication.
6. Set the TE bit in USARTx_CR1 to send an idle frame as first transmission.
7. Write the data to send in the USARTx_TDR register (this clears the TXE bit). Repeat 
this for each data to be transmitted in case of single buffer. 
8. After writing the last data into the USARTx_TDR register, wait until TC=1. This 
indicates that the transmission of the last frame is complete. This is required for 
instance when the USART is disabled or enters the Halt mode to avoid corrupting the 
last transmission.
 
字符传输过程 
1。方案中USARTx_CR1的M位来定义字长。 
2。选择所需的波特率使用USARTx_BRR寄存器。 
3。计划在USARTx_CR2停止位的数目。 
4。通过写寄存器1 USARTx_CR1在UE位使能USART的。 
5。选择DMA使能(DMAT)在USARTx_CR3如果多缓冲器通信是采取 
地方。配置DMA寄存器在多缓冲器通信解释。 
6。设置在USARTx_CR1的TE位发送空闲帧作为第一次传输。 
7。写入要发送的数据在USARTx_TDR寄存器(这将清除TXE位)。重复 
这对每个数据进行的情况下单个缓冲器的传输。 
8。写在最后一个数据到USARTx_TDR寄存器后,等到TC=1。这 
表示最后帧的传输完成。这是必需的 
例如当USART被禁用或进入暂停模式,以避免破坏 
最后一次传输。
 
STM32串口发送数据详解 - 大海 - 大海的博客
 
首先仔细看看这个发送的数据时序图。
发现,USART_TDR没有数据的时候,也就是空,TXE会被置位,当往USART_TDR写数据的时候,TXE低
列出TXE,TCflag变化的条件
TXE:只要USART_TDR没有数据就被置位
TCflag:只有TXline数据全部发送出去才会中断。
发送过程:往USART_TDR里面写数据->TXline往外发送。
也就是TCflag置位会晚于TXEflag一个字符的时间。
 
 
字符传输过程 
 
(转)

1、 使能串口发送TE,此时USART_DR为空,此时应查询TXE是否置1,TXE置1,TX脚先发送一个空闲帧,把F1帧写入USART_DR,TXE被清零。因为这时正在发送空闲帧,所以写入USART_DR的数据被放入TDR寄存器,还没有拷贝到移位寄存器。
2、 在空闲帧发送完后,TDR寄存器中的数据被拷贝到移位寄存器,此时应查询TXE是否置1,TXE置1,表示TDR已空,可以放入下一个数据。此时在TX脚上将会发送F1帧的数据,同时软件把F2帧的数据写入USART_DR,TXE被清零。
3、 在F1帧的停止位发送完后,因为TDR寄存器中的F2还没被拷入移位寄存器,所以此时TXE仍为0,TC不置1.此时应查询TXE是否置1,TXE置1,表示TDR已空,可以放入下一个数据。此时在TX脚上将会发送F2帧的数据,同时软件把F3帧的数据写入USART_DR,TXE被清零。
4、 在F2帧的停止位发送完后,因为TDR寄存器中的F3还没被拷入移位寄存器,所以此时TXE仍为0,TC不置1.此时应查询TXE是否置1,TXE置1,表示TDR已空,后面没有数据写入USART_DR,TXE保持高电平,此时在TX脚上将会发送F3帧的数据。
5、 在F3帧的停止位发送完后,因为此时TXE为1,所以TC标志会置1.如果TCIE为1,将会产生中断。

串口发送注意几点:
1、 如果正在发送数据,写数据进USART_DR将会把数据写到TDR缓冲寄存器,在本次发送完成后,再把TDR中的数据拷贝进移位寄存器。
2、 如果当前没有发送数据,写数据进USART_DR将会把数据直接放到移位寄存器,不经过TDR,TXE被清零,然后发送开始,TXE被硬件置1。
3、 只有当一帧数据的停止位发送完成并且TXE为1,TC才会被置1


关键字:STM32  串口  发送数据

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2016101030298.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32配置时钟时注意设置FLASH等待周期
下一篇:STM32几种启动文件理解

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32堆栈设置

1.堆和栈大小 定义大小在startup_stm32f2xx.sStack_Size      EQU     0x00000400                AREA    STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem      
发表于 2019-04-16
STM32堆栈设置

STM32堆和栈(Heap & Stack)的资料理解

源起:在移植cjson的过程中,解析json包的时候发现动态内存分配不足而导致解析失败,为解决这一问题,而深入了解stm32的堆和栈。stm32的存储器结构。Flash,SRAM寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。FLASH存储下载的程序。SRAM是存储运行程序中的数据。而SRAM一般分这几个部分:静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率
发表于 2019-04-16
STM32堆和栈(Heap & Stack)的资料理解

STM32定义堆栈地址到ram区顶部

本设置针对stm32f103rbt6的设置,该芯片RAM大小为20kB,故RAM区地址范围为0x20000000—0x20005000,芯片信息如下图所示;第一步:设置.sct文件;;*************************************************************; *** Scatter-Loading Description Filegenerated by uVision ***; *************************************************************LR_IROM1 0x08000000 0x00020000  
发表于 2019-04-16
STM32定义堆栈地址到ram区顶部

STM32之程序如何防止堆栈溢出

近日为某个项目写了个草稿程序,即非正式程序,后来发现老是进入hardfaulthandler,原来是堆栈溢出,后仔细查看发现函数调用纵深太深,最多的时候可保持7个函数在堆栈中调用。因此有心得如下:一、函数调用不要纵深太深,即以下模式:main(){   fun1();}fun1(){  fun2();}fun2(){   fun3();}fun3(){  fun4();}fun4(){  fun5();}fun5(){  fun6();}fun6(){   fun7();}这样子main函数要调用fun1函数完成某个功能,则要一直调到
发表于 2019-04-16

stm32之堆栈

stm32中的堆栈设置keil编译完成时存储情况当编译成功时,会出现: BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-data=1632Code:程序代码部分RO-data: 程序定义的常量const tempRW-data:已初始化的全局变量ZI-data:未初始化的全局变量片中的:flash=Code+RO-data+RW-dataRAM=RW-data+ZI-data通过上面的BUILD可以看出,这个程序已经用了1600多的RAM,为什么会出用到这么多的RAM呢?在startup_stm32f10x_md.s文件中存在:St
发表于 2019-04-16

说说STM32的堆栈与内存

1.概念这里所说的堆栈,是针对单片机所说的“堆”与“栈”,指的是内存中一片特殊用途的区域。而不是数据结构中的堆栈(虽然其实规则一样)。这里所说的内存,是指RAM,RAM包括SRAM,DRAM等。而不是什么手机内存卡之类。这里所说的flash,指的是用作为ROM的存储器,保存代码与常量数据。而不是动画制作。。。栈的生长方向:指的是入栈方向,从高地址向低地址生长叫做向下生长,或逆向生长;反过来就叫向上生长,或正向生长。STM32的栈是向下生长。2.内存中的堆栈安排确切地说,是keil mdk根据STM32的特性,对stm32的RAM甚至flash进行部署。编译工程后,在生成的.map文件里可以看到具体的安排。双击工程界面的工程根目录
发表于 2019-04-16
说说STM32的堆栈与内存

小广播

何立民专栏

单片机及嵌入式宝典

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

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