分享

CC2541,请问在工程选项中使能串口后HAL

 书葱一根 2017-12-04

2017年8月31日09:23:47 ,分享我 的低功耗 下使用串口的 方式

 

协议栈版本: ble_sdk_1.4.2.2   simpleBLEPeripheral

 

1、   工程 配置 如下

 

INT_HEAP_LEN=3072

HALNODEBUG

OSAL_CBTIMER_NUM_TASKS=1

HAL_AES_DMA=TRUE

HAL_DMA=TRUE

POWER_SAVING

xPLUS_BROADCASTER

HAL_LCD=FALSE

HAL_LED=TRUE

HAL_KEY=FALSE

HAL_UART=TRUE

 

2、  在npi.h代码 中 做 如下修改

 

#if !defined( NPI_UART_FC )

#define NPI_UART_FC        FALSE

#endif // !NPI_UART_FC

 

3、  在_hal_uart_dma.c 文件 中 修改 DMA_PM 为0

 

#if !defined( DMA_PM )

#if defined POWER_SAVING

#define DMA_PM                     0

#else

#define DMA_PM                     0

#endif // POWER_SAVING

#endif // !DMA_PM

 

4、  ble休眠进入之前,使用串口的RX引脚外部中断来唤醒ble,配置如下:

(我 放在 SimpleBLEPeripheral_Init 函数中,串口初始化函数后面)

void initRxExterInterrupt(void)

{

   P0SEL &= ~(0x08);      //P0.3 TX 设置为通用I/O口

   P0DIR &= ~(0x08);      //P0.3 TX 设置为输入

 

   P0SEL &= ~(0x04);      //P0.2 设置为通用I/O口

   P0DIR &= ~(0x04);      //P0.2 设置为输入

  

   P0IFG &= ~(0x04);      //P0.2 设置为输入

 

   PICTL |=  0;           //P0端口下降沿触发

   P0IEN |=  (0x04);       //P0.2 RX 中断使能

   IEN1  |=  0x20;        //端口P0中断使能

   EA = 1;                //开总中断

  

   U0CSR  &= ~0x40;     //关闭 串口 接收使能 

}

5、  在外部中断服务函数中,要 关闭RX 引脚的外部中断,函数如下:

void initRxUart(void)

{

   IEN1  &= ~0x20;     //端口P0中断关闭

   P0SEL |= (0x08);      //P0.3 TX 设置为外设串口TX功能

   P0DIR |= (0x08);      //P0.3 TX 设置为输出

}

 

6、  外部 中断服务函数如下

 

#pragma vector = P0INT_VECTOR

__interrupt void P0_ISR(void)

{

  HAL_ENTER_ISR();

  if(0x04 & P0IFG) //判断 是否是 P0.2 RX 引脚 中断

  {

    initRxUart();

           //唤醒后 执行 定时任务 ,可以 这个任务中 使用 函数关闭 低功耗

    osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, 5 );

    CLEAR_SLEEP_MODE();//退出 休眠 ,进入工作状态

    HAL_BOARD_INIT();//切换到外部32M 晶振 并且 等待稳定

  }

 

  P0IFG = 0; //清中断标志

  P0IF = 0; //清中断标志,IRCON[5],P0口中断

  HAL_EXIT_ISR();

}

 

7、  在 第六步 启动 的 定时任务中,static void performPeriodicTask( void )中

使用 下面 两句代码  重新初始化串口,和关闭低功耗

 

    NPI_InitTransport(NpiSerialCallback);     //重新初始化串口

    osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); // 不在进入低功耗

         printf(“wake up.\r\n”);

 

8、  重新进入低功耗 的 方法 :

 

// makes sure LEDs are OFF

HalLedSet( (HAL_LED_1 | HAL_LED_2), HAL_LED_MODE_OFF );

HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT );

HCI_EXT_HaltDuringRfCmd( HCI_EXT_HALT_DURING_RF_ENABLE );

//关闭 定时事件,降低功耗

osal_stop_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT );

initRxExterInterrupt(); //重新 初始化 rx 为 外部中断

osal_pwrmgr_device( PWRMGR_BATTERY );//打开 OSAL 进入低功耗的开关

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多