国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

APM32F072單片機進入STOP模式,并通過RTC Wakeup Timer和USART1串口接收事件喚醒

這篇具有很好參考價值的文章主要介紹了APM32F072單片機進入STOP模式,并通過RTC Wakeup Timer和USART1串口接收事件喚醒。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

串口初始化(注意USART1時鐘源要選擇HSI):

void usart_init(int baud_rate)
{
    GPIO_Config_T gpio;
    USART_Config_T usart;
    
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);
    
    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_9, GPIO_AF_PIN1);
    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_10, GPIO_AF_PIN1);
    
    gpio.mode = GPIO_MODE_AF;
    gpio.outtype = GPIO_OUT_TYPE_PP;
    gpio.pin = GPIO_PIN_9 | GPIO_PIN_10;
    gpio.pupd = GPIO_PUPD_PU;
    gpio.speed = GPIO_SPEED_2MHz;
    GPIO_Config(GPIOA, &gpio);
    
    RCM_ConfigUSARTCLK(RCM_USART1CLK_HSI);
    USART_ConfigStructInit(&usart);
    usart.baudRate = (uint32_t)baud_rate;
    USART_Config(USART1, &usart);
    USART_ConfigOverrunDetection(USART1, USART_OVER_DETECTION_DISABLE);
    USART_Enable(USART1);
}

使用power_init函數(shù)初始化RTC,然后調(diào)用power_enter_stop_mode(n)函數(shù)進入STOP模式,n秒后自動喚醒,或由USART1接收喚醒:文章來源地址http://www.zghlxwxcb.cn/news/detail-549832.html

#include <apm32f0xx_eint.h>
#include <apm32f0xx_pmu.h>
#include <apm32f0xx_rcm.h>
#include <apm32f0xx_rtc.h>
#include <apm32f0xx_usart.h>
#include <stdio.h>
#include "bc3602.h"
#include "common.h"
#include "power.h"

static void power_rtc_init(void);
static void power_rtc_wakeup_init(void);
static void power_usart_wakeup_init(void);

void power_enter_stop_mode(uint16_t seconds)
{
    // enable the wakeup timer
    RTC_SetWakeUpValue(seconds - 1);
    RTC_EnableWakeUp();
    
    // enter STOP mode with two WFE instructions
    printf("Enter STOP mode\n");
    fflush(stdout);
    bc3602_suspend();
    PMU_EnterSTOPMode(PMU_REGULATOR_LowPower, PMU_STOPENTRY_WFE); // clear the event register
    PMU_EnterSTOPMode(PMU_REGULATOR_LowPower, PMU_STOPENTRY_WFE); // enter stop mode
    bc3602_resume();
    printf("Wakeup\n");
    
    // disable the wakeup timer
    RTC_DisableWakeUp();
    if (RTC_ReadIntFlag(RTC_INT_FLAG_WT) != RESET)
    {
        RTC_ClearIntFlag(RTC_INT_FLAG_WT);
        printf("RTC wakeup timer event\n");
    }
    
    // clear USART wakeup flag
    if (USART_ReadIntFlag(USART1, USART_INT_FLAG_WAKEUP) != RESET)
    {
        USART_ClearIntFlag(USART1, USART_INT_FLAG_WAKEUP);
        printf("USART event\n");
    }
}

void power_init(void)
{
    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);
    PMU_EnableBackupAccess();
    
    power_rtc_init();
    power_rtc_wakeup_init();
    power_usart_wakeup_init();
}

