Функция
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
принимает указатель pData, который немедленно копируется в
huart->pTxBuffPtr = pData;
Но это значение фактически не используется и не отправляется, потому что после нескольких строк вы можете найти:
tmp = (uint32_t*)&pData;
и затем:
HAL_DMA_Start_IT(huart->hdmatx, *(uint32_t*)tmp, (uint32_t)&huart->Instance->DR, Size);
Таким образом, ваш указатель используется, когда & pData копируется в tmp , а затем все еще используется вВызов DMA выполняется до тех пор, пока DMA не будет настроен с:
hdma->Instance->M0AR = SrcAddress;
, таким образом, это небезопасно, поскольку оттуда следующее, что вы знаете, это прерывание завершения TX из DMA.Таким образом, в конце концов, когда вы вернетесь от
HAL_UART_Transmit_DMA
и перейдете к
doOtherStuff();
Возможно, вы все еще используете указатель.Как уже упоминалось, объявление статического является решением, потому что внутренний конечный автомат предотвращает возникновение проблем, если вы снова вызываете передачу DMA с помощью & distance .