почему существует задержка между (записанным регистром DR) и (действительно показанными данными) в UART на STM32F103CB?

#timer #uart #stm32f1

#таймер #uart #stm32f1

Вопрос:

Мне любопытно время задержки между указанным заголовком, я переключил ввод-вывод при записи данных в UART-> DR, время задержки варьируется от 3 микросекунд до 10 микросекунд введите описание изображения здесь

введите описание изображения здесь

 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(amp;huart1, USART_SR_TXE) == SET)
    {
      USART_SendData(amp;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 amp; (uint8_t)0x00FF);      // send data (write DR)
}
  

Я не уверен, связаны ли временные колебания со скоростью передачи данных 9600 БОД (104 микросекунды / бит),

Разве данные не должны отображаться немедленно при записи регистра DR????

И почему время задержки не одинаковое (или близкое)?

Ответ №1:

Разве данные не должны отображаться немедленно при записи регистра DR????

Не обязательно.
Вы показываете нам только исходный код языка высокого уровня.
Вы просмотрели фактическую трассировку команд, чтобы определить время выполнения команд между этими операциями?
Как вы гарантируете, что между этими операциями не обслуживается прерывание?

И почему время задержки не одинаковое (или близкое)?

По-видимому, это зависит от конструкции UART.
Вы сообщаете, что скорость передачи данных равна 9600, и (как и ожидалось) интервалы для каждого бита кажутся немного длиннее 100 микросекунд.

Тот факт, что наблюдаемая задержка составляет менее одного битового интервала, является значительным.
Типичный UART использует тактовый сигнал (он же генератор скорости передачи данных), который в 16 раз быстрее, чем настроенная скорость передачи данных.
Эти более быстрые, чем необходимо, часы необходимы для передискретизации принимаемого сигнала, который может поступать в любое время, т. Е. В конце концов, это асинхронная связь.

введите описание изображения здесь

Для синхронизации передачи генератор скорости передачи делится до номинальной скорости передачи.
Итак, для передачи этот тактовый сигнал квантуется во времени, когда каждый бит (кадра) начнет (и завершит) свою передачу.
Поскольку запись в регистр данных UART TxD выполняется процессором, и эта операция не синхронизирована с тактовой частотой передачи, поэтому следует ожидать случайную задержку до одного битового интервала до появления начального бита кадра на проводе.

Комментарии:

1. Спасибо за ответ. Извините за еще один вопрос, есть ли какой-либо способ повторно инициализировать CLK передатчика? Работает ли вызов MX_USART2_UART_Init();? Или, если я установлю сверхвысокую скорость передачи данных и вернусь к 9600, сбросит ли это Cnt в генераторе скорости передачи данных в бодах?

2. Вы могли бы поэкспериментировать, но любая синхронизация между процессором и тактовой частотой передачи UART была бы случайной и временной. Я полагаю, что фаза синхронизации передачи может быть сдвинута так, чтобы передача могла быть начата как можно скорее при загрузке сдвигового регистра Tx, но это, вероятно, дополнительная функция, которая имеет низкое соотношение затрат и выгод. Может быть, есть UART, у которого есть такая функция.