为什么在STM32F103CB的UART中写入DR寄存器和实际显示数据之间存在延迟?

问题描述

我对提到的标题间的延迟时间感到好奇,当我将数据写入UART-> DR时切换了IO,延迟时间从3微秒到10x微秒不等

enter image description here

enter image description here

int main(void)
{
  /* initial code generated by STMCubeMX */
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  while (1)
  {
    HAL_Delay(50);

    if (USART_GetFlagStatus(&huart1,USART_SR_TXE) == SET)
    {
      USART_SendData(&huart1,'F');
    }
  }
}


void USART_SendData(UART_HandleTypeDef *huart,uint16_t Data)
{
  assert_param(IS_USART_ALL_PERIPH(USARTx));

  assert_param(IS_USART_DATA(Data));

  GPIOB->BSRR = GPIO_PIN_1;                   // Tick an IO pin for debugging
  GPIOB->BSRR = (uint32_t)GPIO_PIN_1 << 16u;  // reset bit

  huart->Instance->DR = (uint8_t)(Data & (uint8_t)0x00FF);      // send data (write DR)
}

我不确定时间抖动是否与BAUD速率9600(104微秒/位)有关,

写DR寄存器时不应该立即显示数据吗??

为什么延迟时间不一样(或接近)?

解决方法

写DR寄存器时不应该立即显示数据吗??

不一定。
您只向我们展示高级语言源代码。
您是否查看了实际的指令跟踪以确定这些操作之间的指令时间?
您如何确保这些操作之间没有中断服务?

为什么延迟时间不一样(或接近)?

显然,这取决于UART的设计。
您报告波特率为9600,并且(按预期)每个位的间隔似乎比100微秒稍长。

观察到的延迟小于一个比特间隔这一事实很重要。
典型的UART使用的时钟(即波特率发生器)比配置的波特率快16倍。
oversample需要比接收时钟更快的时钟,接收信号可以随时到达,即毕竟是异步通信。

enter image description here

对于发送时钟,波特率发生器被划分为标称波特率。
因此,对于传输,该时钟在(帧的)每个比特开始(和结束)传输的时间进行量化。
由于对UART TxD数据寄存器的写入是由CPU执行的,并且该操作与发送时钟不同步,因此,您应该期望在起始位之前最多延迟一个位间隔的随机延迟框架的轮廓出现在电线上。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...