老是看别人的,总是有这样那样的问题,今天mark一下:
1.STM32CubeMX 创建工程,设置USART
添加 DMA RX
中断函数里:
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint32_t tmp_flag = 0;
volatile uint8_t rx_len=0;
volatile uint32_t temp;
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
// 注意主要代码要放在 HAL_UART_IRQHandler(&huart1) 下面,不然容易出现莫名其妙的问题
tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
if((tmp_flag != RESET))//idle标志被置位
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
temp = huart1.Instance->SR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
temp = huart1.Instance->DR; //读取数据寄存器中的数据
HAL_UART_DMAStop(&huart1); //
//__HAL_DMA_GET_COUNTER
temp = hdma_usart1_rx.Instance->NDTR;// 获取DMA中未传输的数据个数,NDTR寄存器分析见下面
rx_len = RX_BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
memcpy(usart1_recv.recv_buf,rx1_buffer,rx_len);
usart1_recv.recv_len = rx_len;
usart1_recv.flag = 1;// 接受完成标志位置1
__HAL_DMA_SET_COUNTER(&hdma_usart1_rx,RX_BUFFER_SIZE);
HAL_UART_Receive_DMA(&huart1,rx1_buffer,RX_BUFFER_SIZE);
}
/* USER CODE END USART1_IRQn 1 */
}
好了,main函数里 ,开启中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能idle中断
HAL_UART_Receive_DMA(&huart1,rx1_buffer,RX_BUFFER_SIZE);//打开DMA接收,数据存入rx_buffer数组中
while循环里,判断
if(usart2_recv.flag)
{
usart2_recv.flag = 0;//使用你收到的数据吧
usart1_recv.recv_len,usart1_recv.recv_buf[]
}