static void power_rtc_init(void)
{
    uint32_t freq, interval, synch;
    uint32_t last, now;
    RTC_Config_T rtc;
    
    if (RCM_ReadStatusFlag(RCM_FLAG_LSIRDY) == RESET)
    {
        printf("LSI is OFF\n");
        RCM_EnableLSI();
        while (RCM_ReadStatusFlag(RCM_FLAG_LSIRDY) == RESET);
        printf("LSI is ready\n");
    }
    else
    {
        printf("LSI is ON\n");
    }
    
    if (!RCM->BDCTRL_B.RTCCLKEN)
    {
        RCM_ConfigRTCCLK(RCM_RTCCLK_LSI);
        RCM_EnableRTCCLK();
    
        rtc.format = RTC_HourFormat_12;
        rtc.AsynchPrediv = 124;
        rtc.SynchPrediv = 319;
        RTC_Config(&rtc);
        printf("RTC is configured\n");
        
        // CAUTION: Once the wakeup timer is started, it does NOT stop until the MCU loses power supply
        RTC_ConfigWakeUpClock(RTC_WAKEUP_CLOCK_CK_SPRE_16B);
        RTC_SetWakeUpValue(0);
        RTC_EnableWakeUp();
        
        while (RTC_ReadStatusFlag(RTC_FLAG_WTF) == RESET);
        last = sys_now();
        RTC_ClearStatusFlag(RTC_FLAG_WTF);
        while (RTC_ReadStatusFlag(RTC_FLAG_WTF) == RESET);
        now = sys_now();
        RTC_ClearStatusFlag(RTC_FLAG_WTF);
        RTC_DisableWakeUp();
        
        interval = now - last;
        freq = 40000000 / interval;
        synch = (10 * freq) / (rtc.AsynchPrediv + 1) - 10; // 10*(freq/(asynch+1)-1)
        synch = (synch + 5) / 10; // round off the number
        printf("RTC calibration: interval=%u, freq=%u, synch=%u\n", interval, freq, synch);
        if (synch != rtc.SynchPrediv)
        {
            rtc.SynchPrediv = synch;
            RTC_Config(&rtc);
            printf("RTC is calibrated\n");
        }
    }
}

static void power_rtc_wakeup_init(void)
{
    EINT_Config_T eint;
    
    // configure EINT20 (RTC wakeup interrupt) as event mode
    eint.line = EINT_LINE20;
    eint.lineCmd = ENABLE;
    eint.mode = EINT_MODE_EVENT;
    eint.trigger = EINT_TRIGGER_RISING;
    EINT_Config(&eint);
    
    RTC_EnableInterrupt(RTC_INT_WT);
}

static void power_usart_wakeup_init(void)
{
    EINT_Config_T eint;
    
    // configure EINT25 (USART1 wakeup interrupt) as event mode
    eint.line = EINT_LINE25;
    eint.lineCmd = ENABLE;
    eint.mode = EINT_MODE_EVENT;
    eint.trigger = EINT_TRIGGER_RISING;
    EINT_Config(&eint);
    
    while (USART_ReadStatusFlag(USART1, USART_FLAG_TXC) == RESET);
    USART_Disable(USART1);
    USART_ConfigStopModeWakeUpSource(USART1, USART_WAKEUP_SOURCE_RXNE);
    USART_Enable(USART1);
    
    USART_EnableStopMode(USART1);
    USART_EnableInterrupt(USART1, USART_INT_WAKEUP);
}

