05_STM32V6_UART_IT_DMA_IDLE.rar
(5.42 MB, 下载次数: 2261)
搜索stm32f4xx_hal_uart.c下的IDLE你会发现搜索不到,因为HAL库没有对IDLE方式的应用处理程序,用户需要自己完成对空闲中断的处理程序下面第一张图是串口空闲中断处理方式,注意如果串口接收如果放在中断里处理,发送HAL库API时IT和DMA需要开关总中断
- /* 注意阻塞方式的发送函数不能通过开关中断开操作,避免使用阻塞方式 */
- void BSP_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
- {
- while(huart->gState != HAL_UART_STATE_READY)
- {
- }
- __disable_irq();
- HAL_UART_Transmit_IT(huart, pData, Size);
- __enable_irq();
- }
- void BSP_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
- {
- while(huart->gState != HAL_UART_STATE_READY)
- {
- }
- __disable_irq();
- HAL_UART_Transmit_DMA(huart, pData, Size);
- __enable_irq();
- }
复制代码
空闲中断标志通过__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)获取,清除空闲中断需要使用: /* 清除串口空闲中断 */ __HAL_UART_CLEAR_IDLEFLAG(huart);
空闲中断触发有2种情况使用IT或者DMA,根据标志位来判断当前使用何种方式
HAL_IS_BIT_SET(huart->Instance->CR3,USART_CR3_DMAR);
触发空闲中断以后DMA传输剩余空闲可以通过查询寄存器 rxCnt =__HAL_DMA_GET_COUNTER(huart->hdmarx); 如果是中断方式的传输在5.3提到了中断发送方式有计时器XferCount rxCnt = huart->RxXferCount;
我们发起传输的字节数量存放在XferSize里面 所以接收到多少个字节可以根据 Length = XferSize – rxCnt 计算得出。 当触发空闲中断以后这个时候DMA和IT传输还没有停止所以需要终止本次传输调用接口HAL_UART_AbortReceive(huart); 关闭串口接收。同时设置接收完成标志位,并重新开启IT或DMA接收
为何BspUart_t结构体中接收缓冲区使用指针类型,在定义的时候把全局BUF传给pRxBuf,因为每个串口的BUF区大小是不一样的,这样就不用每个串口定义一个结构体类型了,通过rxSize来定义缓冲区的大小,那为何要使用const呢,一个是比较节省RAM,还有就是size定义完不用修改防止意外修改。但是需要注意的是const变量在结构体变量定义的时候必须赋值,除非你的业务程序中用不到。
|