1、STM32串口发送使用USART_FLAG_TXE与使用USART_FLAG_TC,发送X个字节的占用时间的差异是后者比前者多用 X*(CPU往数据寄存器中填充数据用时) 吗?
2、发送移位寄存器中的数据往外发送的过程用时多少?
1、STM32串口发送使用USART_FLAG_TXE与使用USART_FLAG_TC,发送X个字节的占用时间的差异是后者比前者多用 X*(CPU往数据寄存器中填充数据用时) 吗
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注【以下回答由 GPT 生成】
先来了解一下USART_FLAG_TXE和USART_FLAG_TC这两个标志位的含义:
- USART_FLAG_TXE 表示发送寄存器为空,可以发送下一个字节。
- USART_FLAG_TC 表示整个发送过程已完成。
对于问题中的第一个问题,是否后者相对于前者会多用X*(CPU往数据寄存器中填充数据用时)的时间,答案是:否。
USART_FLAG_TXE 表示发送寄存器为空时可以发送下一个字节,此时可以将下一个字节写入发送寄存器(即往数据寄存器中填充数据)。所以实际上填充数据的时间并不是在这个标志位中耗费的时间。
USART_FLAG_TC 表示整个发送过程已完成,即发送寄存器中的所有数据都已发送完毕,此时可以进行其他操作。所以在这个标志位中没有填充数据的操作。
所以USART_FLAG_TC相对于USART_FLAG_TXE不会多用X*(CPU往数据寄存器中填充数据用时)的时间。
关于第二个问题,发送移位寄存器中的数据往外发送的过程需要多长时间,这个时间是由USART控制器的工作频率以及波特率决定的。
在STM32中,发送移位寄存器是由USART硬件管理的,将数据从发送寄存器发送到移位寄存器中,然后由移位寄存器发送出去。发送移位寄存器中的数据往外发送的时间是由波特率决定,波特率定义了每秒钟发送的比特数,从而决定了每个比特的发送时间。
因此,发送移位寄存器中的数据往外发送的时间可以通过下面的公式计算:
发送时间 = X * 每个字节的位数 / 波特率
另外,你还可以通过以下代码来测量发送时间:
#include "stm32f4xx.h" void delay_us(uint32_t us) // 延时函数,延时us微秒 { us *= (SystemCoreClock / 1000000) / 5; while (us--) { __NOP(); __NOP(); __NOP(); __NOP(); } } int main(void) { // 初始化USART和GPIO等相关配置 // 发送数据 uint8_t data[X] = { /* 数据内容 */ }; for (int i = 0; i < X; ++i) { while (!(USART1->SR & USART_FLAG_TXE)) { // 等待发送寄存器为空 } USART1->DR = data[i]; delay_us(发送时间); // 传入发送时间进行延时 } while (!(USART1->SR & USART_FLAG_TC)) { // 等待发送完成 } // 其他操作 return 0; }以上是我的回答,如果还有其他问题,请随时提问。
【相关推荐】
- 这篇文章:STM32F103学习笔记(三) 串口的标志位 USART_FLAG_TXE 和USART_FLAG_TC的理解 也许有你想要的答案,你可以看看
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报