STM32H743串口2 使用空闲中断结束数据都是 0是什么原因
//bound:波特率
////DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_Streamx:DMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
void USART2_Init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_Initure;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART2;
PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
// __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
__HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOB时钟
__HAL_RCC_USART2_CLK_ENABLE(); //使能USART3时钟
GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PB10,11
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
GPIO_Initure.Alternate=GPIO_AF7_USART2; //复用为USART3
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PB10,11
HAL_DMA_USART2_TX_Handle.Instance = DMA1_Stream5;
HAL_DMA_USART2_TX_Handle.Init.Request=DMA_REQUEST_USART2_TX; //USART3发送DMA
HAL_DMA_USART2_TX_Handle.Init.Direction=DMA_MEMORY_TO_PERIPH; //存储器到外设
HAL_DMA_USART2_TX_Handle.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
HAL_DMA_USART2_TX_Handle.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
HAL_DMA_USART2_TX_Handle.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //外设数据长度:8位
HAL_DMA_USART2_TX_Handle.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
HAL_DMA_USART2_TX_Handle.Init.Mode=DMA_NORMAL; //外设流控模式
HAL_DMA_USART2_TX_Handle.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级
HAL_DMA_USART2_TX_Handle.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
HAL_DMA_USART2_TX_Handle.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
HAL_DMA_USART2_TX_Handle.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
HAL_DMA_USART2_TX_Handle.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
HAL_DMA_DeInit(&HAL_DMA_USART2_TX_Handle);
if(HAL_DMA_Init(&HAL_DMA_USART2_TX_Handle)!=HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&USART2_Handler,hdmatx,HAL_DMA_USART2_TX_Handle); //将DMA与USART3 发送联系起来接收 DMA
HAL_DMA_USART2_RX_Handle.Instance = DMA1_Stream3;
HAL_DMA_USART2_RX_Handle.Init.Request=DMA_REQUEST_USART2_RX; //USART3接收DMA
HAL_DMA_USART2_RX_Handle.Init.Direction=DMA_PERIPH_TO_MEMORY; //外设到内存
HAL_DMA_USART2_RX_Handle.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
HAL_DMA_USART2_RX_Handle.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
HAL_DMA_USART2_RX_Handle.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //外设数据长度:8位
HAL_DMA_USART2_RX_Handle.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
HAL_DMA_USART2_RX_Handle.Init.Mode=DMA_NORMAL; //外设流控模式
HAL_DMA_USART2_RX_Handle.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级
HAL_DMA_USART2_RX_Handle.Init.FIFOMode=DMA_FIFOMODE_ENABLE;
HAL_DMA_USART2_RX_Handle.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
HAL_DMA_USART2_RX_Handle.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
HAL_DMA_USART2_RX_Handle.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
if( HAL_DMA_Init(&HAL_DMA_USART2_RX_Handle)!=HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&USART2_Handler,hdmarx,HAL_DMA_USART2_RX_Handle); //将DMA与USART3 接收联系起来接收 DMA
HAL_NVIC_SetPriority(DMA1_Stream5_IRQn,8,0); //设置中断优先级,抢占优先级11,子优先级0
HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); //开启ITM3中断 /
HAL_NVIC_SetPriority(DMA1_Stream3_IRQn,9,0); //设置中断优先级,抢占优先级12,子优先
HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn); //开启ITM3中断
//USART 初始化设置
USART2_Handler.Instance=USART2; //USART3
USART2_Handler.Init.BaudRate=bound; //波特率
USART2_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
USART2_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
USART2_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
USART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
USART2_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
USART2_Handler.Init.OverSampling = UART_OVERSAMPLING_16;
USART2_Handler.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
USART2_Handler.Init.ClockPrescaler = UART_PRESCALER_DIV1;
USART2_Handler.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if(HAL_UART_Init(&USART2_Handler)!=HAL_OK) //初始化串口3
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&USART2_Handler, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&USART2_Handler, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&USART2_Handler) != HAL_OK)
{
Error_Handler();
}
HAL_NVIC_SetPriority(USART2_IRQn,7,0); //设置中断优先级,抢占优先级1,子优先级3
HAL_NVIC_EnableIRQ(USART2_IRQn); //开启ITM3中断
__HAL_UART_CLEAR_IDLEFLAG(&USART2_Handler); //串口初始化完成后空闲中断标志位是1 需要清除
delay_ms(1);
//设置DMA接收缓冲区及长度,接收长度应大于最大报文长度
HAL_UART_Receive_DMA(&USART2_Handler,USART2_RX_BUF,USART2_REC_LEN); //注意初始化顺序 要先设定区域 再使能中断
//开启空闲中断
__HAL_UART_ENABLE_IT(&USART2_Handler,UART_IT_IDLE);
delay_ms(1);
}
void USART2_IRQHandler(void)
{
if(__HAL_UART_GET_FLAG(&USART2_Handler,UART_FLAG_IDLE)!=RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(&USART2_Handler);
HAL_UART_DMAStop(&USART2_Handler);
len2= USART2_REC_LEN-__HAL_DMA_GET_COUNTER(&HAL_DMA_USART2_RX_Handle);
if(len2) //处理数据是要看是不是有数据 初始化的时候 空的会进来一次
{
USART2_DMA_Send_data(USART2_RX_BUF,len2); //返回收到的值
}
HAL_UART_Receive_DMA(&USART2_Handler,USART2_RX_BUF,USART2_REC_LEN);
}
HAL_UART_IRQHandler(&USART2_Handler);
}
void DMA1_Stream3_IRQHandler(void)
{
HAL_DMA_IRQHandler(&HAL_DMA_USART2_RX_Handle);
}
void DMA1_Stream5_IRQHandler(void)
{
HAL_DMA_IRQHandler(&HAL_DMA_USART2_TX_Handle);
}