|

楼主 |
发表于 2023-10-23 17:05:06
|
显示全部楼层
感谢硬汉哥的回复,以下是配置代码:
#define DEBUG_COM_PORT USART1
#define DEBUG_IRQ USART1_IRQn
#define DEBUG_IRQHandler USART1_IRQHandler
#define DEBUG_DMA_PORT DMA2
#define DEBUG_DMA_RX_CH LL_DMA_CHANNEL_4
#define DEBUG_DMA_RX_STREAM LL_DMA_STREAM_5
#define DEBUG_DMA_TX_CH LL_DMA_CHANNEL_4
#define DEBUG_DMA_TX_STREAM LL_DMA_STREAM_7
#define DEBUG_DMA_IRQ DMA2_Stream5_IRQn
#define DEBUG_DMA_IRQHandler DMA2_Stream5_IRQHandler
/**
* @brief 调试串口初始化
* @param bound 波特率
*/
void debug_com_init(uint32_t bound)
{
LL_USART_InitTypeDef USART_InitStruct;
gpio_af_conf(Debug_TX_GPIO_Port, LL_GPIO_AF_7, LL_GPIO_MODE_ALTERNATE, LL_GPIO_PULL_NO, LL_GPIO_SPEED_FREQ_VERY_HIGH, LL_GPIO_OUTPUT_PUSHPULL, Debug_TX_Pin);
gpio_af_conf(Debug_RX_GPIO_Port, LL_GPIO_AF_7, LL_GPIO_MODE_ALTERNATE, LL_GPIO_PULL_NO, LL_GPIO_SPEED_FREQ_VERY_HIGH, LL_GPIO_OUTPUT_PUSHPULL, Debug_RX_Pin);
LL_USART_DeInit(DEBUG_COM_PORT);
/* USER CODE END USART1_Init 1 */
USART_InitStruct.BaudRate = bound;
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
LL_USART_Init(DEBUG_COM_PORT, &USART_InitStruct);
LL_USART_ConfigAsyncMode(DEBUG_COM_PORT);
LL_USART_SetTransferDirection(DEBUG_COM_PORT, LL_USART_DIRECTION_TX_RX); // 使能发送和接收
//LL_USART_EnableIT_RXNE(DEBUG_COM_PORT); // 使能接收中断
LL_USART_EnableIT_IDLE(DEBUG_COM_PORT); // 使能空闲中断
LL_USART_ClearFlag_TC(DEBUG_COM_PORT); // 清除发送完成标志
//LL_USART_ClearFlag_RXNE(DEBUG_COM_PORT);
LL_USART_ClearFlag_IDLE(DEBUG_COM_PORT);
HAL_NVIC_SetPriority(DEBUG_IRQ, 0, 0);
HAL_NVIC_EnableIRQ(DEBUG_IRQ);
debug_dma_init();//打开DMA
LL_USART_EnableDMAReq_TX(DEBUG_COM_PORT);//使能DMA发送
LL_USART_EnableDMAReq_RX(DEBUG_COM_PORT);//使能DMA接收
LL_USART_Enable(DEBUG_COM_PORT);
}
void debug_dma_init(void)
{
LL_DMA_InitTypeDef debug_dma;
/** DMA Tx Config */
LL_DMA_DeInit(DEBUG_DMA_PORT,DEBUG_DMA_TX_STREAM);
debug_dma.Channel = DEBUG_DMA_TX_CH; //DMA通道
debug_dma.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH; //DMA传输方向
//FIFO配置
debug_dma.FIFOMode = LL_DMA_FIFOMODE_DISABLE; //FIFO
debug_dma.FIFOThreshold = LL_DMA_FIFOTHRESHOLD_FULL; //FIFO阀值
//内存配置
debug_dma.MemBurst = LL_DMA_MBURST_SINGLE; //内存突发传输配置
debug_dma.MemoryOrM2MDstAddress = (uint32_t)pDebug.Data; //内存地址
debug_dma.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE; //内存地址大小,byte short int
debug_dma.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT; //内存地址是否自增
//外设配置
debug_dma.PeriphBurst = LL_DMA_PBURST_SINGLE; //外设突发传输配置
debug_dma.PeriphOrM2MSrcAddress = (uint32_t)&DEBUG_COM_PORT->DR;//外设地址
debug_dma.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE; //内存地址大小
debug_dma.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; //内存地址是否自增
//模式配置
debug_dma.Mode = LL_DMA_MODE_NORMAL; //DMA模式
debug_dma.NbData = USART_MAX_LEN; //DMA传输最大数量
debug_dma.Priority = LL_DMA_PRIORITY_LOW; //DMA优先级
LL_DMA_Init(DEBUG_DMA_PORT,DEBUG_DMA_TX_STREAM,&debug_dma); //DMA初始化
/** DMA Tx Config End*/
/** DMA Rx Config */
LL_DMA_DeInit(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
debug_dma.Channel = DEBUG_DMA_RX_CH; //DMA通道
debug_dma.Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY; //DMA传输方向
//FIFO配置
debug_dma.FIFOMode = LL_DMA_FIFOMODE_DISABLE; //FIFO
debug_dma.FIFOThreshold = LL_DMA_FIFOTHRESHOLD_FULL; //FIFO阀值
//内存配置
debug_dma.MemBurst = LL_DMA_MBURST_SINGLE; //内存突发传输配置
debug_dma.MemoryOrM2MDstAddress = (uint32_t)pDebug.Data; //内存地址
debug_dma.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE; //内存地址大小,byte short int
debug_dma.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT; //内存地址是否自增
//外设配置
debug_dma.PeriphBurst = LL_DMA_PBURST_SINGLE; //外设突发传输配置
debug_dma.PeriphOrM2MSrcAddress = (uint32_t)&DEBUG_COM_PORT->DR;//外设地址
debug_dma.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE; //内存地址大小
debug_dma.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; //内存地址是否自增
//模式配置
debug_dma.Mode = LL_DMA_MODE_NORMAL; //DMA模式
debug_dma.NbData = USART_MAX_LEN; //DMA传输最大数量
debug_dma.Priority = LL_DMA_PRIORITY_LOW; //DMA优先级
LL_DMA_Init(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM,&debug_dma); //DMA初始化
HAL_NVIC_SetPriority(UHF_DMA_IRQ, 1, 0);
HAL_NVIC_EnableIRQ(UHF_DMA_IRQ);
LL_DMA_EnableStream(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
/** DMA Rx Config End*/
}
/**
* @brief 调试中断函数
*/
void DEBUG_IRQHandler(void)
{
xHigherPriorityTaskWoken = pdTRUE;
if (LL_USART_IsActiveFlag_RXNE(DEBUG_COM_PORT) == SET)
{
// LL_USART_ClearFlag_RXNE(DEBUG_COM_PORT);
// pDebug.Data[pDebug.Len] = LL_USART_ReceiveData8(DEBUG_COM_PORT);
// pDebug.Len++;
// if (pDebug.Len > USART_MAX_LEN)
// pDebug.Len = 0;
}
if (LL_USART_IsActiveFlag_IDLE(DEBUG_COM_PORT) == SET)
{
LL_USART_ClearFlag_IDLE(DEBUG_COM_PORT);
LL_USART_ReceiveData8(DEBUG_COM_PORT);
LL_DMA_DisableStream(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
pDebug.Len = USART_MAX_LEN - LL_DMA_GetDataLength(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
LL_DMA_SetDataLength(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM,USART_MAX_LEN);
LL_DMA_ClearFlag_TC5(DEBUG_DMA_PORT);
LL_DMA_EnableStream(DEBUG_DMA_PORT,DEBUG_DMA_RX_STREAM);
pDebug.Flag = ENABLE;
/** 通知任务处理数据 */
xTaskNotifyFromISR(DebugTask_Handler, 1, eSetValueWithoutOverwrite, &xHigherPriorityTaskWoken);
}
}
|
|