微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 用osal_start_timerEx弄Led blink

用osal_start_timerEx弄Led blink

时间:10-02 整理:3721RD 点击:

不好意思 我是一枚菜鸟刚刚接触这些 我现在想弄Led blink可是我不太会用osal_start_timerEx()这个function.

现在我是这样做,我是用keyfobdemo.c那边改

void KeyFobApp_Init( uint8 task_id )
{
  keyfobapp_TaskID = task_id;  
   
       
  // Register for all key events - This app will handle all key events
   RegisterForKeys( keyfobapp_TaskID );
   
   osal_start_timerEx( keyfobapp_TaskID, LED_ON , STARTDELAY );
    
  // Setup a delayed profile startup
  // osal_start_timerEx( keyfobapp_TaskID, KFD_START_DEVICE_EVT, STARTDELAY );
 
}

uint16 KeyFobApp_ProcessEvent( uint8 task_id, uint16 events )
{
 
 if ( events & SYS_EVENT_MSG )
  {
    uint8 *pMsg;

    if ( (pMsg = osal_msg_receive( keyfobapp_TaskID )) != NULL )
    {
      keyfobapp_ProcessOSALMsg( (osal_event_hdr_t *)pMsg );

      // Release the OSAL message
      VOID osal_msg_deallocate( pMsg );
    }
    
    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }
       if ( events & LED_ON )
   {
      Led_Init( LED_RED_PORT, LED_RED_PIN );
      Led_On( LED_RED_PORT, LED_RED_PIN );  
   }
   
   if ( events & LED_OFF )
   {
     Led_Init( LED_RED_PORT, LED_RED_PIN );
     Led_Off( LED_RED_PORT, LED_RED_PIN );
   }

然后我在keyfobdemo.h那边的Key Fob Task Events加了这些东西

#define LED_ON                                                         0x0040
#define LED_OFF                                                       0x0080

可是我加了这些东西他还是不会运行 我知道uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint32 timeout_value )是这样, taskID已经是不必改的 然后timeout_value我放了500ms, 只是我好奇这个event_id能自己给一个数字他吗就好像以上的define led那样? 如果我要让LED blink有啥办法??? 谢谢各位 如果不明白的话我会edit


1.hal_led.c带了blink的功能。

2. 你设置一个事件就好了,你的事件ID没有问题,只要是一位位的就行了。不要同时出现两位的比如0x0003  [0011]

3. osal_start_timerEx是一次性的,需要你重新调用

4. 事件要清掉

  #define HAL_TOGGLE_LED1()         st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} )

    if ( events & LED_ON )
   {

     osal_start_timerEx( keyfobapp_TaskID, LED_ON , STARTDELAY );

   HAL_TOGGLE_LED1();

 return (events ^ LED_ON);

}

4.请问为什么要清掉这个事件呢? 有点不明白 =)求解答 弟万分感激

事件的标志位表示当前需执行的事件。

你执行完了事件,当然要清除标志位。

你在中断里不是也要清除中断标志位?

也请问下为什么我这样放会无效 ?

     if ( events & LED_ON )
   {
      Led_Init( LED_RED_PORT, LED_RED_PIN );
      Led_On( LED_RED_PORT, LED_RED_PIN );  
   }

然后把 osal_start_timerEx( keyfobapp_TaskID, LED_ON , STARTDELAY )放在void KeyFobApp_Init( uint8 task_id )运行?

  if ( events & LED_ON )
   {

     osal_start_timerEx( keyfobapp_TaskID, LED_ON , STARTDELAY );

   HAL_TOGGLE_LED1();

 return (events ^ LED_ON);

}

我是一定要start那个timer在这个event才能运行?

你下面这个没有问题啊,有什么问题吗?

  if ( events & LED_ON )
   {

     osal_start_timerEx( keyfobapp_TaskID, LED_ON , STARTDELAY );

   HAL_TOGGLE_LED1();

 return (events ^ LED_ON);

}

我是指我的 哈哈 你帮我的这个code能运行啊 能解释一下你的code吗? 不太明白 很抱歉 麻烦你了

我上面其实已经说清楚了:

1. osal_timeEx 是一次性的,超时完成了,你需要重新调,以实现周期性事件。

2. 事件发生了,你处理完这个事件后,需要把事件清除。不清除,会一直在这段代码里运行。 ^ 就是清除事件标识。

你的代码为什么不行?如下:

1. 定时器一次性,所以你会出现一次LED_ON事件。你还没有清除这个事件,所有会一直在LED_ON这里转

2.  没有触发LED_OFF事件。实在要做,就在LED_ON事件里调用osal_timerEx来触发LED_OFF事件。为了循环,你还得在LED_OFF事件处理里用 osal_timerEx再触发LED_ON事件。

所以我不用放infinite loop也能重复眨吗?

是的。你的思路也没问题,只是实现起来没注意一些问题,而且比我给你的复杂, 我的一个事件就搞定了。

我想我应该明白了 真抱歉要一一解释给我听 万分感激

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top