芯片解密PY32F0单片机LPTIM中断源程序
芯片解密样例使用说明
==================================================
功能描述:
此样例演示了外部触发LPTIM,由LPTIM中断唤醒stop模式,每次唤醒后再次进入stop模式,每6s唤醒一次,并在中断中翻转LED灯。
stop模式下,测得功耗8.96uA
==================================================
测试环境:
测试用板:PY32F030_STK
MDK版本: 5.28
==================================================
使用步骤:
1. 编译下载程序到MCU,并运行;
2. 按下按键进入stop模式;
3. 6s后唤醒stop模式并循环进入stop模式再唤醒;
4. 中断中LED保持频率闪烁;
==================================================
注意事项:
每次唤醒后再次进入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)
{
/* 初始化所有外设,Flash接口,SysTick */
HAL_Init();
/* 系统时钟配置 */
APP_SystemClockConfig();
/* 初始化GPIO */
APP_GpioConfig();
/* 初始化Exti */
APP_ConfigureExti();
/* 初始化Time */
APP_Tim1Config();
/* 时钟设置 */
APP_RCCOscConfig();
/* LPTIM初始化 */
APP_LPTIMInit();
/* 使能PWR */
__HAL_RCC_PWR_CLK_ENABLE();
/* 关闭Systick中断 */
HAL_SuspendTick();
while (1)
{
if(KEY_down_up==Down_KEY)//检测到一次下降沿到来
{
KEY_down_up=Up_KEY;
/* 关闭Systick中断 */
HAL_SuspendTick();
/* 失能 LPTIM */
__HAL_LPTIM_DISABLE(&LPTIMConf);
/* 使能LPTIM和中断,并开启单次计数模式 */
APP_LPTIMStart(6);//6秒后自动唤醒
/* 进入STOP模式,使用中断唤醒 */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}
}
}
/**
* @brief 系统时钟配置函数
* @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; /* 关闭HSE */
RCC_OscInitStruct.LSIState = RCC_LSI_OFF; /* 关闭LSI */
RCC_OscInitStruct.LSEState = RCC_LSE_OFF; /* 关闭LSE */
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF; /* 关闭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 错误执行函数
* @param 无
* @retval 无
*/
void APP_ErrorHandler(void)
{
while (1)
{
}
}

芯片解密