duo点 发表于 2024-9-30 15:21

STM32F072在跑UCOS时只有第一次进了UART中断服务程序

我跑裸机的时候在中断里面接收到数据就马上发送出来没有问题,但是在Ucos系统下只有第一次进了UART中断服务程序,ucos其它任务照常运行。这是怎么回事?(备注:接收的是GPS模块传过来的数据,然后在任务中串口输出是没问题的,就是中断接收有问题)
中断服务程序如下:
void USART1_IRQHandler(void)
{
      INT8U i = 0;
      OS_CPU_SRcpu_sr;

       OS_ENTER_CRItiCAL();                        
       OSIntNesting++;
       OS_EXIT_CRITICAL();

       while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
      {
      }
      i = USART_ReceiveData(USART1);
      printf("%c",i);
      OSIntExit();
}
初始化那些应该没问题,跑裸机是可以的
下面是初始化程序:
void NvicInit(void)
{
      
      NVIC_InitTypeDefNVIC_InitStructure;

      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
      NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPriority = 0x03;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
}

void UartInit(void)
{
                INT8U i;

      GPIO_InitTypeDefGPIO_InitStructure;
      USART_InitTypeDef USART_InitStructure;

      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA   , ENABLE);   // 使能GPIOA端口
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1   , ENABLE); // 使能串口1时钟
   
      GPIO_PinAFConfig(GPIOA ,GPIO_PinSource9, GPIO_AF_1);
      GPIO_PinAFConfig(GPIOA ,GPIO_Pin_10, GPIO_AF_1);                           
/////////////////////////////////////////////////////////////////////////////////////      
      /* PA9==TX PA10-RX*/

      GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9 ;               
      GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);

      GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10 ;
      GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP;      
      GPIO_Init(GPIOA , &GPIO_InitStructure);
/////////////////////////////////////////////////////////////////////////////////////

      USART_InitStructure.USART_BaudRate = 9600;                                       
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;                  
      USART_InitStructure.USART_StopBits = USART_StopBits_1;                        
      USART_InitStructure.USART_Parity = USART_Parity_No;                           
      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
      USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;               
      USART_Init(USART1, &USART_InitStructure);         //串口配置

      USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);//打开中断      
                              
      USART_Cmd(USART1, ENABLE);//使能串口1
      USART_ClearFlag(USART1, USART_FLAG_TC);
      
}

在水一方00 发表于 2024-9-30 23:50

统下只有第一次进了UART中断服务程序,ucos

laocuo1142 发表于 2024-11-2 10:07

可能是通用接收中断的优先级设置不正确

classroom 发表于 2024-11-2 10:11

如果可能的话,使用STM32的HAL库或标准外设库来配置UART中断。

flycamelaaa 发表于 2024-11-2 10:40

中断标志位未清除?

powerantone 发表于 2024-11-2 10:59

如果UART中断服务函数的逻辑存在错误,例如没有正确读取数据或处理数据后没有重新使能中断,那么中断可能只会被触发一次。

stormwind123 发表于 2024-11-2 11:23

在UCOS操作系统中,任务调度和中断处理需要特别注意。如果中断服务函数中没有正确调用OSIntExit()函数来退出中断服务并允许其他任务运行,或者中断优先级和任务优先级之间的设置不合理,都可能导致中断只被触发一次。

probedog 发表于 2024-11-2 12:00

检查并设置正确的中断优先级

classroom 发表于 2024-11-2 13:06

在中断处理函数中清除中断标志位试试

probedog 发表于 2024-11-2 14:00

检查中断服务函数的逻辑是否有误

classroom 发表于 2024-11-2 15:26

调整任务优先级或中断优先级

温室雏菊 发表于 2024-11-3 01:00

在STM32F072上运行UCOS时,如果只有第一次进入UART中断服务程序,可能是由于中断优先级配置错误

失物招領 发表于 2024-11-3 02:00

检查NVIC_Init()函数中的中断优先级配置。确保UART中断的优先级高于其他可能抢占的中断

我吃小朋友 发表于 2024-11-3 03:00

UART中断标志未清除,确保在中断服务程序中正确清除UART中断标志

一只眠羊 发表于 2024-11-3 04:00

UCOS任务调度问题,UCOS的任务调度可能会影响中断的处理。确保UCOS的任务调度配置正确。确保UCOS的任务调度配置正确。检查UCOS的任务优先级和中断优先级的关系

未说出口的像你 发表于 2024-11-3 05:00

UART配置问题,保证UART的配置正确,包括波特率、数据位、停止位等

春日负喧 发表于 2024-11-3 06:00

中断向量表配置,确保中断向量表配置正确,并且中断服务程序正确链接。检查中断向量表配置。确保中断服务程序正确链接

在曼谷的春 发表于 2024-11-3 07:00

那你估计是哪里的标记没清除吧

月亮一键变蓝 发表于 2024-11-3 08:00

一般来说,这种情况可能是中断配置优先级之类的有问题了

将爱藏于深海 发表于 2024-11-3 09:00

你可以仿真的方式看看你程序工作流程啊
页: [1]
查看完整版本: STM32F072在跑UCOS时只有第一次进了UART中断服务程序