微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32 低功耗设计[操作寄存器+库函数]

stm32 低功耗设计[操作寄存器+库函数]

时间:11-25 来源:互联网 点击:
  • 71

    72}

    User/stm32f10x_it.c

    01#include "stm32f10x_it.h"

    02#include "system.h"

    03

    04#define LED1 PAout(4)

    05#define LED2 PAout(5)

    06#define LED3 PAout(6)

    07#define LED4 PAout(7)

    08

    09

    10voidEXTI0_IRQHandler(void)

    11{

    12LED4 = !LED4;

    13EXTI->PR = 1<0;//清除中断标志位

    14}

    待机相关代码参见 system.c文件中

    库函数操作

    main.c

    001#include "stm32f10x.h"

    002#include "stdio.h"

    003

    004#define PRINTF_ON 1

    005

    006voidRCC_Configuration(void);

    007voidGPIO_Configuration(void);

    008voidNVIC_Configuration(void);

    009voidEXTI_Configuration(void);

    010voidIWDG_Configuration(void);

    011

    012#define PWR_MODE_Sleep 0 //开启睡眠模式

    013

    014#define PWR_MODE_DeepSleep 1 //开启停机模式

    015

    016#define PWR_MODE_STANDBY 0 //开启待机模式

    017

    018

    019vu32 DelayTime = 10000000;

    020

    021intmain(void)

    022{

    023RCC_Configuration();

    024GPIO_Configuration();

    025NVIC_Configuration();

    026EXTI_Configuration();

    027

    028SysTick_Config(10000000);

    029

    030while(--DelayTime);

    031

    032#if PWR_MODE_Sleep //睡眠模式

    033

    034PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);//唤醒后时钟变为内置8MHz

    035

    036#elif PWR_MODE_DeepSleep //停机模式

    037

    038PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);//唤醒后时钟变为内置8MHz

    039

    040#elif PWR_MODE_STANDBY //待机模式

    041

    042IWDG_Configuration();//设置为2s内不喂狗复位,使用独立看门狗唤醒

    043

    044PWR_EnterSTANDBYMode();//唤醒后会初始化程序

    045

    046#endif

    047

    048while(1);

    049

    050}

    051

    052voidIWDG_Configuration(void)

    053{

    054RCC_LSICmd(ENABLE);//打开LSI

    055while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);

    056

    057IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

    058IWDG_SetPrescaler(IWDG_Prescaler_32);

    059IWDG_SetReload(2000);//max 0xFFF 0~4095

    060IWDG_ReloadCounter();

    061IWDG_Enable();

    062}

    063

    064voidGPIO_Configuration(void)

    065{

    066GPIO_InitTypeDef GPIO_InitStructure;

    067GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    068GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_7;

    069GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    070GPIO_Init(GPIOA , &GPIO_InitStructure);

    071

    072GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

    073GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    074GPIO_Init(GPIOA , &GPIO_InitStructure);

    075

    076GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

    077GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    078GPIO_Init(GPIOA , &GPIO_InitStructure);

    079

    080GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    081GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    082GPIO_Init(GPIOA , &GPIO_InitStructure);

    083

    084GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

    085}

    086

    087

    088voidRCC_Configuration(void)

    089{

    090/* 定义枚举类型变量 HSEStartUpStatus */

    091ErrorStatus HSEStartUpStatus;

    092

    093/* 复位系统时钟设置*/

    094RCC_DeInit();

    095/* 开启HSE*/

    096RCC_HSEConfig(RCC_HSE_ON);

    097/* 等待HSE起振并稳定*/

    098HSEStartUpStatus = RCC_WaitForHSEStartUp();

    099/* 判断HSE起是否振成功,是则进入if()内部 */

    100if(HSEStartUpStatus == SUCCESS)

    101{

    102/* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */

    103RCC_HCLKConfig(RCC_SYSCLK_Div1);

    104/* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */

    105RCC_PCLK2Config(RCC_HCLK_Div1);

    106/* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */

    107RCC_PCLK1Config(RCC_HCLK_Div2);

    108/* 设置FLASH延时周期数为2 */

    109FLASH_SetLatency(FLASH_Latency_2);

    110/* 使能FLASH预取缓存 */

    111FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    112/* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */

    113RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    114/* 使能PLL */

    115RCC_PLLCmd(ENABLE);

    116/* 等待PLL输出稳定 */

    117while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    118/* 选择SYSCLK时钟源为PLL */

    119RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    120/* 等待PLL成为SYSCLK时钟源 */

    121while(RCC_GetSYSCLKSource() != 0x08);

    122}

    123/* 打开APB2总线上的GPIOA时钟*/

    124RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top