低功耗蓝牙cc2541学习笔记之LED-1

本文介绍在使用TI的BLE-CC254x-1.4.0协议栈时,如何在带有OSAL系统的低功耗蓝牙cc2541芯片上初始化并控制LED灯。在HalDriverInit()函数中,通过宏定义HAL_LED来启动HalLedInit()进行LED初始化。

如果裸机跑led灯程序,步骤很简单:

1,设置io引脚为输出,

2,给io给值1 或 0。

如果带OSAL系统,如何操作led,下面将详细讲,我用的是TI的蓝牙4.0BLE协议栈BLE-CC254x-1.4.0。

1,进入函数/* Initialze the HAL driver */HalDriverInit(),函数里是cc2541芯片带的外设的初始化,可以看到如果满足两个宏定义#if (defined HAL_LED) && (HAL_LED == TRUE),则执行HalLedInit();所以我们要驱动led,则要满足这两个条件。

void HalDriverInit (void)
{
  /* TIMER */
#if (defined HAL_TIMER) && (HAL_TIMER == TRUE)
#endif

  /* ADC */
#if (defined HAL_ADC) && (HAL_ADC == TRUE)
  HalAdcInit();
#endif

  /* DMA */
#if (defined HAL_DMA) && (HAL_DMA == TRUE)
  // Must be called before the init call to any module that uses DMA.
  HalDmaInit();
#endif

  /* AES */
#if (defined HAL_AES) && (HAL_AES == TRUE)
  HalAesInit();
#endif

  /* LCD */
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
  HalLcdInit();
#endif

  /* LED */
#if (defined HAL_LED) && (HAL_LED == TRUE)
  HalLedInit();
#endif

  /* UART */
#if (defined HAL_UART) && (HAL_UART == TRUE)
  HalUARTInit();
#endif

  /* KEY */
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
  HalKeyInit();
#endif

  /* HID */
#if (defined HAL_HID) && (HAL_HID == TRUE)
  usbHidInit();
#endif
}
2.进入函数HalLedInit(),主要功能是LED1_DDR |= LED1_BV,Set LED GPIOs to outputs。
void HalLedInit (void)
{
#if (HAL_LED == TRUE)
  HalLedSet(HAL_LED_ALL, HAL_LED_MODE_OFF);  // Initialize all LEDs to OFF.

  // Set LED GPIOs to outputs.
  LED1_DDR |= LED1_BV;
#if (!defined HAL_PA_LNA && !defined HAL_PA_LNA_CC2590)
  LED2_DDR |= LED2_BV;
#if (!defined CC2540_MINIDK && !defined HAL_BOARD_CC2540USB)
  LED3_DDR |= LED3_BV;
#endif
#endif
#if defined BLINK_LEDS
  HalLedStatusControl.sleepActive = FALSE;  // Initialize sleepActive to FALSE.
#endif
#endif
}
3.driver init之后,就是OSAL init,进入函数SimpleOsal_Init(),注册任务,设置LED1 and LED2 处于关闭状态,并且10ms后,启动SimpleOsal_TaskID任务中的SBP_START_DEVICE_EVT事件。函数osal_start_timerEx( uint8 taskID, uint16 event_id, uint32 timeout_value )是启动一个定时器,定时 timeout_value 时间之后,触发TaskID的event_id事件,延时时间以ms为单位。
void SimpleOsal_Init( uint8 task_id )
{
  SimpleOsal_TaskID = task_id;

  // Register for all key events - This app will handle all key events
  RegisterForKeys( SimpleOsal_TaskID );

  //任务函数初始化,熄灭led1和led2
  HalLedSet( (HAL_LED_1 | HAL_LED_2), HAL_LED_MODE_OFF );

  // Setup a delayed profile startup
  //为了方便观察实验现象,延时5s执行后面的操作
  osal_start_timerEx( SimpleOsal_TaskID, SBP_START_DEVICE_EVT, 10 );
}



4,在用户任务处理函数中,遇到刚才注册任务的SBP_START_DEVICE_EVT事件,然后让lED(按一定次数闪烁)HAL_LED_MODE_FLASH
 。
uint16 SimpleOsal_ProcessEvent( uint8 task_id, uint16 events )
{

  VOID task_id; // OSAL required parameter that isn't used in this function

  if ( events & SYS_EVENT_MSG )
  {
    uint8 *pMsg;

    if ( (pMsg = osal_msg_receive( SimpleOsal_TaskID )) != NULL )
    {
      SimpleOsal_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 & SBP_START_DEVICE_EVT )
  {
    //OSAL开始运行,我们点亮led1和led2.
    HalLedSet( (HAL_LED_1 | HAL_LED_2), HAL_LED_MODE_FLASH );
    return ( events ^ SBP_START_DEVICE_EVT );
  }
  // Discard unknown events
  return 0;
}
下一节讲HalLedSet(uint8 leds, uint8 mode)函数。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值