硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4193|回复: 2
收起左侧

[μCOS-III] 停机模式下唤醒一些问题

[复制链接]

6

主题

5

回帖

4

积分

新手上路

积分
4
发表于 2015-11-25 17:25:50 | 显示全部楼层 |阅读模式
我存在两个任务,一个任务是用来进入stop,另一个任务是测试唤醒次数(任务自己挂起自己,由串口接收到数据恢复)
具体设计思路是这样子,PA10作为停机模式的唤醒管脚,串口第一个字符串是用来唤醒STOP模式,唤醒之后就作为串口的接收,串口接收到数据就恢复挂起的task2;
具体代码,如下:

//task1任务函数
void task1_task(void *p_arg)
{
    u8 task1_num=0;
    OS_ERR err;
    OS_TICK CurTick=0;
    OS_TICK DelayTick=0;
    u32 delay;
    CPU_SR_ALLOC();
    p_arg = p_arg;

    intostop=1;

    while(1)
    {

        if(intostop)
        {
            CurTick=OSTimeGet(&err);
            printf("Cur Tick :%d\r\n",CurTick);
//            CPU_CRITICAL_ENTER();
            USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启中断
            Usart_IRQ_Set(1);
//            CPU_CRITICAL_EXIT();
            USART_Cmd(USART1, DISABLE);   
            SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* 关闭滴答定时器 */
            PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
            Usart_IRQ_Set(0);
            delay=1000;   //5000 -1000
            while(delay)
            {
                    delay--;
            }
            CPU_CRITICAL_ENTER();
            intostop=0;
            SystemInit();
            delay=1000;   //5000 -1000
            while(delay)
            {
                    delay--;
            }
            SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; /* 使能滴答定时器 */  
                                 //屏蔽Line 10中断
            USART_Cmd(USART1, ENABLE);
            USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
            DelayTick=GetMinDelaytime();
            printf("Delay Tick :%d\r\n",DelayTick);
            if(CurTick+10<DelayTick)
            {
                OSTimeSet(CurTick+10,&err);
            }
            else
            {
                OSTimeSet(DelayTick-1,&err);
            }
            CPU_CRITICAL_EXIT();
            OSTaskSuspend((OS_TCB*)&Task1_TaskTCB,&err);//任务1执行5次后挂起任务2
        }
        OSTimeDlyHMSM(0,0,0,1,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
//        OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err);    //任务1运行10次后恢复任务2
    }
}

//task2任务函数
void task2_task(void *p_arg)
{
    u32 task2_num=0;
    OS_ERR err;

    CPU_SR_ALLOC();
    p_arg = p_arg;

    while(1)
    {

        task2_num++;
//        OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
        intostop=1;
//        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启中断
        Usart_IRQ_Set(1);
        OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);//任务1执行5次后挂起任务2
        OSTaskResume((OS_TCB*)&Task1_TaskTCB,&err);    //任务1运行10次后恢复任务2
        CPU_CRITICAL_ENTER();
        printf("唤醒任务次数:%d次\r\n",task2_num);

        CPU_CRITICAL_EXIT();

    }
}

void EXTI15_10_IRQHandler(void)                      //串口中断唤醒服务函数
{
    EXTI_ClearITPendingBit(EXTI_Line10);  //清除EXTI0线路挂起位

    OSIntEnter();
//    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
    OSIntExit();  
}

void Usart_IRQ_Set(u8 en)
{

    EXTI-&gtR=1<<10;  //清除LINE11上的中断标志位

    if(en)EXTI->IMR|=1<<10;//不屏蔽line11上的中断

    else EXTI->IMR&=~(1<<10);//屏蔽line11上的中断  
}


void USART1_IRQHandler(void)                    //串口1中断服务程序
    {
    OS_ERR err;
    u8 Res;
    OSIntEnter();   

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
        {
        Res =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据
        OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err);    //任务1运行10次后恢复任务2

     }
    OSIntExit();                                               
}


我本想串口唤醒一次task2后,我就把相应的接收中断给关掉,USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启中断,但是,跑十来次就挂了,屏蔽就可以。然后我开启Line10中断来实现屏蔽串口接收中断,这样子就可以。
汉子哥,能否帮忙看一下,搞一天了。谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2015-11-26 09:00:43 | 显示全部楼层
从停机模式恢复后要重新配置RCC的,当一个中断或唤醒事件导致退出停止模式时, HSI RC振荡器被选为系统时钟

要不串口没法用。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2015-11-26 09:01:36 | 显示全部楼层
看到你调用这个重新配置函数了  SystemInit();
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 18:27 , Processed in 0.150947 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表