|
本帖最后由 从未遗忘 于 2023-11-30 17:32 编辑
今天写DMA的时候发现,串口在开启DMA时, DMA中断函数 和 串口回调函数 都可以完成同样的回调处理,那DMA模式和回调函数方式谁更好呢?DMA中断函数比如DMA1_Channel1_IRQHandler频繁进中断,在使用时会影响CPU工作吗?因为是中断,但是我不确定DMA的中断也是CPU处理吗?
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
uint8_t tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
if((tmp_flag != RESET))//通过标志位判断接收是否结束
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
HAL_UART_DMAStop(&huart1);
uint8_t temp=__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
UART3_LEN =UART3_RX_BUF_SIZE-temp; //计算出数据长度
HAL_UART_Transmit_DMA(&huart1,g_RxBuf3,UART3_LEN);
HAL_UART_Receive_DMA(&huart1,g_RxBuf3,UART3_RX_BUF_SIZE);//开启DMA接收,方便下一次接收数据
}
}
void DMA1_Channel1_IRQHandler(void)
{
uint8_t tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
if((tmp_flag != RESET))//通过标志位判断接收是否结束
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
HAL_UART_DMAStop(&huart1);
uint8_t temp=__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
UART3_LEN =UART3_RX_BUF_SIZE-temp; //计算出数据长度
HAL_UART_Transmit_DMA(&huart1,g_RxBuf3,UART3_LEN);
HAL_UART_Receive_DMA(&huart1,g_RxBuf3,UART3_RX_BUF_SIZE);//开启DMA接收,方便下一次接收数据
}
}
在实际测试如果收发同时进行,如果发的快了,回调函数会有一直传0的现象。感觉DMA1_Channel1_IRQHandler处理更稳定呢?
|
|