我这边同时打开了rxne和idle中断,接收数据使用dma做接收,然后触发空闲中断进去处理一帧数据。 现在我想打开rxne中断,然后对包头进行判断,但是我测试了下貌似不进rxne中断,所以我猜测原因是不是dma把串口dr寄存器提取了数据,导致rxne的标志位被清除,无法进入中断。如果这种方法可行的话,有没有例子可以参考。
下面是我的代码:
[C] 纯文本查看 复制代码
//初始化-----------------------------------------------------------------
__HAL_RCC_GPIOD_CLK_ENABLE(); //使能GPIO时钟
__HAL_RCC_USART3_CLK_ENABLE(); //使能USART时钟
GPIO_Initure.Pin=GPIO_PIN_8|GPIO_PIN_9;
GPIO_Initure.Alternate=GPIO_AF7_USART3;
HAL_GPIO_Init(GPIOD,&GPIO_Initure); //初始化
//USART3_RTS
GPIO_Initure.Pin=GPIO_PIN_12;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_PULLUP;//GPIO_PULLDOWN
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_Initure.Alternate=GPIO_AF7_USART3;
HAL_GPIO_Init(GPIOD,&GPIO_Initure); //初始化
USART3_EN(0);
HAL_NVIC_SetPriority(USART3_IRQn,5,0); //抢占优先级
USARTx_Set_Parameter(&TEST_USART_Handler,USARTx,bound,9,1,2);
__HAL_UART_CLEAR_IT(&TEST_USART_Handler,UART_CLEAR_TCF);
__HAL_UART_CLEAR_IDLEFLAG(&TEST_USART_Handler);
__HAL_UART_ENABLE_IT(&TEST_USART_Handler,UART_IT_IDLE);//开启中断
__HAL_UART_ENABLE_IT(&TEST_USART_Handler,UART_IT_RXNE);//开启中断
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 6, 0);//
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);//使能DAC中断通道
//中断--------------------------------------------------------------------
void USART3_IRQHandler(void)
{
u16 len;
BaseType_t xHigherPriorityTaskWoken;
if(__HAL_UART_GET_IT(&TEST_USART_Handler,UART_IT_RXNE)!=RESET)
{
__HAL_UART_DISABLE_IT(&TEST_USART_Handler,UART_IT_RXNE);
}
if(__HAL_UART_GET_IT(&TEST_USART_Handler,UART_IT_IDLE)!=RESET) //接收中断
{
__HAL_UART_CLEAR_IDLEFLAG(&TEST_USART_Handler); //清除空闲中断标志(否则会一直不断进入中断)
HAL_UART_DMAStop(&TEST_USART_Handler); //11us,10us
len = TEST_BUF_LEN - __HAL_DMA_GET_COUNTER(&UART3RxDMA_Handler);// 获取DMA中未传输的数据个数
if(len>=TEST_BUF_LEN)
{
TESTRxFIFO.len[TESTRxFIFO.index] = 0;
}
else
{
if(len != 0)
{
__HAL_UART_ENABLE_IT(&TEST_USART_Handler,UART_IT_RXNE);
TESTRxFIFO.len[TESTRxFIFO.index] = len;
//发送消息
if(uxQueueSpacesAvailable(TEST_RX_Msg)) //得到队列剩余大小
{
xQueueSendFromISR(TEST_RX_Msg,&TESTRxFIFO.index,&xHigherPriorityTaskWoken);//向队列中发送数据pdTRUE
TESTRxFIFO.index++;
TESTRxFIFO.index%=FIFO_NUM;
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);//如果需要的话进行一次任务切换
}
}
}
HAL_UART_Receive_DMA(&TEST_USART_Handler,TESTRxFIFO.buf[TESTRxFIFO.index],FIFO_BUF_LEN);
}
if(__HAL_UART_GET_IT(&TEST_USART_Handler,UART_IT_TC)!=RESET) //发送完成中断
{
__HAL_UART_CLEAR_FLAG(&TEST_USART_Handler,UART_IT_TC);
SET_BIT(TEST_USART_Handler.Instance->ICR,USART_ICR_TCCF);
CLEAR_BIT(TEST_USART_Handler.Instance->CR1, USART_CR1_TCIE);
/* Tx process is ended, restore huart->gState to Ready */
TEST_USART_Handler.gState = HAL_UART_STATE_READY;
xSemaphoreGiveFromISR(BinTEST_USART,&xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
if((USART3->ISR&0x000f)!=0)
{
USART3->ICR |= 0x0f;//1<<3
HAL_UART_DMAStop(&TEST_USART_Handler);
USARTx_DMA_Config(&TEST_USART_Handler,DMA2_Stream7,DMA2_Stream4);
HAL_UART_Receive_DMA(&TEST_USART_Handler,TESTRxFIFO.buf[TESTRxFIFO.index],FIFO_BUF_LEN);
}
}
|