так надо просто не ставить галки на ненужные функции. совсем кривой там приемник, невозможно просто висеть в нем и обрабатывать в прерываниях приходящие байты (при инициализации надо задать число принимаемых байт).
просто вставить функцию приемника в USER CODE
void USART2_IRQHandler(void) {
///
}
а приемник инициализировать руками типа
USART2 -> CR1 |= USART_CR1_RXNEIE | USART_CR1_RE;
USART2 -> CR3 = USART_CR3_DMAT; // | USART_CR3_DMAR; /* (2) */
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
передавать логично по DMA, запретив вообще прерывания усарта в кубе. Но в таком варианте передаст только одну строку (там наворочено, чтобы честно дождаться выхода последнего байта до конца). Чтобы заработало, можно поправить функцию
/**
* @brief DMA UART transmit process complete callback.
* @param hdma: Pointer to a DMA_HandleTypeDef structure that contains
* the configuration information for the specified DMA module.
* @retval None
*/
static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
{
UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
/* DMA Normal mode*/
if ( HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC) )
{
huart->TxXferCount = 0;
/* Disable the DMA transfer for transmit request by setting the DMAT bit
in the UART CR3 register */
CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
/* Enable the UART Transmit Complete Interrupt */
//////// __HAL_UART_ENABLE_IT(huart, UART_IT_TC); EDITED
huart ->State = HAL_UART_STATE_READY;
}
/* DMA Circular mode */
else
{
HAL_UART_TxCpltCallback(huart);
}
}
К сожалению, править ее придется после каждой перегенерации кода кубом
ещё проверить, может для вашего камня существуют low level функции (префикс ll). Такой откат к SPL...