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

2019-07-14 13:48发布

我跑裸机的时候在中断里面接收到数据就马上发送出来没有问题,但是在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);  
        
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
不要懒惰0812
1楼-- · 2019-07-15 10:32
kghfh 发表于 2019-3-7 21:02
In single buffer mode, clearing the RXNE bit is performed by a software read to the USARTx_RDR register,说的是在single buffer 模式 是在软件读USARTx_RDR 的时候产生的清楚RXNE 位,while(USART_GetFlagStatus(F072RB_COM, USART_FLAG_RXNE) == RESET);//这句话应该是当有数据的时候RXNE置位1这时才读取读取完自动 ...

之前逻辑乱了,是寄存器接收完数据后才会往下执行,我刚用if来接收,在裸机状态下也可以了,就是跑操作系统时不行
冬冬5241
2楼-- · 2019-07-15 13:29
中断服务程序中,前后加上OSIntEnter();OSIntExit();
如果不行,是不是中断任务切换程序出错.
TOPCB
3楼-- · 2019-07-15 14:01
你看一下标志位,是不是串口接收中断产生的。还有看一下溢出中断标志位。
不要懒惰0812
4楼-- · 2019-07-15 16:38
这跟变量没关系吧,接收寄存器是16位的,我初始化时设置是八位,我是接收1字节发送1字节,一个unsigned char型的就行了
不要懒惰0812
5楼-- · 2019-07-15 18:18
 精彩回答 2  元偷偷看……
TOPCB
6楼-- · 2019-07-15 19:26
还是把你的配置代码发一下吧。

一周热门 更多>