
使用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的代码,也没见人提到过,各位专家是怎么解决的,敬请指教。 |
求助,使用51单片机和VL6180X传感器测距,结果一直是0是什么原因,能读到ID为0xB4
STM32F103TBU6 封装是VFQFPN36 将PD0和PD1配置成CAN不成功是什么原因
串口DMA + 空闲中断收发 ?
F103RCT6芯片对AFIO->MAPR寄存器写入时出错
使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准确的问题
WS2812B怎么显示任意字符 / 图案?
STM32F103RCT6 定位孔 镂空,会影响使用吗?
HAL库1.8.4在做破坏性测试的时候出现g_state永远为busy的情况导致串口通信发送卡死
L9663驱动开发
用rt_thread 环境编写,DAP-LINK 下载烧录,每一次空芯片下载之后就无法二次下载。求解
__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);