ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32F103串口接收数据,多字节触发中断接收数据,DMA空闲中断接受,空闲中断触发中断。

STM32F103串口接收数据,多字节触发中断接收数据,DMA空闲中断接受,空闲中断触发中断。 2.知识点2.1多字节中断接收指定字节数据在STM32cubemx中开启串口全局中断。在程序初始化编写接收中断函数。启用接收中断回调函数。并要开启下一次中断接受函数否则将不接收数据。在串口全局中断服务函数调用接收中断函数。HAL_UART_Receive_IT(huart1,g_Comm1RxBuffer,8); void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART1) { //g_Comm1RxBuffe数据缓存区串口接收到8字节触发中断这儿将对接收到的数据进行处理 USART1DataRecv(); } }2.2 DMA加空闲中断回调函数接收不定量数据在STM32cubamx中配置DMA通道。在程序初始化编写使能空闲中断和串口DMA接收中断函数。在串口全局中断服务函数调用自定义中断服务函数。编写中断服务函数和空闲中断服务函数。2.3串口空闲中断接受不定量数据程序初始化编写空闲中断接收函数。调用空闲中断回调函数。__HAL_UART_ENABLE_IT(huart3, UART_IT_IDLE); //使能IDLE中断 //DMA接收函数此句一定要加不加接收不到第一次传进来的实数据是空的且此时接收到的数据长度为缓存器的数据长度 HAL_UART_Receive_DMA(huart3, g_Comm3RxBuffer, BUFFER_SIZE);//重新打开DMA接收不然只能接收一次数据 ​ ​ void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart) { //注意大量数据时temp、g_Comm3RxBuffer_lenth为uint32_t ,不能写uint8_t否则会超过254就出现问题了。 //在数据量明确并且少量的情况下可以用uint8_t。 uint32_t temp0; HAL_UART_DMAStop(huart3); //停止DMA temp __HAL_DMA_GET_COUNTER(hdma_usart3_rx);// 获取DMA中未传输的数据个数 g_Comm3RxBuffer_lenth BUFFER_SIZE - temp; //总计数减去未传输的数据个数得到已经接收的数据个数 //控制逻辑。。。。。。 //HAL_UART_Transmit(huart3, g_Comm3RxBuffer,g_Comm3RxBuffer_lenth,1000); // memset(g_Comm3RxBuffer,0,g_Comm3RxBuffer_lenth); HAL_UART_Receive_DMA(huart3, g_Comm3RxBuffer,BUFFER_SIZE); } void USER_UART_IRQHandler(UART_HandleTypeDef *huart) { //DMA的通道每个芯片会有差异有些串口没有DMA,所以在这儿不写其他的接口需要时添加即可。 if(huart-InstanceUSART3) { // 判断是否是空闲中断 if(RESET ! __HAL_UART_GET_FLAG(huart3, UART_FLAG_IDLE)) { // 清除空闲中断标志否则会一直不断进入中断 __HAL_UART_CLEAR_IDLEFLAG(huart3); // 调用空闲中断处理函数 HAL_UART_IdleCpltCallback(huart); } } }HAL_UARTEx_ReceiveToIdle_IT(huart5,Rxbuffer,1024); ​ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { if(huart-InstanceUART5) { //数据存到了Rxbuffer,长度为函数参数Size。 //HAL_UART_Transmit(huart1,Rxbuffer,Size,100); memset(Rxbuffer,0,sizeof(Rxbuffer)); HAL_UARTEx_ReceiveToIdle_IT(huart5,Rxbuffer,1024); } }
返回列表