论坛元老
 
- 积分
- 3127
- 金钱
- 3127
- 注册时间
- 2017-2-7
- 在线时间
- 387 小时
|
1金钱
本帖最后由 fengqiyunyong52 于 2019-11-21 09:35 编辑
用STM32H7串口+DMA实现了不定长字节的接收。
现在想在这个基础上增加一个功能,就是测出串口从接收到第一个字节,到接收完成全部字节,共消耗了多长时间。
我的思路是:
同时开启RXNE和IDLE中断,在一个硬件定时器中断中设置一个计数器,比较RXNE第一个中断发生时和IDLE中断发生时的计数器差值,从而得到耗时。
然而发现RXNE中断只进入了一次,空闲中断进入时DMA接收缓冲区中的内容也为空。
请问各位老师,是哪里有问题吗?求指点,谢谢。
代码如下:
//UART3 初始化设置
UART3_Handler.Instance =USART3; //USART3
UART3_Handler.Init.BaudRate =uart3_bound; //波特率
UART3_Handler.Init.WordLength =UART_WORDLENGTH_8B; //字长为8位数据格式
UART3_Handler.Init.StopBits =UART_STOPBITS_1; //一个停止位
UART3_Handler.Init.Parity =UART_PARITY_NONE; //无奇偶校验位
UART3_Handler.Init.HwFlowCtl =UART_HWCONTROL_NONE; //无硬件流控
UART3_Handler.Init.Mode =UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&UART3_Handler); //HAL_UART_Init()会使能UART3
HAL_UART_Receive_IT(&UART3_Handler,&uart3_recvbyte, 1); __HAL_UART_ENABLE_IT(&UART3_Handler, UART_IT_IDLE); //开启空闲接收中断
__HAL_UART_CLEAR_IDLEFLAG(&UART3_Handler); //清除标志位
HAL_UART_Receive_DMA(&UART3_Handler,uart3_recvbuf,UART3_RECVBUF_SIZE);//打开DMA接收,指定接收缓存区和接收大小
void USART3_IRQHandler(void)
{
int count=0;
#if SYSTEM_SUPPORT_OS //使用OS
OSIntEnter();
#endif
HAL_UART_IRQHandler(&UART3_Handler);
if(UART3_Handler.Instance==USART3)//如果是串口3
{
if(__HAL_UART_GET_IT(&UART3_Handler, UART_IT_RXNE) != RESET)
{ if( uart3_count_flg==0)
{
uart3_count_rxne=tim_count;//记录首次进入RXNE中断的时间计数器值
uart3_count_flg=1;
}
HAL_UART_Receive_IT(&UART3_Handler,&uart3_recvbyte, 1);
}
if(__HAL_UART_GET_FLAG(&UART3_Handler,UART_FLAG_IDLE)!=RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(&UART3_Handler); //清除标志位
HAL_UART_DMAStop(&UART3_Handler); //先停止DMA,暂停接收
uart3_count_idle=tim_count;//记录进入空闲中断的时间计数器的值
OSSemPost(Sem_Uart3_Rx);
uart3_count_flg=0;
HAL_UART_Receive_DMA(&UART3_Handler,uart3_recvbuf,UART3_RECVBUF_SIZE);//重新打开DMA接收
}
}
#if SYSTEM_SUPPORT_OS //使用OS
OSIntExit();
#endif
}
|
|