This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请问CC2540 Delay的方法

Other Parts Discussed in Thread: CC2540, BLE-STACK

请问在CC2540中,有没有delay这种指令可以用?

我有看到是用osal_start_timerEx

osal_start_timerEx( SimpleOsal_TaskID, SBP_START_DEVICE_EVT, 2000 );

但我中间没有定义事件(SBP_START_DEVICE_EVT),只想先停2秒再往下做事

 

以下用uart来说明,先送出ABC,2秒后再送出DEF

SerialPrintString("ABC");

delay 2 sec -->有没有这个指令???

SerialPrintString("DEF");

  • BLE-STACK基于OSAL, 事件处理必须短而快,因此,不能有硬delay函数。你希望的方式,要使用事件来完成。

    if ( events & EVENT1)
    {

        SerialPrintString("ABC");

       osal_start_timerEx( SimpleOsal_TaskID, EVENT2, 2000 );

        return (events ^ EVENT1);

    )

    if ( events & EVENT2)
    {

        SerialPrintString("DEF");

        return (events ^ EVENT2);

    )

    要不就是有周期性调用的函数,然后在里面写个状态机,就是不能delay

  • 谢谢TY的回应,

    以下这样写,我发现在UART都没有传东西出来

    然后我用LCD只有看到EVENT1之后,就没有看到EVENT2

    首先我在SipleOsal.h定义

    #define EVENT1    0x0005

    #define EVENT2    0x0006

     

    接下来在启动装置内的SBP_START_DEVICE_EVT写EVENT1与EVENT2

      if ( events & SBP_START_DEVICE_EVT )

      {

        if ( events & EVENT1)

         {

           SerialPrintString("ABC");

           osal_start_timerEx( SimpleOsal_TaskID, EVENT2, 2000 );

           HalLcdWriteString( "EVENT1", HAL_LCD_LINE_3 );

           return (events ^ EVENT1);

         }

     

        if ( events & EVENT2)

         {

           SerialPrintString("DEF");

           HalLcdWriteString( "EVENT2", HAL_LCD_LINE_4 );

           return (events ^ EVENT2);

         }

              //8s之后再次启动

            osal_start_timerEx( SimpleOsal_TaskID, EVENT2, 8000 );

        return ( events ^ SBP_START_DEVICE_EVT );

      }

  • 事件不能定义成0x5,0x6,要定义为0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080.....

    你0x05  是00000101,6是00000110,有两个bit。看来不了解OSAL原理的还是挺多的。

  • 短的毫秒延时可以用nop指令。