消息关闭
    暂无新消息!
#include "bsp.h"
#include "test.h"
#include "rcs.h"
#define LEDGPIO     GPIOD
#define RedPin      GPIO_Pin_14
#define GreenPin    GPIO_Pin_12
#define OrangePin   GPIO_Pin_13
#define BluePin     GPIO_Pin_15

#define BtnGPIO     GPIOA
#define BtnPin      GPIO_Pin_0
typedef enum {clicknon, clickonce, clicktwice, clicklong} clicktype;
OS_EVENT *testMsgRed;
OS_EVENT *testMsgBlued;
OS_EVENT *testMsgOrange;
OS_EVENT *testMsgGreen;

OS_EVENT *testSemRed;
OS_EVENT *testSemBlued;
OS_EVENT *testSemOrange;
OS_EVENT *testSemGreen;

int flag1, flag2, flag3, flag4;
clicktype FLAG;

void LEDPortINit(void)
{
    //init led ports
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitTypeDef GPIO_Btn_InitStructure;
    /* Enable GPIO clock */
    RCC_AHB1PeriphClockCmd(GetRCS_RCC_AHB1Periph_GPIO(LEDGPIO), ENABLE);
    /* Enable SYSCFG clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = RedPin | GreenPin | OrangePin | BluePin ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(LEDGPIO, &GPIO_InitStructure);
    //init buttun
    RCC_AHB1PeriphClockCmd(GetRCS_RCC_AHB1Periph_GPIO(BtnGPIO), ENABLE);
    /* Enable SYSCFG clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);


    GPIO_StructInit(&GPIO_Btn_InitStructure);
    GPIO_Btn_InitStructure.GPIO_Pin = BtnPin;
    GPIO_Btn_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_Btn_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Btn_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_Btn_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(BtnGPIO, &GPIO_Btn_InitStructure);

    GPIO_SetBits(LEDGPIO, RedPin | GreenPin | OrangePin | BluePin);//复位后常亮

    // 创建邮箱
    testMsgRed = OSMboxCreate(0);
    testMsgBlued = OSMboxCreate(0);
    testMsgOrange = OSMboxCreate(0);
    testMsgGreen = OSMboxCreate(0);

    // 创建信号量
    testSemRed = OSSemCreate(0);
    testSemBlued = OSSemCreate(0);
    testSemOrange = OSSemCreate(0);
    testSemGreen = OSSemCreate(0);

}
void Btn_task(void *sdf)
{
    clicktype  clicktemp, click;
    uint32_t clicktime;
    click = clicknon;
    while (1)
    {
        clicktemp = clicknon;
        OSTimeDly(1);
        if (GPIO_ReadInputDataBit(BtnGPIO, BtnPin) == SET) //可能有按键
        {
            OSTimeDly(10);
            if (GPIO_ReadInputDataBit(BtnGPIO, BtnPin) == SET) //按键
            {
                clicktemp = clickonce;
            }
            clicktime = OSTimeGet();
            while (GPIO_ReadInputDataBit(BtnGPIO, BtnPin) == SET)
            {
                OSTimeDly(1);
                if ((OSTimeGet() - clicktime) >= 600) //长按
                {
                    clicktemp = clicklong;
                    break;
                }
            }
            OSTimeDly(10);
        }
        while ((OSTimeGet() - clicktime) <= 600 && clicktemp == clickonce)
        {
            OSTimeDly(1);
            if (GPIO_ReadInputDataBit(BtnGPIO, BtnPin) == SET) //可能有按键
            {
                OSTimeDly(10);
                if (GPIO_ReadInputDataBit(BtnGPIO, BtnPin) == SET) //按键
                {
                    clicktemp = clicktwice;//双击
                }
                while (GPIO_ReadInputDataBit(BtnGPIO, BtnPin) == SET)
                {
                    OSTimeDly(1);
                }
                OSTimeDly(10);
            }
        }
        FLAG = clicktemp;
        if ((click = clicktemp) != clicknon)
        {
            GPIO_ResetBits(LEDGPIO, RedPin | GreenPin | OrangePin | BluePin);
            OSMboxPost(testMsgRed, &click);
            OSMboxPost(testMsgBlued, &click);
            OSMboxPost(testMsgOrange, &click);
            OSMboxPost(testMsgGreen, &click);
            if (click == clicklong)
            {
                while (GPIO_ReadInputDataBit(BtnGPIO, BtnPin) == SET)
                {
                    GPIO_SetBits(LEDGPIO, RedPin | GreenPin | OrangePin | BluePin);
                    OSTimeDly(1);
                }
            }
        }
    }
}
void OrangeLed_task(void *sdf)
{
    flag1 = 1;
    int f = 1000;
    clicktype * test;
    while (1)
    {
        OSTimeDly(1);
        test = OSMboxPend(testMsgOrange, 0, (void *)0);
        if (*test == clickonce)
        {
            if (flag1)
            {
                for (int i = 1; i < 4; i++)
                {
                    GPIO_SetBits(LEDGPIO, OrangePin);
                    OSTimeDly(500);
                    GPIO_ResetBits(LEDGPIO, OrangePin);
                    OSTimeDly(500);
                    flag1 = 0;
                }
            }

            while (1)
            {
                OSTimeDly(500);
                GPIO_SetBits(LEDGPIO, OrangePin);
                OSTimeDly(500);
                GPIO_ResetBits(LEDGPIO, OrangePin);
                OSTimeDly(1000);
            }
        }
        else if (*test == clicktwice)
        {
            while (1)
            {
                if (f > 50)
                    f -= 50;
                GPIO_SetBits(LEDGPIO, OrangePin);
                OSTimeDly(f);
                GPIO_ResetBits(LEDGPIO, OrangePin);
                OSTimeDly(f);
            }

        }
        else if (*test == clicklong)
        {
        }
    }
}
void BlueLed_task(void *sdf)
{
    flag2 = 1;
    clicktype *test;
    int f = 1000;
    while (1)
    {

        test = OSMboxPend(testMsgBlued, 0, (void *)0);
        if (*test == clickonce)
        {
            if (flag2)
            {
                for (int i = 1; i < 4; i++)
                {
                    GPIO_SetBits(LEDGPIO, BluePin);
                    OSTimeDly(500);
                    GPIO_ResetBits(LEDGPIO, BluePin);
                    OSTimeDly(500);
                    flag2 = 0;
                }
            }

            while (1)
            {
                GPIO_SetBits(LEDGPIO, BluePin);
                OSTimeDly(500);
                GPIO_ResetBits(LEDGPIO, BluePin);
                OSTimeDly(1500);
            }


        }
        else if (*test == clicktwice)
        {
            while (1)
            {
                if (f > 50)
                    f -= 50;
                GPIO_SetBits(LEDGPIO, BluePin);
                OSTimeDly(f);
                GPIO_ResetBits(LEDGPIO, BluePin);
                OSTimeDly(f);
            }
        }
        else if (*test == clicklong)
        {
        }
        /*

         */
    }
}

