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);
} 统下只有第一次进了UART中断服务程序,ucos 可能是通用接收中断的优先级设置不正确 如果可能的话,使用STM32的HAL库或标准外设库来配置UART中断。 中断标志位未清除? 如果UART中断服务函数的逻辑存在错误,例如没有正确读取数据或处理数据后没有重新使能中断,那么中断可能只会被触发一次。 在UCOS操作系统中,任务调度和中断处理需要特别注意。如果中断服务函数中没有正确调用OSIntExit()函数来退出中断服务并允许其他任务运行,或者中断优先级和任务优先级之间的设置不合理,都可能导致中断只被触发一次。 检查并设置正确的中断优先级 在中断处理函数中清除中断标志位试试 检查中断服务函数的逻辑是否有误 调整任务优先级或中断优先级 在STM32F072上运行UCOS时,如果只有第一次进入UART中断服务程序,可能是由于中断优先级配置错误 检查NVIC_Init()函数中的中断优先级配置。确保UART中断的优先级高于其他可能抢占的中断 UART中断标志未清除,确保在中断服务程序中正确清除UART中断标志 UCOS任务调度问题,UCOS的任务调度可能会影响中断的处理。确保UCOS的任务调度配置正确。确保UCOS的任务调度配置正确。检查UCOS的任务优先级和中断优先级的关系 UART配置问题,保证UART的配置正确,包括波特率、数据位、停止位等 中断向量表配置,确保中断向量表配置正确,并且中断服务程序正确链接。检查中断向量表配置。确保中断服务程序正确链接 那你估计是哪里的标记没清除吧 一般来说,这种情况可能是中断配置优先级之类的有问题了 你可以仿真的方式看看你程序工作流程啊
页:
[1]