打印
[STM32F0]

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

[复制链接]
729|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2024-9-30 15:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我跑裸机的时候在中断里面接收到数据就马上发送出来没有问题,但是在Ucos系统下只有第一次进了UART中断服务程序,ucos其它任务照常运行。这是怎么回事?(备注:接收的是GPS模块传过来的数据,然后在任务中串口输出是没问题的,就是中断接收有问题)
中断服务程序如下:
void USART1_IRQHandler(void)
{
        INT8U i = 0;
        OS_CPU_SR  cpu_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_InitTypeDef  NVIC_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_InitTypeDef  GPIO_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中断。

使用特权

评论回复
5
flycamelaaa| | 2024-11-2 10:40 | 只看该作者
中断标志位未清除?

使用特权

评论回复
6
powerantone| | 2024-11-2 10:59 | 只看该作者
如果UART中断服务函数的逻辑存在错误,例如没有正确读取数据或处理数据后没有重新使能中断,那么中断可能只会被触发一次。

使用特权

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

使用特权

评论回复
8
probedog| | 2024-11-2 12:00 | 只看该作者
检查并设置正确的中断优先级

使用特权

评论回复
9
classroom| | 2024-11-2 13:06 | 只看该作者
在中断处理函数中清除中断标志位试试

使用特权

评论回复
10
probedog| | 2024-11-2 14:00 | 只看该作者
检查中断服务函数的逻辑是否有误

使用特权

评论回复
11
classroom| | 2024-11-2 15:26 | 只看该作者
调整任务优先级或中断优先级

使用特权

评论回复
12
温室雏菊| | 2024-11-3 01:00 | 只看该作者
在STM32F072上运行UCOS时,如果只有第一次进入UART中断服务程序,可能是由于中断优先级配置错误

使用特权

评论回复
13
失物招領| | 2024-11-3 02:00 | 只看该作者
检查NVIC_Init()函数中的中断优先级配置。确保UART中断的优先级高于其他可能抢占的中断

使用特权

评论回复
14
我吃小朋友| | 2024-11-3 03:00 | 只看该作者
UART中断标志未清除,确保在中断服务程序中正确清除UART中断标志

使用特权

评论回复
15
一只眠羊| | 2024-11-3 04:00 | 只看该作者
UCOS任务调度问题,UCOS的任务调度可能会影响中断的处理。确保UCOS的任务调度配置正确。确保UCOS的任务调度配置正确。检查UCOS的任务优先级和中断优先级的关系

使用特权

评论回复
16
未说出口的像你| | 2024-11-3 05:00 | 只看该作者
UART配置问题,保证UART的配置正确,包括波特率、数据位、停止位等

使用特权

评论回复
17
春日负喧| | 2024-11-3 06:00 | 只看该作者
中断向量表配置,确保中断向量表配置正确,并且中断服务程序正确链接。检查中断向量表配置。确保中断服务程序正确链接

使用特权

评论回复
18
在曼谷的春| | 2024-11-3 07:00 | 只看该作者
那你估计是哪里的标记没清除吧

使用特权

评论回复
19
月亮一键变蓝| | 2024-11-3 08:00 | 只看该作者
一般来说,这种情况可能是中断配置优先级之类的有问题了

使用特权

评论回复
20
将爱藏于深海| | 2024-11-3 09:00 | 只看该作者
你可以仿真的方式看看你程序工作流程啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

440

主题

1669

帖子

1

粉丝