OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3971|回复: 0

关于GPIO模拟PWM按键实现两档灯的问题

[复制链接]

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
发表于 2020-11-11 16:09:24 | 显示全部楼层 |阅读模式
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);
                 }
}
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 11:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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