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 进入低功耗的开关 |
|