下载的大疆例程结果发现 9.remote_control_printf_pc 是有问题的
错误原因:例程中DMA USARTX Tx没有进行初始化和使能等操作,DMA本身没有进行使能操作,导致根本无法DMAprintf重定向输出
解决办法:
在文件中加入这几个函数并在main函数中初始化再调用printf函数
void usart_tx_dma_init(void)
{
//使能串口DMA发送和接受
SET_BIT(huart1.Instance->CR3,USART_CR3_DMAR);
SET_BIT(huart1.Instance->CR3,USART_CR3_DMAT);
//失能DMA
__HAL_DMA_DISABLE(&hdma_usart1_tx);
while(hdma_usart1_tx.Instance->CR & DMA_SxCR_EN)
{
__HAL_DMA_DISABLE(&hdma_usart1_tx);
}
hdma_usart1_tx.Instance->PAR = (uint32_t) & (USART1->DR);
hdma_usart1_tx.Instance->M0AR = (uint32_t)(NULL);
hdma_usart1_tx.Instance->NDTR = 0;
}
/*
参数:输入的数据地址(数组名称),长度
输出:无
*/
void usart1_tx_dma_enable(uint8_t *data, uint16_t len)
{
//disable DMA
//失效DMA
__HAL_DMA_DISABLE(&hdma_usart1_tx);
while(hdma_usart1_tx.Instance->CR & DMA_SxCR_EN)
{
__HAL_DMA_DISABLE(&hdma_usart1_tx);
}
__HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx, DMA_HISR_TCIF7);
hdma_usart1_tx.Instance->M0AR = (uint32_t)(data);
__HAL_DMA_SET_COUNTER(&hdma_usart1_tx, len);
__HAL_DMA_ENABLE(&hdma_usart1_tx);
}
void MX_DMA_Init(void)
{
__HAL_RCC_DMA2_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
HAL_NVIC_SetPriority(DMA1_Stream7_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream7_IRQn);
}