STM32C542RC开发板启用PWM后对串口通讯造成影响
说说我今天使用CUBEMX2的感受
L9663驱动开发
完成了STM32C542RC开发板的串口通讯实验的视频
终于找到了STM32C542RC开发板的官方实例
STM32C542RC开发板的串口DMA发送实验出错(已解决)
使用我自己写的 IAP 跳转到 FLASH 应用程序时,串口上出现无关字节
STM32G071C8的ADC问题,测量6路交流信号,端口使用PA2-PA7,信号来自电流互感器次级用20欧电阻转为电压信号,并联T4,通过1K,104滤波后到ADC引脚,个别芯片出现PA3结果是固定值,即使直接把引脚对地短短接,结果也是2000多个数,可能是什么原因
STM32L562DK探索板——串口通讯重定向出错
Error[Lp015]: section placement failure内容占用溢出
微信公众号
手机版
网上不少类似案例分享,稍微比较下。 如果使用ST库的话,
注意你的第二次是否真的发送了,里面有些类似gState状态机
的变量,看看是否在ready状态。
HAL库,自定义空闲中断回调,在串口中断服务函数中调用。在其他位置进行发送接收数组(阻塞),这种情况下可以正常接收,包含接收个数第二次也正常。如果使用DMA发送就会导致第二次接收长度为0,接收DMA配置为一般模式,发送DMA循环模式。接收串口在自定义回调函数中重新开启了DMA串口接收。 在测试过程中仅更改了串口发送方式,DMA(非阻塞)和阻塞发送。不理解为什么串口发送影响了串口接收。
HAL_UART_Transmit(&huart3 ,USART3_Struct.rxbuf, 16 , 10);
HAL_UART_Transmit_DMA(&huart3 ,USART3_Struct.rxbuf, 16);
void USR_UART_IdleRxCpltCallback(UART_HandleTypeDef *huart) { if( huart->Instance == USART3) { if ( USART3_Struct.Busyflag == 0 ) { USART3_Struct.usart3_rxbuf_len = rxbuffsize - (__HAL_DMA_GET_COUNTER(&hdma_usart3_rx));//接收个数 if( USART3_Struct.usart3_rxbuf_len != 16 )//判断接收数据长度是否正常,如果异常就回复数据长度错误 { //长度错误 } if(USART3_Struct.usart3_rxbuf_len==16)//数据长度正常,未处于解析命令状态 { //拷贝数组 for(uint8_t i=0; i < USART3_Struct.usart3_rxbuf_len ;i++) { USART3_Struct.rxbuf[i]=USART3_Struct.usart3_rxbuf[i];//将收到的数组放到解析缓存数组里去 } //主函数轮询标志位->解析数据缓存Buf memset(USART3_Struct.usart3_rxbuf , 0x00 , USART3_Struct.usart3_rxbuf_len);//清空DMA接收缓冲区 } HAL_UART_Receive_DMA(&huart3, USART3_Struct.usart3_rxbuf , rxbuffsize);//重新开启DMA USART3_Struct.Rxflag = 1;//接收完成标志位 USART3_Struct.Busyflag = 1; //正在解析标志位 }
}
[md]应该不会有影响。idle中断可以不用自定义,建议使用新函数
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)。看看是不是你的代码在ISR中将DMA停止了
在接收中断里,如果DMA是normal 模式,看起来是停掉了。
可以在回调函数里接着再使能。
楼主可以再调试一下,看看是不是这么回事。