到了這里,關(guān)于APM32F072單片機進入STOP模式,并通過RTC Wakeup Timer和USART1串口接收事件喚醒的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【雅特力】單片機AT32F421系列入門資料

    【雅特力】單片機AT32F421系列入門資料

    AT32 全系列MCU選型手冊.PDF AT32F421F8P7 AT32F421C8T7 (雅特力廠商送樣的兩個芯片版本) 【 數(shù)據(jù)手冊】AT32F421系列引腳定義、電氣特性與封裝特性.PDF 【技術(shù)手冊】AT32F421系列各外設(shè)(Peripheral)完整說明與各寄存器(Register)定義說明.PDF 【教程】AT32F421入門使用指南.PDF AT-START-F421 及 AT-Link

    2024年02月13日
    瀏覽(28)
  • 【單片機】STM32單片機,RTC實時時鐘,STM32F103C8T6,程序,萬年歷,數(shù)字時鐘

    【單片機】STM32單片機,RTC實時時鐘,STM32F103C8T6,程序,萬年歷,數(shù)字時鐘

    我以STM32F103C8T6為例,但STM32F103的RTC是通用的,STM32F103C8T6有一個原理圖: https://qq742971636.blog.csdn.net/article/details/131288390 用紐扣電池給VBAT供電(要共地),即可實現(xiàn)掉電后依舊走時的能力。 主要特性(來源于STM32中文參考手冊V10.pdf): 記得加標準庫文件: 串口接收:

    2024年02月11日
    瀏覽(32)
  • 【單片機】STM32單片機頻率計程序,外部脈沖計數(shù)程序,基于脈沖計數(shù)的頻率計程序,STM32F103

    【單片機】STM32單片機頻率計程序,外部脈沖計數(shù)程序,基于脈沖計數(shù)的頻率計程序,STM32F103

    兩種方法用于在單片機中實現(xiàn)頻率計的功能。 第一種方法是通過定時器來衡量信號的周期,然后將周期轉(zhuǎn)換為頻率。在這種方法中,你可以使用單片機的定時器模塊來測量輸入信號的周期,定時器會產(chǎn)生一個計數(shù)值,你可以根據(jù)這個計數(shù)值來推算出輸入信號的周期,并通過簡

    2024年02月11日
    瀏覽(26)
  • PY32F003F18P單片機概述

    PY32F003F18P單片機概述

    PY32F003F18P單片機是普冉的一款A(yù)RM微控制器,內(nèi)核是Cortex-M0。這個單片機的特色,就是價格便宜,F(xiàn)LASH和SRAM遠遠超過8位單片機,市場競爭力很強大。 一、硬件資源: 1)、FLASH為64K字節(jié); 2)、SRAM為8K字節(jié); 3)、定時器: 高級定時器有1個,為TIM1;通用定時器有4個,分別為TIM3,

    2024年02月10日
    瀏覽(22)
  • 關(guān)于兩個STM32F103系列單片機的藍牙通信

    關(guān)于兩個STM32F103系列單片機的藍牙通信

    ? ?畢設(shè)做的是掌控小車,因此采用藍牙通信作為小車和手部通信,前段時間做出實物,對其遇到的問題以及解決的方法做一些總結(jié)。一個主控芯片采用STM32F103ZET6,另一個主控芯片采用STM32F103C8T6,原因是本來準備了兩個主控C8T6,不小心燒了一個。 1.兩個藍牙的配對 ?需要準

    2024年02月13日
    瀏覽(94)
  • 32位M0核單片機XL32F003芯片特征和功能介紹

    32位M0核單片機XL32F003芯片特征和功能介紹

    XL32F003 系列微控制器采用高性能的 32 位 ARM?Cortex?- M0+ 內(nèi)核,寬電壓工作范圍的MCU。嵌入高達64 Kbytes flash和8 Kbytes SRAM存儲器,最高工作頻率32 MHz。包含多種不同封裝類型多款產(chǎn)品。芯片集成多路I2C、SPI、 USART等通訊外設(shè),1路12 bit ADC,5個16bit定時器,以及2路比較器。 XL32F00

    2024年02月14日
    瀏覽(21)
  • STM32F103ZE單片機呼吸燈源代碼

    本實驗采用的系統(tǒng)頻率SYSTIM為8MHZ,如果頻率改變需要修改一個數(shù)值

    2024年02月09日
    瀏覽(25)
  • stm32f1xx單片機攔截中斷源代碼

    stm32f1xx單片機攔截中斷源代碼

    這個是實現(xiàn)后的效果,可以看到已經(jīng)沒有中斷的效果了 這個是攔截前的效果可以看到電平是在變化的 實現(xiàn)原理非常簡單:一句話搞定: 以下是完整的代碼:是用來補充說明和籌字數(shù)的 這就表明了,單片機里面是可以植入病毒的,或者不算病毒,里面的代碼也是具有修改破壞

    2024年02月10日
    瀏覽(27)
  • JDY-31藍牙模塊遠程控制STM32F103單片機

    JDY-31藍牙模塊遠程控制STM32F103單片機

    ? ?手機app通過藍牙模塊發(fā)送指令實時控制單片機的外設(shè)功能,比如發(fā)送衣柜開關(guān)門指令(舵機旋轉(zhuǎn)),衣架上升降落(步進電機正轉(zhuǎn)反轉(zhuǎn)),遠程開啟去污除濕功能(繼電器控制打開關(guān)閉小風(fēng)扇+加熱片)。 本次例子:手機APP連接藍牙模塊遠程控制SG90舵機正轉(zhuǎn)(0-180°)和反

    2024年02月01日
    瀏覽(33)
  • 32 位 ARM? Cortex?-M0+ 單片機,PY32F002B 系列微控制器

    32 位 ARM? Cortex?-M0+ 單片機,PY32F002B 系列微控制器

    PY32F002B 系列微控制器采用高性能的 32 位 ARM? Cortex?-M0+內(nèi)核,寬電壓工作范圍的 MCU。嵌入24Kbytes Flash 和 3Kbytes SRAM 存儲器,最高工作頻率 24MHz。包含多種不同封裝類型多款產(chǎn)品。 芯片集成I2C、SPI、USART 等通訊外設(shè),1 路 12bit ADC,2 個 16bit 定時器,以及 2 路比較器。PY32F002B 系

    2024年02月05日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包