求助,关于STM32开发板。。这是我的任务 : 1.至少建立3个任务 2.复位后所有led长亮 3.在一个任务中单独对按键状态进行判断 4.单击按键,所有灯

qq_32613023 2016-08-16 04:51:44
#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的状态啊,求大神指教
...全文
1173 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32613023 2016-08-16
  • 打赏
  • 举报
回复
可是我昨天用这个按键的代码去做另一个是可以的。。。
  • 打赏
  • 举报
回复
你的检查按键的代码是不是有问题,经常OSTimeDly引起任务调度,双击判断是否正确,你最好能输出一些信息到串口,然后看程序运行是否跟你想的一致。如果有仿真器,直接调试。 通知那部分一个信号量就够了,搞那么多个信号量和消息邮箱干什么?

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