|
==================================================
樣例使用說明
==================================================
功能描述:
此樣例演示了外部觸發(fā)LPTIM,由LPTIM中斷喚醒stop模式,每次喚醒后再次進(jìn)入stop模式,每6s喚醒一次,并在中斷中翻轉(zhuǎn)LED燈。
stop模式下,測得功耗8.96uA
==================================================
測試環(huán)境:
測試用板:PY32F030_STK
MDK版本: 5.28
==================================================
使用步驟:
1. 編譯下載程序到MCU,并運(yùn)行;
2. 按下按鍵進(jìn)入stop模式;
3. 6s后喚醒stop模式并循環(huán)進(jìn)入stop模式再喚醒;
4. 中斷中LED保持頻率閃爍;
==================================================
注意事項(xiàng):
每次喚醒后再次進(jìn)入Stop模式前,必須增加延時,用于LSI和APB時鐘同步
==================================================
#include "main.h"
#include "tim.h"
#include "gpio.h"
#include "exti.h"
#include "lptim.h"
void APP_SystemClockConfig(void);
int main(void)
{
/* 初始化所有外設(shè),F(xiàn)lash接口,SysTick */
HAL_Init();
/* 系統(tǒng)時鐘配置 */
APP_SystemClockConfig();
/* 初始化GPIO */
APP_GpioConfig();
/* 初始化Exti */
APP_ConfigureExti();
/* 初始化Time */
APP_Tim1Config();
/* 時鐘設(shè)置 */
APP_RCCOscConfig();
/* LPTIM初始化 */
APP_LPTIMInit();
/* 使能PWR */
__HAL_RCC_PWR_CLK_ENABLE();
/* 關(guān)閉Systick中斷 */
HAL_SuspendTick();
while (1)
{
if(KEY_down_up==Down_KEY)//檢測到一次下降沿到來
{
KEY_down_up=Up_KEY;
/* 關(guān)閉Systick中斷 */
HAL_SuspendTick();
/* 失能 LPTIM */
__HAL_LPTIM_DISABLE(&LPTIMConf);
/* 使能LPTIM和中斷,并開啟單次計(jì)數(shù)模式 */
APP_LPTIMStart(6);//6秒后自動喚醒
/* 進(jìn)入STOP模式,使用中斷喚醒 */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}
}
}
/**
* @brief 系統(tǒng)時鐘配置函數(shù)
* @param 無
* @retval 無
*/
void APP_SystemClockConfig(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/* 選擇振蕩器HSI,LSI */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON; /* 開啟HSI */
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; /* HSI 1分頻 */
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_16MHz; /* 配置HSI時鐘16MHz */
RCC_OscInitStruct.HSEState = RCC_HSE_OFF; /* 關(guān)閉HSE */
RCC_OscInitStruct.LSIState = RCC_LSI_OFF; /* 關(guān)閉LSI */
RCC_OscInitStruct.LSEState = RCC_LSE_OFF; /* 關(guān)閉LSE */
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF; /* 關(guān)閉PLL */
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; /* 選擇時鐘源為HSI */
/* 配置振蕩器 */
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
APP_ErrorHandler();
}
/* 時鐘源配置 選擇配置時鐘 HCLK,SYSCLK,PCLK1 */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB時鐘 1分頻 */
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB時鐘 1分頻 */
/* 配置時鐘源 */
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
APP_ErrorHandler();
}
}
/**
* @brief 錯誤執(zhí)行函數(shù)
* @param 無
* @retval 無
*/
void APP_ErrorHandler(void)
{
while (1)
{
}
}
#include "lptim.h"
#include "gpio.h"
LPTIM_HandleTypeDef LPTIMConf;
/**
* @brief 時鐘配置函數(shù)
* @param 無
* @retval 無
*/
void APP_RCCOscConfig(void)
{
RCC_PeriphCLKInitTypeDef LPTIM_RCC;
RCC_OscInitTypeDef RCC_OscInitStruct;
/* LSI時鐘配置 */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI; /* 選擇配置LSI */
RCC_OscInitStruct.LSIState = RCC_LSI_ON; /* LSI開啟 */
/*時鐘初始化*/
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
}
/* LPTIM時鐘配置 */
LPTIM_RCC.PeriphClockSelection = RCC_PERIPHCLK_LPTIM; /* 選擇配置外設(shè)時鐘:LPTIM */
LPTIM_RCC.LptimClockSelection = RCC_LPTIMCLKSOURCE_LSI; /* 選擇LPTIM時鐘源:LSI */
/* 外設(shè)時鐘初始化 */
if (HAL_RCCEx_PeriphCLKConfig(&LPTIM_RCC) != HAL_OK)
{
}
/*使能LPTIM時鐘*/
__HAL_RCC_LPTIM_CLK_ENABLE();
}
/**
* @brief 初始化LPTIM
* @param 無
* @retval 無
*/
void APP_LPTIMInit(void)
{
/*LPTIM配置*/
LPTIMConf.Instance = LPTIM; /* LPTIM */
LPTIMConf.Init.Prescaler = LPTIM_PRESCALER_DIV128; /* 128分頻 */
LPTIMConf.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE; /* 立即更新模式 */
/*初始化LPTIM*/
if (HAL_LPTIM_Init(&LPTIMConf) != HAL_OK)
{
}
}
/**
* @brief 使能LPTIM和中斷,并開啟單次計(jì)數(shù)模式
* @param 無
* @retval 無
*/
void APP_LPTIMStart(uint8_t i)
{
/* 使能重載中斷 */
__HAL_LPTIM_ENABLE_IT(&LPTIMConf, LPTIM_IT_ARRM);
/* 使能LPTIM */
__HAL_LPTIM_ENABLE(&LPTIMConf);
/*加載重載值*/
__HAL_LPTIM_AUTORELOAD_SET(&LPTIMConf, 51*5*i);
/* 延時65us */
APP_delay_us(65);
/* 開啟單次計(jì)數(shù)模式 */
__HAL_LPTIM_START_SINGLE(&LPTIMConf);
}
void LPTIM1_IRQHandler(void)
{
HAL_LPTIM_IRQHandler(&LPTIMConf);
}
/**
* @brief LPTIM重裝載中斷回調(diào)函數(shù)
* @param 無
* @retval 無
*/
void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim)
{
/* LED翻轉(zhuǎn) */
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
/**
* @brief 微秒延時函數(shù)
* @param nus:延時時間
* @retval 無
* @note 此函數(shù)會關(guān)閉SysTick中斷,如需要使用請重新初始化SysTick
*/
void APP_delay_us(uint32_t nus)
{
HAL_SuspendTick();
uint32_t temp;
SysTick->LOAD=nus*(SystemCoreClock/1000000);
SysTick->VAL=0x00;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL=0x00;
SysTick->VAL =0x00;
}
#ifndef _LPTIM_H
#define _LPTIM_H
#include "main.h"
extern LPTIM_HandleTypeDef LPTIMConf;
void APP_RCCOscConfig(void);
void APP_LPTIMInit(void);
void APP_LPTIMStart(uint8_t i);
void APP_delay_us(uint32_t nus);
#endif
Keil代碼下載:
PY32F0_LPTIM.7z
(1.03 MB, 下載次數(shù): 20)
2023-4-27 17:21 上傳
點(diǎn)擊文件名下載附件
|
-
評分
-
查看全部評分
|