金牌会员
- 积分
- 1108
- 金钱
- 1108
- 注册时间
- 2018-11-6
- 在线时间
- 240 小时
|
发表于 2022-11-29 19:36:57
|
显示全部楼层
不需要。
下面的代码,当USART3通过DMA方式接收到一帧完整的报文,发送消息队列
- //////////////////////////////////////////////////////////////////////////////////////////
- //DMA中断方式
- //////////////////////////////////////////////////////////////////////////////////////////
- void USART3_IRQHandler(void)
- {
- uint16_t ch;
- uint8_t Buffer[10];
- BaseType_t xHigherPriorityTaskWoken = pdFALSE;
-
-
- if (USART_GetITStatus(USART3,USART_IT_IDLE) != RESET)
- {
- USART_ClearITPendingBit(USART3 , USART_IT_IDLE); //必须先清除总线空闲中断标识,然后读一下数据寄存器,DMA接收才会正确(先读SR,然后读DR才能清除空闲中断标识)注意:这句必须要,否则不能够清除中断标志位。
- ch = USART_ReceiveData(USART3); //必须先清除总线空闲中断标识,然后读一下数据寄存器,DMA接收才会正确(先读SR,然后读DR才能清除空闲中断标识)注意:这句必须要,否则不能够清除中断标志位。
- DMA_Cmd(DMA1_Channel3 , DISABLE); //关闭DMA,防止处理其间有数据
- DMA_ClearFlag(DMA1_FLAG_GL3 | DMA1_FLAG_TC3 | DMA1_FLAG_HT3 | DMA1_FLAG_TE3);
- ch = USART3_DMA_RX_BUFFER_MAX_LENGTH - DMA_GetCurrDataCounter(DMA1_Channel3);
- if (ch > 0)
- {
- MB_USART3.receCount = ch;
- memcpy(MB_USART3.mscomm_buffer , USART3_DMA_RX_Buffer , MB_USART3.receCount);
- }
- DMA_SetCurrDataCounter(DMA1_Channel3 , USART3_DMA_RX_BUFFER_MAX_LENGTH);
- DMA_Cmd(DMA1_Channel3, ENABLE);
-
- Buffer[0] = 1;
- xQueueSendToBackFromISR(xQueueWIFI , Buffer , &xHigherPriorityTaskWoken);
- portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
- }
- else if (USART_GetITStatus(USART3,USART_IT_TC)!= RESET)
- {
- USART_ClearITPendingBit(USART3, USART_IT_TC);
- DMA_ClearFlag(DMA1_FLAG_GL2 | DMA1_FLAG_TC2 | DMA1_FLAG_HT2 | DMA1_FLAG_TE2);
- DMA_SetCurrDataCounter(DMA1_Channel2 , 0);
- }
- }
复制代码
|
|