|
|
发表于 2026-1-20 09:22:08
|
显示全部楼层
#if EN_LPUART1
UART_HandleTypeDef LPUART1_Handler; //UART1句柄
DMA_HandleTypeDef LPUART1DMA; //UART1-DMA句柄
ALIGN_32BYTES(__attribute__((section (".RAM_D3")))) volatile u8 U1_RxBuffer;//HAL库使用的串口接收缓冲
ALIGN_32BYTES(__attribute__((section (".RAM_D3")))) volatile uint16_t idle_time_U1 = 0;
// 全局变量
ALIGN_32BYTES(__attribute__((section (".RAM_D3")))) volatile FIFO_TypeDef rx_fifo_U1 = { .head = 0, .tail = 0, .count = 0 };
ALIGN_32BYTES(__attribute__((section (".RAM_D3")))) volatile FIFO_TypeDef tx_fifo_U1 = { .head = 0, .tail = 0, .count = 0 };
ALIGN_32BYTES(__attribute__((section (".RAM_D3")))) volatile Frame_TypeDef frame_U1 = { .length = 0, .explanation = 0 };
#endif
/****************************************************************************
函 数 名:void uart_init(u32 bound)
功 能:串口1初始化
输入参数:bound:波特率设置
返 回 值:无
说 明:无
创建时间:
作 者:
修改记录:
****************************************************************************/
void uart_init(u32 bound)
{
#if EN_LPUART1
//UART 初始化设置
LPUART1_Handler.Instance=LPUART1; //LPUART
LPUART1_Handler.Init.BaudRate=bound; //波特率
LPUART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
LPUART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
LPUART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
LPUART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
LPUART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&LPUART1_Handler); //HAL_UART_Init()会使能UART1
// HAL_UART_Receive_IT(&LPUART1_Handler, (uint8_t*)&U1_RxBuffer, 1);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
HAL_UART_Receive_DMA(&LPUART1_Handler,(uint8_t*)&rx_fifo_U1.buffer,UART_RX_FIFO_SIZE); //该函数会开启DMA接收中断
__HAL_UART_ENABLE_IT(&LPUART1_Handler,UART_IT_IDLE); // 使能空闲中断
#endif
}
/****************************************************************************
函 数 名:void HAL_UART_MspInit(UART_HandleTypeDef *huart)
功 能:串口1端口初始化
输入参数:huart:串口句柄
返 回 值:无
说 明:无
创建时间:
作 者:
修改记录:
****************************************************************************/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_Initure;
#if EN_LPUART1
if(huart->Instance==LPUART1) //如果是串口1,进行串口1 MSP初始化
{
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_LPUART1_CLK_ENABLE(); //使能LPUART1时钟
__HAL_RCC_BDMA_CLK_ENABLE(); //BDMA 时钟使能
GPIO_Initure.Pin=GPIO_PIN_9 | GPIO_PIN_10; //PA9/PA10
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
GPIO_Initure.Alternate=GPIO_AF3_LPUART; //复用为LPUART
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化端口
LPUART1DMA.Instance = BDMA_Channel1; // 根据实际硬件连接选择合适的Stream
LPUART1DMA.Init.Request = BDMA_REQUEST_LPUART1_RX; // 请求设置
LPUART1DMA.Init.Direction = DMA_PERIPH_TO_MEMORY; // 传输方向
LPUART1DMA.Init.PeriphInc = DMA_PINC_DISABLE; // 外设增量模式
LPUART1DMA.Init.MemInc = DMA_MINC_ENABLE; // 存储增量模式
LPUART1DMA.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据大小
LPUART1DMA.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 存储数据大小
LPUART1DMA.Init.Mode = DMA_CIRCULAR; // 循环控制模式
LPUART1DMA.Init.Priority = DMA_PRIORITY_LOW; // 优先级
LPUART1DMA.Init.FIFOMode = DMA_FIFOMODE_DISABLE; // FIFO阈值选择
LPUART1DMA.Init.MemBurst=DMA_MBURST_SINGLE; // 存储器突发模式
LPUART1DMA.Init.PeriphBurst=DMA_PBURST_SINGLE; // 外设突发模式
__HAL_LINKDMA(&LPUART1_Handler,hdmarx,LPUART1DMA);
/* 初始化DMA */
if(HAL_DMA_Init(&LPUART1DMA) != HAL_OK)
{
Error_Handler(__FILE__, __LINE__);
}
HAL_NVIC_SetPriority(BDMA_Channel1_IRQn, 3, 3);
HAL_NVIC_EnableIRQ(BDMA_Channel1_IRQn);
HAL_NVIC_EnableIRQ(LPUART1_IRQn); //使能LPUART1中断通道
HAL_NVIC_SetPriority(LPUART1_IRQn,3,3); //抢占优先级3,子优先级3
}
#endif
}
#if EN_LPUART1
/****************************************************************************
函 数 名:void USART1_IRQHandler(void)
功 能:串口1中断处理函数
输入参数:无
返 回 值:无
说 明:无
创建时间:
作 者:
修改记录:
****************************************************************************/
void LPUART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&LPUART1_Handler); //调用HAL库中断处理公用函数
DMA_Data_Acquisition_U1();
}
/****************************************************************************
函 数 名:void DMA1_Stream0_IRQHandler(void)
功 能:串口DMA中断
输入参数:无
返 回 值:无
说 明:无
创建时间:
作 者:
修改记录:
****************************************************************************/
void BDMA_Channel1_IRQHandler(void)
{
HAL_DMA_IRQHandler(&LPUART1DMA);
}
/****************************************************************************
函 数 名:void DMA_Data_Acquisition_U1(void)
功 能:串口1-DMA数据从缓存中取出来
输入参数:无
返 回 值:无
说 明:无
创建时间:
作 者:
修改记录:
****************************************************************************/
void DMA_Data_Acquisition_U1(void)
{
uint16_t remain_length;
/* 串口是否触发空闲中断 */
if(__HAL_UART_GET_FLAG(&LPUART1_Handler,UART_FLAG_IDLE))
{
__HAL_UART_CLEAR_IDLEFLAG(&LPUART1_Handler); /* 清除空闲中断 */
rx_fifo_U1.head = rx_fifo_U1.tail; // 尾帧位置
remain_length = __HAL_DMA_GET_COUNTER(&LPUART1DMA); /* 获取串口数据环形针头位置 */
if(remain_length)
{
rx_fifo_U1.tail = UART_RX_FIFO_SIZE - remain_length;
}
if(rx_fifo_U1.tail > rx_fifo_U1.head)
{
rx_fifo_U1.count = rx_fifo_U1.tail - rx_fifo_U1.head;
for (uint16_t i = 0;i<rx_fifo_U1.count;i++)
{
frame_U1.data[i] = rx_fifo_U1.buffer[rx_fifo_U1.head+i];
}
}
else /* 首尾相连数据获取 */
{
rx_fifo_U1.count = rx_fifo_U1.tail + UART_RX_FIFO_SIZE - rx_fifo_U1.head;
for (uint16_t i = 0;i<UART_RX_FIFO_SIZE - rx_fifo_U1.head;i++)
{
frame_U1.data[i] = rx_fifo_U1.buffer[rx_fifo_U1.head +i];
}
for (uint16_t i = 0;i<rx_fifo_U1.tail;i++)
{
frame_U1.data[UART_RX_FIFO_SIZE - rx_fifo_U1.head +i] = rx_fifo_U1.buffer[i];
}
}
frame_U1.length = rx_fifo_U1.count;
frame_U1.explanation = 0;
}
}
麻烦帮忙看下 |
|