0

我很好奇提到的标题之间的延迟时间,我在将数据写入UART-> DR时切换了一个IO,延迟时间从3微秒到10x微秒不等 在此处输入图像描述

在此处输入图像描述

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

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

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

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

4

1 回答 1

1

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

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

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

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

观察到的延迟小于一位间隔的事实很重要。
典型的 UART 使用比配置的波特率快 16 倍的时钟(也称为波特率发生器)。
需要这个快于必要的时钟来对接收信号进行过采样,接收信号可以随时到达,即它毕竟是异步通信。

在此处输入图像描述

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

于 2020-09-25T02:13:06.777 回答