Stone STM32F103C8,在CubeMX中创建工程,设置标准-USART2为异步模式,激活其全局中断,创建DMA通道:
我生成一个项目并将以下代码添加到while中:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_UART_Transmit_DMA(&huart2, buff, 100);
HAL_Delay(100);
}
我编译,闪存和......什么都没有!Tx 腿一直很高,没有传输的迹象。同时,HAL_UART_Transmit_IT 函数工作正常,具有类似设置的相同代码在 STM32F407VG (Discovery) 上工作。尝试了其他石头F103C8,尝试在不同的地方调用HAL_UART_Abort,HAL_DMA_Abort - 没有成功。
我注意到,在调用 HAL_UART_Transmit_DMA 之后,立即调用了 DMA 中断处理程序,其中 HAL 发出传输完成的判断,这意味着什么?HAL 坏了?
PS这里是USART-a和DMA初始化代码
static void MX_USART2_UART_Init(void)
{
/* USER CODE BEGIN USART2_Init 0 */
/* USER CODE END USART2_Init 0 */
/* USER CODE BEGIN USART2_Init 1 */
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 100;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_2;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
/* USER CODE END USART2_Init 2 */
}
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
}
DMA 未在您的代码中初始化。下面是我的一段代码:
所见:
HAL_DMA_Init(&hdma_tx)__HAL_LINKDMA(mHUart, hdmatx, hdma_tx)__HAL_RCC_USART2_CLK_ENABLE();