想知道我这样算不算开启成功了低功耗

#define DCDC_ENABLE                         TRUE

#endif

#ifndef HAL_SLEEP

#define HAL_SLEEP                           TRUE

这里设置了true

主程序这样:

/********************************** (C) COPYRIGHT *******************************

 * File Name          : main.c

 * Author             : WCH

 * Version            : V1.0

 * Date               : 2020/08/06

 * Description        : 蓝牙键盘应用主函数及任务系统初始化

 *********************************************************************************

 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.

 * Attention: This software (modified or not) and binary are used for 

 * microcontroller manufactured by Nanjing Qinheng Microelectronics.

 *******************************************************************************/


/******************************************************************************/

/* 头文件包含 */

#include "CONFIG.h"

#include "HAL.h"

#include "hiddev.h"

#include "hidkbd.h"

#include "MyBSP.h"

#include "CH58x_common.h"

/*********************************************************************

 * GLOBAL TYPEDEFS

 */

__attribute__((aligned(4))) uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4];


#if(defined(BLE_MAC)) && (BLE_MAC == TRUE)

const uint8_t MacAddr[6] = {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02};

#endif


/*********************************************************************

 * @fn      Main_CirculationTMOS

 *

 * @brief   主循环

 *

 * @return  none

 */

__HIGH_CODE

__attribute__((noinline))

void Main_Circulation()

{

    while(1)

    {

        TMOS_SystemProcess();

    }

}


/*********************************************************************

 * @fn      main

 *

 * @brief   主函数

 *

 * @return  none

 */

int main(void)

{

#if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)

    PWR_DCDCCfg(ENABLE);

#endif

    SetSysClock(CLK_SOURCE_PLL_60MHz);

#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)

    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

#endif


#ifdef DEBUG

    GPIOA_SetBits(bTXD1);

    GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);

    UART1_DefInit();

#if 1

    /* 配置唤醒源为 GPIO - PB22 */

    GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeIN_PU);

    GPIOB_ITModeCfg(GPIO_Pin_22, GPIO_ITMode_FallEdge); // 下降沿唤醒

    PFIC_EnableIRQ(GPIO_B_IRQn);

    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);

#endif

#if 1

    PRINT("sleep mode sleep \n");

    DelayMs(2);

    // 注意当主频为80M时,Sleep睡眠唤醒中断不可调用flash内代码。

    LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); //只保留30+2K SRAM 供电

    HSECFG_Current(HSE_RCur_100);                 // 降为额定电流(低功耗函数中提升了HSE偏置电流)

    DelayMs(5);

    PRINT("wake.. \n");

    DelayMs(500);

#endif


#if 1

    PRINT("shut down mode sleep \n");

    DelayMs(2);

    LowPower_Shutdown(0); //全部断电,唤醒后复位

    /*

     此模式唤醒后会执行复位,所以下面代码不会运行,

     注意要确保系统睡下去再唤醒才是唤醒复位,否则有可能变成IDLE等级唤醒

     */

    HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)

    PRINT("wake.. \n");

    DelayMs(500);

#endif


#endif

    PRINT("%s\n", VER_LIB);

    CH58X_BLEInit();

    MyBsp_Init();

    HAL_Init();

    GAPRole_PeripheralInit();

    HidDev_Init();

    HidEmu_Init();

    Main_Circulation();

}

void GPIOB_IRQHandler(void)

{

    GPIOB_ClearITFlagBit(GPIO_Pin_8);

}

/******************************** endfile @ main ******************************/

那么它到底什么时候进入几乎断电 LowPower_Shutdown又什么时候会进入到睡眠呢,如果我想4分钟不动就进入睡眠应该修改哪儿呢。

#define DCDC_ENABLE                         TRUE

#endif

#ifndef HAL_SLEEP

#define HAL_SLEEP                           TRUE

这里设置了true

这两项打开搜索得到蓝牙设备但是设备连后按键没反应好像没工作一样,如果是false连蓝牙设备都没能搜索到。


您好,

1、开启HAL_SLEEP后下图有一处需要修改

image.png

image.png

2、另外您的中断服务函数未加中断标识修饰以及HIGH_CODE修饰,后面请注意要按这种方式写

__INTERRUPT

__HIGH_CODE

void GPIOB_IRQHandler(void)

{

?????GPIOB_ClearITFlagBit(GPIO_Pin_8);

}


3、如HID_Keyboard,HID_Mouse等例程不建议直接在程序中调用Lowpower_Sleep函数进入休眠,这样会导致蓝牙直接断开,一般开启HAL_SLEEP后即可保证低功耗的运行,在有Tmos任务需要执行时,系统会自动醒来执行,执行完毕后如果没有tmos任务需要运行会立即再次进入低功耗模式,在无tmos任务时,系统会定时被RTC唤醒以保持蓝牙不断开。



你好,你的意思是

#define DCDC_ENABLE                         TRUE

#endif

#ifndef HAL_SLEEP

#define HAL_SLEEP                           TRUE

打开这两项就可以了吗,其它主程序也不需要什么代码了吗,我看有一贴是把HAL_SLEEP设置为1,还需要吗?这样如果设备长期不使用它能自动低功耗吗?不按键它多久能进入睡眠,甚至dcdc,能人为控制它吗,因为我设备没有开关。


我这边解释下HAL_SLEEP和DCDC_ENABLE两个宏的作用,

1、DCDC_ENABLE,开启后可大幅缩减芯片工作期间的电流功耗,约不开启时工作电流的50%-70%;

该宏置1的前提是硬件Vsw引脚上必须要串接一颗功率电感,参数范围:3.3uH-33uH,软件中调用PWR_DCDCCfg(ENABLE);即可开启DCDC功能,如果不串接电感而开启DCDC,那么功耗会飙升至一百多ma,导致芯片发热,严重时会损坏芯片及外围器件。

2、HAL_SLEEP,该宏用于底层协议栈自动管理芯片的休眠与工作切换,

在HAL_SLEEP置0时,那么芯片无论何时有没有tmos任务在运行,功耗均为正常工作电流,不会有低功耗处理。

在HAL_SLEEP置1后,协议栈会在无tmos任务运行时进入CH58X_LowPower函数进行低功耗管理,并启动RTC定时唤醒以保证蓝牙的连接,在有tmos定时的任务时间节点到来时,会立即唤醒芯片去执行相应的tmos任务。


另外,您提到的如果长期不使用,可以将芯片进入shutdown休眠,这种休眠方式功耗最低,同时蓝牙是一定会断开的,唤醒后芯片会进行复位。


感谢!我的意思,shut down这样写后它什么时候会进入这个模式,能不能按键后,它立马进入到这个模式,几乎就断连了设备呢。

#if 1

    while(1){

//    PRINT("Shut Down\n");

    DelayMs(2);

    LowPower_Shutdown(0); //全部断电,唤醒后复位

    /*

     此模式唤醒后会执行复位,所以下面代码不会运行,

     注意要确保系统睡下去再唤醒才是唤醒复位,否则有可能变成IDLE等级唤醒

     */

    HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)

    DelayMs(100);

    }

#endif



调用Lowpower_Shutdown(0)之后就会立即进入该休眠模式,且进入该函数之后后面的程序不会再执行了;

因为shutdown被唤醒后系统会直接复位,从头开始跑程序


只有登录才能回复,可以选择微信账号登录