RTL8762A DataTransWithoutDirectio運用省電問題
針對方案:基於Realtek RTL8762AG的BLE智能風衣方案
我現在碰到的問題是電流無法下來,約在4.5mA左右,麻煩協助解決問題,謝謝 ~
使用範例
改至Bee1_SDK_1.1.0.10948\RTL8762\Board\EVB\DataTransWithoutDirectio
我的運用
1顆 按鍵 Power On --> PAD_SW_MODE
Power Off -->PAD_PINMUX_MODE 設成中斷喚醒
1組 A/D
2組 PWM
1組 I2C運用 ,Gsensor
問題
如何讓於Power Off下 系統藍芽暫時關閉,並且進入省電模式,由SW喚醒或Gsensor 中斷喚醒
目前動作都有只差省電部份與Gsensor還未完全
在Power Off下除了兩個外部中斷需要外下可否停止系統進入省電由中斷喚省後繼續執行系統運作.
Power Off下大致上的設定測試如下:
// UART
Pinmux_Config(P3_0, GPIO_FUN);
Pinmux_Config(P3_1, GPIO_FUN);
Pad_Config(P3_0, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_HIGH);
Pad_Config(P3_1, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_HIGH);
NVIC_DisableIRQ(UART_IRQ);
// PWM
#ifdef SUPPLY_EVB_PWMA
Pad_Config(IO_EVB_PWMA, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_HIGH);
#endif
#ifdef SUPPLY_EVB_PWMB
Pad_Config(IO_EVB_PWMB, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_HIGH);
#endif
PWM_Cmd(PWM2, DISABLE);
RCC_PeriphClockCmd(APBPeriph_TIMER, APBPeriph_TIMER_CLOCK, DISABLE); // PWM
// ADC
// Pinmux_Config(USE_EVB_ADC, GPIO_FUN);
Pad_Config(USE_EVB_ADC, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_HIGH);
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, DISABLE);
// SWDIO & SWDCLK
Pinmux_Config(IO_EVB_SWDIO, GPIO_FUN);
Pinmux_Config(IO_EVB_SWDCLK, GPIO_FUN);
Pad_Config(IO_EVB_SWDIO, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_HIGH);
Pad_Config(IO_EVB_SWDCLK, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_HIGH);
// I2C
Pinmux_Config(IO_EVB_I2C_SDA, GPIO_FUN);
Pinmux_Config(IO_EVB_I2C_SCL, GPIO_FUN);
Pinmux_Config(IO_EVB_I2C_INT, GPIO_FUN);
Pad_Config(IO_EVB_I2C_SCL, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_LOW);
Pad_Config(IO_EVB_I2C_SDA, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_LOW);
Pad_Config(IO_EVB_I2C_INT, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_DOWN, PAD_OUT_DISABLE, PAD_OUT_LOW);
// Log
Pad_Config(P0_3, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_LOW);
peripheral_Disconnect();
peripheral_StopAdvertising();
最佳解
以下設置DLPS皆以sample project DataTransWithoutDirectio 為範例
1.請打開與DLPS相關的Macro在board.h裡頭,如下:
#define CONFIG_DLPS_EN 1
請打開關周邊模組的Macro,如下範例
#define USE_UART_DLPS 1
#define USE_ADC_DLPS 1
#define USE_PWM0_DLPS 1
#define USE_I2C0_DLPS 1
2.設置wakeup pin
您可以參考範例,在此為UART RX pin出DLPS.
UARTInit()
{
…
system_WakeUp_Pin_Enable(DATA_RX_IN, 0);
…
}
其他中斷欲出DLPS,請如上設置.
3.請在PwrMgr_Init()設置DLPS相關call back範例如下,此在main.c
void PwrMgr_Init()
{
DLPS_IO_Register();
if (FALSE == DLPS_ENTER_CHECK_CB_REG(DLPS_DataTransCheck))
{
DBG_BUFFER(MODULE_APP, LEVEL_ERROR, "Error: DLPS_ENTER_CHECK_CB_REG(DLPS_DataTransCheck) failed!\n", 0);
}
DLPS_IO_RegUserDlpsEnterCb(DataTrans_DLPS_Enter);
DLPS_IO_RegUserDlpsExitCb(DataTransExitDlpsInit);
LPS_MODE_Set(LPM_DLPS_MODE);
/* whether enter DLPS or not when power on */
if (gConfigParam->is_enter_sleep.is_enter_sleep)
{
allowedDataTransEnterDlps = FALSE; /* not enter DLPS when power on */
}
else
{
allowedDataTransEnterDlps = TRUE; /* enter DLPS when power on */
gConfigParam->isSleeping = TRUE;
}
}
BOOL DLPS_DataTransCheck():此為每次要進入DLPS前會調用該函數,決定可否進入DLPS.若為false則無法進DLPS
如下範例:
BOOL DLPS_DataTransCheck()
{
return allowedDataTransEnterDlps;
}
void DataTrans_DLPS_Enter():為進入DLPS時保存APP之IO Register.
如下範例:
void DataTrans_DLPS_Enter(void)
{
Pad_Config(P3_0, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_LOW);
Pad_Config(P3_1, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_LOW);
}
void DataTransExitDlpsInit():系統跳出DLPS時恢復特定APP之IO Register.
如下範例:
void DataTransExitDlpsInit(void)
{
DBG_BUFFER(MODULE_APP, LEVEL_INFO, "DataTransExitDlpsInit", 0);
/* reconfig UART register */
Pad_Config(P3_0, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_LOW);
Pad_Config(P3_1, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_LOW);
}
4.附件有相關範例UART log 和 App.trace, bin
Key word: BT_MSG_TYPE_CONN_STATE_CHANGE:(2->3) 為建立BLE連線,範例為30秒內無BLE傳輸就會進DLPS
[MODULE_APP] SysOnIntr 為進DLPS
[MODULE_APP] DataTransExitDlpsInit 為出DLPS
[MODULE_APP] ENTER RX TOUT ISR 由UART RX喚醒, 30秒內無BLE傳輸就會進DLPS