void RedLed_task(void *sdf)
{
    flag3 = 1;
    clicktype *test;
    int f = 1000;
    while (1)
    {
        OSTimeDly(1);
        test = OSMboxPend(testMsgRed, 0, (void *)0);
        if (*test == clickonce)
        {
            if (flag3)
            {
                for (int i = 1; i < 4; i++)
                {
                    GPIO_SetBits(LEDGPIO, RedPin);
                    OSTimeDly(500);
                    GPIO_ResetBits(LEDGPIO, RedPin);
                    OSTimeDly(500);
                    flag3 = 0;
                }
            }

            while (1)
            {
                OSTimeDly(1000);
                GPIO_SetBits(LEDGPIO, RedPin);
                OSTimeDly(500);
                GPIO_ResetBits(LEDGPIO, RedPin);
                OSTimeDly(500);
            }

        }
        else if (*test == clicktwice)
        {
            while (1)
            {
                if (f > 50)
                    f -= 50;
                GPIO_SetBits(LEDGPIO, RedPin);
                OSTimeDly(f);
                GPIO_ResetBits(LEDGPIO, RedPin);
                OSTimeDly(f);
            }
        }
        else if (*test == clicklong)
        {

        }
        /*

         */
    }
}

void GreenLed_task(void *sdf)
{
    flag4 = 1;
    int f = 1000;
    clicktype *test;
    while (1)
    {
        OSTimeDly(1);
        test = OSMboxPend(testMsgGreen, 0, (void *)0);
        if (*test == clickonce)
        {
            if (flag4)
            {
                for (int i = 1; i < 4; i++)
                {
                    GPIO_SetBits(LEDGPIO, GreenPin);
                    OSTimeDly(500);
                    GPIO_ResetBits(LEDGPIO, GreenPin);
                    OSTimeDly(500);
                    flag4 = 0;
                }
            }
            while (1)
            {
                OSTimeDly(1500);
                GPIO_SetBits(LEDGPIO, GreenPin);
                OSTimeDly(500);
                GPIO_ResetBits(LEDGPIO, GreenPin);
            }


        }
        else if (*test == clicktwice)
        {
            while (1)
            {
                if (f > 50)
                    f -= 50;
                GPIO_SetBits(LEDGPIO, GreenPin);
                OSTimeDly(f);
                GPIO_ResetBits(LEDGPIO, GreenPin);
                OSTimeDly(f);
            }
        }
        else if (*test == clicklong)
        {

        }
        /*

         */

    }
}
为什么我单击按键之后,再双击按键,没有切换LED的状态啊,求大神指教

2个回答

︿ 0
你的检查按键的代码是不是有问题,经常OSTimeDly引起任务调度,双击判断是否正确,你最好能输出一些信息到串口,然后看程序运行是否跟你想的一致。如果有仿真器,直接调试。

通知那部分一个信号量就够了,搞那么多个信号量和消息邮箱干什么?