初级会员
积分 65
金钱 65
注册时间 2020-5-6
在线时间 43 小时
10 金钱
在ucos上用任务的方式可以实现
#define KEY1 PBin(12)
#define KEYPORT GPIOB
//START èÎÎñ
//éèÖÃèÎÎñóÅÏè¼¶
#define START_TASK_PRIO 10 ///¿aê¼èÎÎñμÄóÅÏè¼¶Îa×îμí
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define START_STK_SIZE 128
//èÎÎñèÎÎñ¶ÑÕ»
OS_STK START_TASK_STK[START_STK_SIZE];
//èÎÎñoˉêy
void start_task(void *pdata);
//LED0èÎÎñ
//éèÖÃèÎÎñóÅÏè¼¶
#define LED0_TASK_PRIO 7
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define LED0_STK_SIZE 64
//èÎÎñ¶ÑÕ»
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//èÎÎñoˉêy
void led0_task(void *pdata);
//LED1èÎÎñ
//éèÖÃèÎÎñóÅÏè¼¶
#define LED1_TASK_PRIO 6
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define LED1_STK_SIZE 64
//èÎÎñ¶ÑÕ»
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//èÎÎñoˉêy
void led1_task(void *pdata);
//¸¡μã2aêÔèÎÎñ
#define FLOAT_TASK_PRIO 5
//éèÖÃèÎÎñ¶ÑÕ»′óD¡
#define FLOAT_STK_SIZE 128
//èÎÎñ¶ÑÕ»
//èç1ûèÎÎñÖDê1óÃprintfà′′ò󡸡μãêy¾YμÄ»°ò»μãòa8×Ö½ú¶ÔÆë
__align(8) OS_STK FLOAT_TASK_STK[FLOAT_STK_SIZE];
//èÎÎñoˉêy
extern void TIM4_PWM_Init(u16 arr,u16 psc);
int sys_led_ctrl(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,uint8_t state);
void float_task(void *pdata);
void Init_KEYpin(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEYPORT,&GPIO_InitStructure);
//GPIO_ResetBits(GPIOB,KEY1);
}
int main(void)
{
delay_init(); //Ñóê±3õê¼»ˉ
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÖD¶Ï·Ö×éÅäÖÃ
uart_init(115200); //′®¿ú2¨ìØÂêéèÖÃ
LED_Init(); //LED3õê¼»ˉ
Init_KEYpin();
//TIM4_PWM_Init(3599,0);
OSInit(); //UCOS3õê¼»ˉ
OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //′′½¨¿aê¼èÎÎñ
OSStart(); //¿aê¼èÎÎñ
}
//¿aê¼èÎÎñ
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata=pdata;
OSStatInit(); //¿aÆôí3¼ÆèÎÎñ
OS_ENTER_CRITICAL(); //½øèëáù½çÇø(1رÕÖD¶Ï)
//OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);//′′½¨LED0èÎÎñ
OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);//′′½¨LED1èÎÎñ
OSTaskCreate(float_task,(void*)0,(OS_STK*)&FLOAT_TASK_STK[FLOAT_STK_SIZE-1],FLOAT_TASK_PRIO);//′′½¨¸¡μã2aêÔèÎÎñ
OSTaskSuspend(START_TASK_PRIO);//1òÆe¿aê¼èÎÎñ
OS_EXIT_CRITICAL(); //íË3öáù½çÇø(¿aÖD¶Ï)
}
int key=0;
/*void led0_task(void *pdata)
{
printf("led0_task = 0 ......\n");
int key1,key2;
while(1)
{
key1 = PBin(12);
delay_ms(50);
key2 = PBin(12);
if(key1==key2)
{
key=key1;
}
}
}
*/
int flag =0;
#define TIME 5000
void delay_led(uint32_t counter)
{
while (counter --);
}
int sys_led_ctrl(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,uint8_t state) {
int i, b;
if(state == 0 )
{
flag = flag +1;
if(flag > 2)
{
flag =0;
}
}
if(flag ==1)
{
b = TIME-3000;
}
else if(flag == 2)
{
b=TIME;
}
else
{
b = 0;
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
}
if(b!=0)
{
GPIO_ResetBits(GPIOx, GPIO_Pin);
delay_led(TIME-b);
GPIO_SetBits(GPIOx, GPIO_Pin);
delay_led(b);
}
return 0;
}
//LED1èÎÎñ
void led1_task(void *pdata)
{
int k=0;
while(1)
{
if(k!=key)
{
sys_led_ctrl(GPIOA,GPIO_Pin_5,0);
k = key;
}
else
{
sys_led_ctrl(GPIOA,GPIO_Pin_5,1);
}
}
}
//¸¡μã2aêÔèÎÎñ
void float_task(void *pdata)
{
printf("led0_task = 0 ......\n");
int key1,key2;
while(1)
{
delay_ms(70);
key1 = PBin(12);
delay_ms(70);
key2 = PBin(12);
if(key1==key2&&key1==0)
{
printf("key1 = %d ......\n",key1);
key++;
}
}
}
在裸机上不能实现
int key=0;
int flag = 0;
#define KEY1 PBin(12)
#define KEYPORT GPIOB
#define TIME 1000
int sys_led_ctrl(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,uint8_t state) {
int i, b;
if(state == 0 )
{
flag = flag +1;
if(flag > 2)
{
flag =0;
}
}
if(flag ==1)
{
b = TIME-500;
}
else if(flag == 2)
{
b=TIME;
}
else
{
b = 0;
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
}
if(b!=0)
{
GPIO_ResetBits(GPIOx, GPIO_Pin);
delay_led(TIME-b);
GPIO_SetBits(GPIOx, GPIO_Pin);
delay_led(b);
}
return 0;
int main {
int k =0;
int key1=0;
int key2=0;
while(1)
{
key1 = PBin(12);
delay_ms(10);
key2 = PBin(12);
if(key1==key2==0)
{
key++;
}
if(k!=key)
{
sys_led_ctrl(GPIOA,GPIO_Pin_5,0);
k = key;
}
else
{
sys_led_ctrl(GPIOA,GPIO_Pin_5,1);
}
}
}
我来回答