官方实验板nucleo用的串口二所以配置串口二,PA2 PA3
中断函数:
void USART2_LPUART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_LPUART2_IRQn 0 */
/* USER CODE END USART2_LPUART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
uint32_t temp;
if(USART2 == huart2.Instance)//
{
if(RESET != __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE))// 判断空闲中断
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);//清中断
HAL_UART_DMAStop(&huart2);//停止DMA,防止数据覆盖
temp = __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);//DMA接受剩余字节数
Rx_len = 250 - temp; //本次接受到的字节数Rx_len
sendflag=1;
}
}
主函数里面:
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);//先使能空闲中断
while (1)
{
if(sendflag==1)
{
memcpy(aTxBuffer,aRxBuffer,Rx_len); //Rx复制到Tx
HAL_UART_Receive_DMA(&huart2, (uint8_t *)aRxBuffer, 250);
//重新设置DMA接受
HAL_UART_Transmit_DMA(&huart2, (uint8_t *)aTxBuffer, Rx_len);
//开启DMA发送,即把接受的发送出去
sendflag=0;
}
}
注意事项:
1串口中断和DMA中断都是打开的,在串口中断里面处理就可以了
2DMA模式选择正常模式DMA_NORMAL,而不是循环模式
3__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);需要使能空闲中断
4没有重定义和使用中断回调函数HAL_UART_RxCpltCallback
版权声明:本文为CSDN博主「李嗷纳多」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37738150/article/details/121588960
暂无评论