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

5431

被折叠的 条评论
为什么被折叠?



