想知道我這樣算不算開啟成功了低功耗

#define DCDC_ENABLE? ? ? ? ? ? ? ? ? ? ? ? ?TRUE

#endif

#ifndef HAL_SLEEP

#define HAL_SLEEP? ? ? ? ? ? ? ? ? ? ? ? ? ?TRUE

這里設(shè)置了true

主程序這樣:

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

?* File Name? ? ? ? ? : main.c

?* Author? ? ? ? ? ? ?: WCH

?* Version? ? ? ? ? ? : V1.0

?* Date? ? ? ? ? ? ? ?: 2020/08/06

?* Description? ? ? ? : 藍(lán)牙鍵盤應(yīng)用主函數(shù)及任務(wù)系統(tǒng)初始化

?*********************************************************************************

?* 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? ?主循環(huán)

?*

?* @return? none

?*/

__HIGH_CODE

__attribute__((noinline))

void Main_Circulation()

{

? ? while(1)

? ? {

? ? ? ? TMOS_SystemProcess();

? ? }

}


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

?* @fn? ? ? main

?*

?* @brief? ?主函數(shù)

?*

?* @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);

? ? // 注意當(dāng)主頻為80M時(shí),Sleep睡眠喚醒中斷不可調(diào)用flash內(nèi)代碼。

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

? ? HSECFG_Current(HSE_RCur_100);? ? ? ? ? ? ? ? ?// 降為額定電流(低功耗函數(shù)中提升了HSE偏置電流)

? ? DelayMs(5);

? ? PRINT("wake.. \n");

? ? DelayMs(500);

#endif


#if 1

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

? ? DelayMs(2);

? ? LowPower_Shutdown(0); //全部斷電,喚醒后復(fù)位

? ? /*

? ? ?此模式喚醒后會(huì)執(zhí)行復(fù)位,所以下面代碼不會(huì)運(yùn)行,

? ? ?注意要確保系統(tǒng)睡下去再喚醒才是喚醒復(fù)位,否則有可能變成IDLE等級(jí)喚醒

? ? ?*/

? ? HSECFG_Current(HSE_RCur_100); // 降為額定電流(低功耗函數(shù)中提升了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 ******************************/

那么它到底什么時(shí)候進(jìn)入幾乎斷電?LowPower_Shutdown又什么時(shí)候會(huì)進(jìn)入到睡眠呢,如果我想4分鐘不動(dòng)就進(jìn)入睡眠應(yīng)該修改哪兒呢。

#define DCDC_ENABLE? ? ? ? ? ? ? ? ? ? ? ? ?TRUE

#endif

#ifndef HAL_SLEEP

#define HAL_SLEEP? ? ? ? ? ? ? ? ? ? ? ? ? ?TRUE

這里設(shè)置了true

這兩項(xiàng)打開搜索得到藍(lán)牙設(shè)備但是設(shè)備連后按鍵沒反應(yīng)好像沒工作一樣,如果是false連藍(lán)牙設(shè)備都沒能搜索到。


您好,

1、開啟HAL_SLEEP后下圖有一處需要修改

image.png

image.png

2、另外您的中斷服務(wù)函數(shù)未加中斷標(biāo)識(shí)修飾以及HIGH_CODE修飾,后面請(qǐng)注意要按這種方式寫

__INTERRUPT

__HIGH_CODE

void GPIOB_IRQHandler(void)

{

?????GPIOB_ClearITFlagBit(GPIO_Pin_8);

}


3、如HID_Keyboard,HID_Mouse等例程不建議直接在程序中調(diào)用Lowpower_Sleep函數(shù)進(jìn)入休眠,這樣會(huì)導(dǎo)致藍(lán)牙直接斷開,一般開啟HAL_SLEEP后即可保證低功耗的運(yùn)行,在有Tmos任務(wù)需要執(zhí)行時(shí),系統(tǒng)會(huì)自動(dòng)醒來執(zhí)行,執(zhí)行完畢后如果沒有tmos任務(wù)需要運(yùn)行會(huì)立即再次進(jìn)入低功耗模式,在無tmos任務(wù)時(shí),系統(tǒng)會(huì)定時(shí)被RTC喚醒以保持藍(lán)牙不斷開。



