使用STM32F1做串口通信测试,想试一下在921600波特率下通信是否稳定,stm32cubemx自动生成代码,开启了两个中断,一个定时器Tim2(每1ms中断1次),一个Usart1中断(在中断里面把接收到的1个字符发送出去)。没有启动Tim2中断前,串口能随时发随时收。 void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ uint8_t ch[2]; /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ HAL_UART_Receive(&huart1,ch,1,100); HAL_UART_Transmit(&huart1,ch,1,100); __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE); /* USER CODE END USART1_IRQn 1 */ } 主程序啥也不干,空转。 使用了Tim2中断,并且在Tim2里面设置断点,暂停一下,串口就不能接受数据了,再也进不了接收中断。查看寄存器状态,应该是串口连续接收到数据,未能及时响应,造成了ORE故障。所以,只要开启多个中断,串口接收处理不及时,都会产生ORE错误。 请教大家,我是不是在主程序里需要加入ORE故障判断并清除的代码?看了那么多代码,没有见到谁的主程序有判断ORE的代码,也没见人提到过,各位专家是怎么解决的,敬请指教。 |
STM32H747的串口加DMA
能在一个程序中同时使用TIM的callback和uart的callback函数吗?
TCP客户端 周期性 发送数据,一段时间后会突然停止,是什么原因。
STM32F103VCT6有64K的RAM?
cubemx配置开发板引脚但已经被占用
使用串口双机通信的问题
如何添加一个中断服务函数?
Proteus是否无法正确仿真STM32的开漏输出
Cortex m3内核是很特殊吗,为什么st公司的很多软件比如cubemx.ai唯独不支持m3内核的stm32f1系列
stm32f103c8t6串口发送大量hex数据失效。
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_PE);//清标志
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_FE);
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_NE);
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE);
手册上指出,相ORE时候,先读SR,再读DR 可以清除ORE
我想在主循环里面加个判断,处理这个小概率事件,毕竟有可能发生。
我不知道HAL库怎么写清除代码。
你的921600波特率,速度太快了,差不多1us 中断了,改用DMA接收
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
//HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE))
{
HAL_UART_Receive(&huart1,ch,1,100);
flag = 1;
}
__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);
/* USER CODE END USART1_IRQn 1 */
}
接收中断函数,写成这样就没问题了,有ORE也没关系,不执行HAL_UART_IRQHandler(&huart1);