單片機(jī)型號(hào):STM32L053R8T6
本例程測(cè)試STOP_RTC模式的真實(shí)功耗,主程序如下:
int main(void)
{
while(1)
{
HAL_Delay(5000);
Target.HAL.Rtc.EnterStopRtcMode();
Target.HAL.SystemClock.SetMode(2);
}
}
系統(tǒng)進(jìn)入主循環(huán)后,先進(jìn)行5秒延時(shí),然后進(jìn)入低功耗模式,低功耗模式設(shè)置的RTC時(shí)間為4秒,4秒過后退出低功耗模式,重新進(jìn)行時(shí)鐘設(shè)置。
在進(jìn)入main函數(shù)之前,執(zhí)行了3個(gè)操作:時(shí)鐘設(shè)置、低功耗設(shè)置和RTC設(shè)置,如下面程序:
class CHAL
{
public:
CSystemClock SystemClock;
CSystemLowPower SystemLowPower;
CRtc Rtc;
};
時(shí)鐘設(shè)置相關(guān)程序如下:
void CClock::SetMode(uint8_t mode)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
__HAL_RCC_PWR_CLK_ENABLE();
if (mode == 0)
{
//Configure the main internal regulator output voltage
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
//Initializes the CPU, AHB and APB busses clocks
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
//Initializes the CPU, AHB and APB busses clocks
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2;
PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
//Configure the Systick interrupt time
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
//Configure the Systick
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
//SysTick_IRQn interrupt configuration
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
else if (mode == 1)
{
//Configure the main internal regulator output voltage
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
//Initializes the CPU, AHB and APB busses clocks
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
//Initializes the CPU, AHB and APB busses clocks
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2
|RCC_PERIPHCLK_USB;
PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
//Configure the Systick interrupt time
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
//Configure the Systick
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
//SysTick_IRQn interrupt configuration
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
else if (mode == 2)
{
//Configure the main internal regulator output voltage
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
//Initializes the CPU, AHB and APB busses clocks
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
RCC_OscInitStruct.HSICalibrationValue = 0x10; //HSIDT?y?μ
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
//Initializes the CPU, AHB and APB busses clocks
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_RTC;
PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
//Configure the Systick interrupt time
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
//Configure the Systick
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
//SysTick_IRQn interrupt configuration
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
}
低功耗設(shè)置相關(guān)程序如下:
CLowPower::CLowPower(uint8_t mode)
{
if (mode == 1)
{
GPIO_InitTypeDef GPIO_InitStructure;
HAL_PWREx_EnableUltraLowPower(); //ê1?ü3?μí1|o?
HAL_PWREx_EnableFastWakeUp(); //ê1?ü?ì?ù??D?
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI); //??HSIê±?ó×÷?a??D?oóμ??÷ê±?ó
//???ùóDòy?????????a?£?aê?è??£ê?
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
GPIO_InitStructure.Pin = GPIO_PIN_All;
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
__HAL_RCC_GPIOA_CLK_DISABLE();
__HAL_RCC_GPIOB_CLK_DISABLE();
__HAL_RCC_GPIOC_CLK_DISABLE();
__HAL_RCC_GPIOD_CLK_DISABLE();
__HAL_RCC_GPIOH_CLK_DISABLE();
}
}
RTC設(shè)置相關(guān)程序如下:
CRtc::CRtc(void)
{
this->hRTC.Instance = RTC;
pRTC = &this->hRTC;
this->hRTC.Init.HourFormat = RTC_HOURFORMAT_24;
this->hRTC.Init.AsynchPrediv = 124;
this->hRTC.Init.SynchPrediv = 295;
this->hRTC.Init.OutPut = RTC_OUTPUT_DISABLE;
this->hRTC.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; //2???DDê?3?òy????ó3é?
this->hRTC.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
this->hRTC.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&this->hRTC) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
}
程序運(yùn)行后,5秒為正常功耗,4秒為低功耗,測(cè)得實(shí)際功耗2.4uA,手冊(cè)中指出的STOP_RTC模式為1uA,產(chǎn)生差錯(cuò)的原因在《STM32L0低功耗設(shè)計(jì)3: Stop模式下的真實(shí)功耗》中已經(jīng)介紹過,2.4uA已經(jīng)能夠滿足項(xiàng)目本身的設(shè)計(jì)了,還算不錯(cuò)。
上一篇:STM32開發(fā)筆記30:STM32L0低功耗設(shè)計(jì)-STOP_RTC模式下的休眠時(shí)間
下一篇:STM32開發(fā)筆記28: 中斷請(qǐng)求的移植與處理
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 貿(mào)澤授權(quán)代理Texas Instruments 豐富多樣的產(chǎn)品
- 美國為何恢復(fù)英偉達(dá)H20對(duì)華銷售?白宮AI負(fù)責(zé)人回應(yīng)
- Cadence 率先推出業(yè)內(nèi)首款 LPDDR6/5X 14.4Gbps 內(nèi)存 IP,為新一代 AI 基礎(chǔ)架構(gòu)助力
- 手把手教你從零設(shè)計(jì)一款算力超過 1000Tops 的智能駕駛芯片
- OrangeBox汽車連接域控制器(CDC)開發(fā)平臺(tái)
- 采用反激式轉(zhuǎn)換器進(jìn)行高功率應(yīng)用設(shè)計(jì)
- Vishay推出PLCC-6封裝RGB LED通過獨(dú)立控制紅色、綠色和藍(lán)色芯片實(shí)現(xiàn)寬色域
- 芯對(duì)話 | CBMG719單刀雙擲模擬開關(guān):高精度信號(hào)切換低阻高速寬溫
- 大聯(lián)大詮鼎集團(tuán)推出基于Qualcomm和Thundercomm產(chǎn)品的AI電子圍欄方案
- AMD:AI加速卡MI308將恢復(fù)出貨,許可證申請(qǐng)將被推進(jìn)至審核流程
- EEworld獨(dú)家原創(chuàng)視頻:大話TI CC2650,邀你來看!
- 觀看TI IOT解決方案研討會(huì) 答題即可贏取更多精美好禮!
- 【EEWORLD第三十九屆】2012年06月社區(qū)明星人物揭曉!
- 永不過時(shí)的物聯(lián)網(wǎng)解決方案 Intel帶你6的飛起來!
- ADI有獎(jiǎng)下載活動(dòng)之25:ADI汽車傳感器和傳感器接口解決方案
- Vicor 更好的供電方式提升無人機(jī)飛行時(shí)間飛行半徑及有效載荷
- 考眼力:高速數(shù)字設(shè)計(jì)的秘籍 藏在哪里? 走近Keysight PATHWAVE,提升工作效率
- TI 最新電容式觸控套件,免費(fèi)嘗鮮中
- TI有獎(jiǎng)直播|借助Sitara™ AM263x MCU 創(chuàng)造電氣化的未來
- 解決集成電路“掐脖子”問題,光刻機(jī)這篇文章怎么做?
- 樂樂飛馮飛:順應(yīng)“精準(zhǔn)農(nóng)業(yè)”大方向 以特色系統(tǒng)打入植保無人機(jī)市場(chǎng)
- 南京將出臺(tái)“集成電路十條”,設(shè)200億美元產(chǎn)投基金
- 俄羅斯世界杯落幕,恩智浦在決賽期間的非接觸式票務(wù)服務(wù)
- 悅芯科技:打造中國高端集成電路測(cè)試裝備的大國重器
- mcu-stc12c5404ad單片機(jī)直流無刷電機(jī)驅(qū)動(dòng)程序
- GY-30數(shù)字光強(qiáng)度模塊BH1750FV
- 一款基于ARM控制的逆變器電源電路設(shè)計(jì)方案
- 基于ARM的智能家居監(jiān)控系統(tǒng)設(shè)計(jì)
- 常見的五大ARM存儲(chǔ)器之一:協(xié)處理器CP15