你好,你的意思是

#define DCDC_ENABLE? ? ? ? ? ? ? ? ? ? ? ? ?TRUE

#endif

#ifndef HAL_SLEEP

#define HAL_SLEEP? ? ? ? ? ? ? ? ? ? ? ? ? ?TRUE

打開這兩項(xiàng)就可以了嗎,其它主程序也不需要什么代碼了嗎,我看有一貼是把HAL_SLEEP設(shè)置為1,還需要嗎?這樣如果設(shè)備長期不使用它能自動(dòng)低功耗嗎?不按鍵它多久能進(jìn)入睡眠,甚至dcdc,能人為控制它嗎,因?yàn)槲以O(shè)備沒有開關(guān)。


我這邊解釋下HAL_SLEEP和DCDC_ENABLE兩個(gè)宏的作用,

1、DCDC_ENABLE,開啟后可大幅縮減芯片工作期間的電流功耗,約不開啟時(shí)工作電流的50%-70%;

該宏置1的前提是硬件Vsw引腳上必須要串接一顆功率電感,參數(shù)范圍:3.3uH-33uH,軟件中調(diào)用PWR_DCDCCfg(ENABLE);即可開啟DCDC功能,如果不串接電感而開啟DCDC,那么功耗會(huì)飆升至一百多ma,導(dǎo)致芯片發(fā)熱,嚴(yán)重時(shí)會(huì)損壞芯片及外圍器件。

2、HAL_SLEEP,該宏用于底層協(xié)議棧自動(dòng)管理芯片的休眠與工作切換,

在HAL_SLEEP置0時(shí),那么芯片無論何時(shí)有沒有tmos任務(wù)在運(yùn)行,功耗均為正常工作電流,不會(huì)有低功耗處理。

在HAL_SLEEP置1后,協(xié)議棧會(huì)在無tmos任務(wù)運(yùn)行時(shí)進(jìn)入CH58X_LowPower函數(shù)進(jìn)行低功耗管理,并啟動(dòng)RTC定時(shí)喚醒以保證藍(lán)牙的連接,在有tmos定時(shí)的任務(wù)時(shí)間節(jié)點(diǎn)到來時(shí),會(huì)立即喚醒芯片去執(zhí)行相應(yīng)的tmos任務(wù)。


另外,您提到的如果長期不使用,可以將芯片進(jìn)入shutdown休眠,這種休眠方式功耗最低,同時(shí)藍(lán)牙是一定會(huì)斷開的,喚醒后芯片會(huì)進(jìn)行復(fù)位。


感謝!我的意思,shut down這樣寫后它什么時(shí)候會(huì)進(jìn)入這個(gè)模式,能不能按鍵后,它立馬進(jìn)入到這個(gè)模式,幾乎就斷連了設(shè)備呢。

#if 1

? ? while(1){

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

? ? DelayMs(2);

? ? LowPower_Shutdown(0); //全部斷電,喚醒后復(fù)位

? ? /*

? ? ?此模式喚醒后會(huì)執(zhí)行復(fù)位,所以下面代碼不會(huì)運(yùn)行,

? ? ?注意要確保系統(tǒng)睡下去再喚醒才是喚醒復(fù)位,否則有可能變成IDLE等級(jí)喚醒

? ? ?*/

? ? HSECFG_Current(HSE_RCur_100); // 降為額定電流(低功耗函數(shù)中提升了HSE偏置電流)

? ? DelayMs(100);

? ? }

#endif



調(diào)用Lowpower_Shutdown(0)之后就會(huì)立即進(jìn)入該休眠模式,且進(jìn)入該函數(shù)之后后面的程序不會(huì)再執(zhí)行了;

因?yàn)閟hutdown被喚醒后系統(tǒng)會(huì)直接復(fù)位,從頭開始跑程序


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频