新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32 低功耗設計[操作寄存器+庫函數]

        stm32 低功耗設計[操作寄存器+庫函數]

        作者: 時間:2016-11-25 來源:網絡 收藏
        庫函數操作
        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);
        125
        126//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        127
        128RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
        129//RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP|RCC_APB1Periph_WWDG, ENABLE);
        130
        131}
        132
        133
        134voidUSART_Configuration(void)
        135{
        136USART_InitTypeDef USART_InitStructure;
        137USART_ClockInitTypeDef USART_ClockInitStructure;
        138
        139USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
        140USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
        141USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
        142USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
        143USART_ClockInit(USART1 , &USART_ClockInitStructure);
        144
        145USART_InitStructure.USART_BaudRate = 9600;
        146USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        147USART_InitStructure.USART_StopBits = USART_StopBits_1;
        148USART_InitStructure.USART_Parity = USART_Parity_No;
        149USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        150USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
        151USART_Init(USART1,&USART_InitStructure);
        152
        153USART_Cmd(USART1,ENABLE);
        154}
        155
        156voidEXTI_Configuration(void)
        157{
        158EXTI_InitTypeDef EXTI_InitStructure;
        159
        160EXTI_InitStructure.EXTI_Line = EXTI_Line0;
        161EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        162EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        163EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        164
        165EXTI_Init(&EXTI_InitStructure);
        166
        167}
        168
        169voidNVIC_Configuration(void)
        170{
        171NVIC_InitTypeDef NVIC_InitStructure;
        172
        173NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        174
        175NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
        176NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        177NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        178NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        179NVIC_Init(&NVIC_InitStructure);
        180}
        181
        182#if PRINTF_ON
        183
        184intfputc(intch,FILE*f)
        185{
        186USART_SendData(USART1,(u8) ch);
        187while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
        188returnch;
        189}
        190
        191#endif
        stm32f10x_it.c
        view source
        print?
        01#include "stm32f10x_it.h"
        02
        03#include "stdio.h"
        04
        05
        06voidEXTI0_IRQHandler(void)
        07{
        08GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_SET);
        09
        10//EXTI_ClearFlag(EXTI_Line0); //清除此中斷標志位,系統由于喚醒將直接復位
        11
        12}
        13
        14voidSysTick_Handler(void)
        15{
        16GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4)));
        17}


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 肃南| 永靖县| 庆安县| 正安县| 庆阳市| 仙桃市| 丹凤县| 龙江县| 育儿| 菏泽市| 广汉市| 柳林县| 镇江市| 宣城市| 宜黄县| 绵竹市| 灵山县| 中方县| 博白县| 长岛县| 长沙市| 鄄城县| 鄂托克前旗| 浪卡子县| 隆德县| 盈江县| 海阳市| 铁岭县| 宾阳县| 龙口市| 宿松县| 平乡县| 洪雅县| 长岭县| 东安县| 甘谷县| 河曲县| 浮梁县| 会同县| 犍为县| 广南县|