伊人久久大香线蕉综合bd高清,国产三级精品三级在线播放 ,欧美性猛xxxxx精品,久久久久国产精品熟女影院

0 賣盤信息
BOM詢價(jià)
您現(xiàn)在的位置: 首頁 > 技術(shù)方案 >工業(yè)控制 > STM32L151 RTC自動(dòng)喚醒-附加RTC日歷-串口修改喚醒時(shí)間(最小系統(tǒng)+源碼)

STM32L151 RTC自動(dòng)喚醒-附加RTC日歷-串口修改喚醒時(shí)間(最小系統(tǒng)+源碼)

來源: 電路城
2021-12-13
類別:工業(yè)控制
eye 24
文章創(chuàng)建人 拍明

原標(biāo)題:STM32L151 RTC自動(dòng)喚醒-附加RTC日歷-串口修改喚醒時(shí)間(最小系統(tǒng)+源碼)

STM32L151 RTC自動(dòng)喚醒及附加RTC日歷設(shè)計(jì)詳解

在低功耗應(yīng)用中,利用STM32L151的RTC(實(shí)時(shí)時(shí)鐘)模塊進(jìn)行自動(dòng)喚醒和附加RTC日歷管理是非常關(guān)鍵的設(shè)計(jì)要點(diǎn)。STM32L151作為STM32系列中的低功耗型號(hào),具備強(qiáng)大的低功耗模式,可以通過RTC模塊配合自動(dòng)喚醒機(jī)制來實(shí)現(xiàn)節(jié)能目標(biāo)。本文將詳細(xì)闡述如何使用STM32L151的RTC模塊進(jìn)行自動(dòng)喚醒,并結(jié)合附加RTC日歷功能,以及如何通過串口修改喚醒時(shí)間的相關(guān)技術(shù)細(xì)節(jié),最終呈現(xiàn)一個(gè)基于最小系統(tǒng)的源碼示例。

image.png

一、主控芯片型號(hào)及在設(shè)計(jì)中的作用

1.1 STM32L151的型號(hào)介紹

STM32L151屬于STMicroelectronics的STM32系列微控制器,基于ARM Cortex-M3內(nèi)核,主頻最高可達(dá)32MHz。STM32L151是該系列中主打低功耗和高效能的型號(hào),特別適合低功耗電池驅(qū)動(dòng)的應(yīng)用場(chǎng)景。STM32L151擁有豐富的外設(shè)資源,支持多種低功耗工作模式,內(nèi)建實(shí)時(shí)時(shí)鐘(RTC)、低功耗看門狗(IWDG)等模塊,可以實(shí)現(xiàn)高效的時(shí)間管理和低功耗控制。

STM32L151系列的主要特點(diǎn)包括:

  • 最高主頻32 MHz

  • 低功耗設(shè)計(jì),具有多種省電模式(待機(jī)、睡眠、停機(jī)模式等)

  • 內(nèi)置16-bit RTC模塊,支持自動(dòng)喚醒和時(shí)間計(jì)數(shù)

  • 集成多種外設(shè),如USART、I2C、SPI、ADC等

  • 具有內(nèi)置閃存和RAM,適用于嵌入式系統(tǒng)開發(fā)

1.2 在設(shè)計(jì)中的作用

在本設(shè)計(jì)中,STM32L151作為核心控制單元,承擔(dān)了以下幾項(xiàng)重要任務(wù):

  • RTC自動(dòng)喚醒管理:利用RTC模塊在設(shè)定的時(shí)間周期內(nèi)喚醒系統(tǒng),控制功耗,實(shí)現(xiàn)精確的時(shí)間調(diào)度。

  • 附加RTC日歷功能:借助RTC模塊實(shí)現(xiàn)基于時(shí)間的事件觸發(fā),控制設(shè)備的行為,比如定時(shí)開關(guān)機(jī)、定時(shí)操作等。

  • 串口通信:通過USART串口接口接收外部命令,修改喚醒時(shí)間等參數(shù),實(shí)現(xiàn)靈活的控制。

通過合理配置STM32L151的低功耗模式和RTC喚醒機(jī)制,能夠在不需要頻繁喚醒的情況下大幅降低系統(tǒng)的功耗,提高系統(tǒng)的續(xù)航能力。

二、RTC模塊與自動(dòng)喚醒機(jī)制

2.1 RTC模塊工作原理

STM32L151的RTC模塊基于外部32.768 kHz晶振或內(nèi)部低速振蕩器(LSI)工作,提供精確的時(shí)鐘源。在設(shè)計(jì)中,RTC模塊不僅用于提供準(zhǔn)確的時(shí)間,還能用于定時(shí)喚醒系統(tǒng)。RTC模塊具有以下功能:

  • 實(shí)時(shí)時(shí)鐘:RTC提供準(zhǔn)確的年月日、時(shí)分秒計(jì)時(shí),適合用于日歷和定時(shí)器應(yīng)用。

  • 定時(shí)喚醒:通過設(shè)置RTC的鬧鐘或定時(shí)器,系統(tǒng)可以在設(shè)定的時(shí)間周期內(nèi)自動(dòng)喚醒,適用于周期性喚醒場(chǎng)景。

  • 低功耗運(yùn)行:RTC能夠在STM32L151進(jìn)入低功耗模式(如待機(jī)模式)時(shí)繼續(xù)運(yùn)行,不會(huì)受到主系統(tǒng)休眠的影響。

2.2 RTC自動(dòng)喚醒流程

RTC的自動(dòng)喚醒流程通常包括以下幾個(gè)步驟:

  1. 配置RTC時(shí)鐘源:選擇32.768 kHz的外部晶振作為RTC時(shí)鐘源,以保證精確度。

  2. 設(shè)置RTC的鬧鐘時(shí)間:配置鬧鐘或定時(shí)器,在設(shè)定的時(shí)間內(nèi)觸發(fā)喚醒。

  3. 進(jìn)入低功耗模式:將STM32L151進(jìn)入低功耗模式(如待機(jī)模式、睡眠模式等),以降低功耗。

  4. 觸發(fā)喚醒:當(dāng)RTC計(jì)時(shí)器或鬧鐘到達(dá)設(shè)定時(shí)間時(shí),系統(tǒng)會(huì)自動(dòng)從低功耗模式喚醒。

2.3 配置RTC模塊的關(guān)鍵寄存器

在STM32L151中,配置RTC模塊需要操作幾個(gè)關(guān)鍵寄存器:

  • RTC_CR(RTC控制寄存器):用于使能RTC和配置時(shí)鐘源。

  • RTC_PRER(RTC預(yù)分頻器寄存器):設(shè)置RTC的預(yù)分頻器,用于調(diào)整RTC計(jì)時(shí)精度。

  • RTC_ALRMAR(RTC鬧鐘A寄存器):配置鬧鐘A的觸發(fā)時(shí)間。

  • RTC_ISR(RTC初始化和狀態(tài)寄存器):用于檢查RTC的初始化狀態(tài)和相關(guān)事件。

三、附加RTC日歷功能

附加RTC日歷功能通常用于系統(tǒng)需要精確的時(shí)間和日期管理。例如,在一個(gè)基于RTC的自動(dòng)喚醒系統(tǒng)中,可能需要根據(jù)日期和時(shí)間觸發(fā)不同的事件。STM32L151的RTC模塊支持完整的日歷功能,包括年、月、日、小時(shí)、分鐘和秒等信息。RTC模塊通過鬧鐘、周期定時(shí)器等方式與日歷結(jié)合,從而實(shí)現(xiàn)按特定時(shí)間段或日期觸發(fā)事件。

3.1 配置RTC日歷功能

STM32L151支持將RTC模塊配置為日期和時(shí)間功能,可以精確到年、月、日、小時(shí)、分鐘、秒。通過設(shè)置RTC的日期和時(shí)間寄存器(RTC_TR和RTC_DR),可以實(shí)現(xiàn)日歷功能。具體步驟如下:

  • 設(shè)置日期寄存器(RTC_DR):配置年、月、日信息。

  • 設(shè)置時(shí)間寄存器(RTC_TR):配置小時(shí)、分鐘、秒信息。

  • 設(shè)置鬧鐘觸發(fā):結(jié)合RTC模塊的鬧鐘功能,實(shí)現(xiàn)按特定時(shí)間觸發(fā)事件。

3.2 示例代碼:RTC日歷配置

以下是一個(gè)配置RTC日歷和時(shí)間的示例代碼:

#include "stm32l1xx.h"

void RTC_Config(void) {
   // 使能LSE外部晶振
   RCC->APB1ENR |= RCC_APB1ENR_PWREN;
   PWR->CR |= PWR_CR_DBP;  // 使能備份域電源
   RCC->CSR |= RCC_CSR_LSEON;  // 啟動(dòng)LSE
   while (!(RCC->CSR & RCC_CSR_LSERDY));  // 等待LSE準(zhǔn)備好

   // 配置RTC
   RCC->APB1ENR |= RCC_APB1ENR_RTCEN;  // 使能RTC
   RTC->CRL &= ~RTC_CRL_RSF;  // 等待RTC同步
   RTC->CRL |= RTC_CRL_CNF;  // 進(jìn)入配置模式
   RTC->PRER = 0x007F00FF;  // 設(shè)置RTC預(yù)分頻器
   RTC->CRL &= ~RTC_CRL_CNF;  // 退出配置模式

   // 配置日期和時(shí)間
   RTC->DR = 0x0023;  // 設(shè)置日期:星期一,日期為1號(hào)
   RTC->TR = 0x1230;  // 設(shè)置時(shí)間:12:30:00
}

3.3 時(shí)間和日期格式化

為了便于操作,STM32L151的RTC日歷功能可以通過將RTC寄存器中的數(shù)據(jù)提取并格式化為常見的時(shí)間字符串格式(例如“YYYY-MM-DD HH:MM:SS”)。可以通過位操作提取出年、月、日、時(shí)、分、秒,然后進(jìn)行格式化。

四、通過串口修改喚醒時(shí)間

為了使系統(tǒng)的喚醒時(shí)間更具靈活性,設(shè)計(jì)中可以通過USART串口接收外部命令,動(dòng)態(tài)修改RTC鬧鐘的喚醒時(shí)間。通過UART串口與PC或其他外部設(shè)備進(jìn)行通信,接收新的喚醒時(shí)間并更新RTC模塊的鬧鐘寄存器。

4.1 串口通信配置

STM32L151支持多種串口協(xié)議,其中USART是常用的串口通信接口。以下是串口配置代碼示例:

#include "stm32l1xx.h"

void USART_Config(void) {
   // 使能USART外設(shè)
   RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
   RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
   GPIOA->MODER |= GPIO_MODER_MODE9_1 | GPIO_MODER_MODE10_1;  // 配置PA9為TX,PA10為RX

   // 配置USART波特率、停止位等
   USART1->BRR = 0x683;  // 設(shè)置波特率為9600
   USART1->CR1 |= USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;  // 使能USART、發(fā)送和接收功能
}

void USART_SendChar(char c) { while (!(USART1->SR & USART_SR_TXE));  // 等待數(shù)據(jù)寄存器空
   USART1->DR = (uint8_t)c;  // 發(fā)送字符
}

char USART_ReceiveChar(void) {
   while (!(USART1->SR & USART_SR_RXNE));  // 等待接收數(shù)據(jù)
   return (char)(USART1->DR & 0xFF);  // 接收字符并返回
}

4.2 串口接收并修改RTC喚醒時(shí)間

一旦串口通信配置完成,可以通過USART接收來自外部設(shè)備的命令,這些命令可以包括新的喚醒時(shí)間。當(dāng)系統(tǒng)接收到新的喚醒時(shí)間時(shí),可以通過修改RTC的鬧鐘寄存器來改變喚醒時(shí)間。下面是一個(gè)接收并更新RTC喚醒時(shí)間的示例代碼:

#include "stm32l1xx.h"

void Update_RTC_AlarmTime(int hours, int minutes, int seconds) {
   // 計(jì)算新的鬧鐘時(shí)間
   uint32_t alarmTime = ((hours << 16) & 0x003F0000) | ((minutes << 8) & 0x00007F00)
   | (seconds & 0x0000007F);

   // 配置RTC鬧鐘時(shí)間
   RTC->ALRMAR = alarmTime;
   RTC->CRL |= RTC_CRL_ALRF;  // 使能鬧鐘中斷/喚醒
}

void USART_ReceiveAndUpdateAlarm(void) {
   char receivedChar;
   int hours = 0, minutes = 0, seconds = 0;

   // 等待接收小時(shí)、分鐘和秒的數(shù)據(jù)
   receivedChar = USART_ReceiveChar();
   hours = receivedChar - '0';  // 假設(shè)接收到的字符是'0'到'9'之間的數(shù)字
   receivedChar = USART_ReceiveChar();
   minutes = receivedChar - '0';
   receivedChar = USART_ReceiveChar();
   seconds = receivedChar - '0';

   // 更新RTC的鬧鐘時(shí)間
   Update_RTC_AlarmTime(hours, minutes, seconds);
}

在這個(gè)示例中,通過USART接收字符(假設(shè)每次接收一個(gè)數(shù)字表示小時(shí)、分鐘、秒),并將其解析為新的時(shí)間值。然后,利用這些值更新RTC模塊中的鬧鐘時(shí)間。實(shí)際使用時(shí),可能需要根據(jù)協(xié)議設(shè)計(jì)更多的字符處理和錯(cuò)誤檢測(cè)機(jī)制。

五、最小系統(tǒng)設(shè)計(jì)與代碼實(shí)現(xiàn)

5.1 最小系統(tǒng)設(shè)計(jì)

在基于STM32L151的最小系統(tǒng)設(shè)計(jì)中,除了主芯片之外,還需要一些基本的外設(shè),如電源電路、時(shí)鐘電路、調(diào)試接口等。最小系統(tǒng)的基本設(shè)計(jì)框圖如下:

  • STM32L151主控芯片:作為核心控制單元,負(fù)責(zé)執(zhí)行應(yīng)用程序、管理外設(shè)、控制功耗等。

  • 32.768 kHz外部晶振:提供RTC所需的精確時(shí)鐘源,確保時(shí)間的準(zhǔn)確性。

  • 電源管理:使用低功耗設(shè)計(jì),包括待機(jī)模式、睡眠模式等,以延長(zhǎng)電池壽命。

  • 串口接口(USART):用于外部設(shè)備與主控芯片之間的通信。

  • 調(diào)試接口(如SWD或JTAG):用于開發(fā)和調(diào)試。

5.2 最小系統(tǒng)電路圖

  • 電源:需要確保STM32L151在低功耗模式下能持續(xù)運(yùn)行。可以使用外部低壓鋰電池(如3.7V)為系統(tǒng)供電。

  • 外部晶振:使用32.768 kHz的晶體振蕩器連接到主控芯片的LSE引腳(低速外部時(shí)鐘),以為RTC提供時(shí)鐘源。

  • USART連接:將USART1的TX和RX引腳分別連接到外部通信設(shè)備(如PC串口),用于接收和發(fā)送數(shù)據(jù)。

5.3 完整的代碼示例

結(jié)合上述部分代碼,以下是一個(gè)簡(jiǎn)化版的完整系統(tǒng)代碼,實(shí)現(xiàn)了STM32L151的RTC自動(dòng)喚醒、附加RTC日歷和通過串口修改喚醒時(shí)間的功能。

#include "stm32l1xx.h"

void RTC_Config(void) {
   // 配置電源和RTC時(shí)鐘源
   RCC->APB1ENR |= RCC_APB1ENR_PWREN;
   PWR->CR |= PWR_CR_DBP;  // 使能備份域電源
   RCC->CSR |= RCC_CSR_LSEON;  // 啟動(dòng)LSE
   while (!(RCC->CSR & RCC_CSR_LSERDY));  // 等待LSE準(zhǔn)備好

   // 配置RTC
   RCC->APB1ENR |= RCC_APB1ENR_RTCEN;  // 使能RTC
   RTC->CRL &= ~RTC_CRL_RSF;  // 等待RTC同步
   RTC->CRL |= RTC_CRL_CNF;  // 進(jìn)入配置模式
   RTC->PRER = 0x007F00FF;  // 設(shè)置RTC預(yù)分頻器
   RTC->CRL &= ~RTC_CRL_CNF;  // 退出配置模式

   // 配置日期和時(shí)間
   RTC->DR = 0x0023;  // 設(shè)置日期:星期一,日期為1號(hào)
   RTC->TR = 0x1230;  // 設(shè)置時(shí)間:12:30:00
}

void USART_Config(void) {
   // 使能USART外設(shè)
   RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
   RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
   GPIOA->MODER |= GPIO_MODER_MODE9_1 | GPIO_MODER_MODE10_1;  // 配置PA9為TX,PA10為RX

   // 配置USART波特率、停止位等
   USART1->BRR = 0x683;  // 設(shè)置波特率為9600
   USART1->CR1 |= USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;  // 使能USART、發(fā)送和接收功能
}

void Update_RTC_AlarmTime(int hours, int minutes, int seconds) {
   uint32_t alarmTime = ((hours << 16) & 0x003F0000) | ((minutes << 8) & 0x00007F00)
    | (seconds & 0x0000007F);
   RTC->ALRMAR = alarmTime;
   RTC->CRL |= RTC_CRL_ALRF;  // 使能鬧鐘中斷/喚醒
}

int main(void) {
   // 配置RTC和USART
   RTC_Config();
   USART_Config();

   while (1) {
       // 通過USART接收新的喚醒時(shí)間并更新RTC
       USART_ReceiveAndUpdateAlarm();

       // 進(jìn)入低功耗模式,等待RTC喚醒
       __WFI();  // 等待中斷或喚醒
   }
}

六、總結(jié)

本文詳細(xì)介紹了STM32L151的RTC模塊在自動(dòng)喚醒和附加日歷功能中的應(yīng)用。通過配置STM32L151的RTC模塊、串口通信功能及低功耗模式,可以實(shí)現(xiàn)系統(tǒng)在低功耗下周期性喚醒,并根據(jù)外部輸入調(diào)整喚醒時(shí)間。此設(shè)計(jì)不僅能夠顯著降低系統(tǒng)的功耗,還能通過串口靈活調(diào)整喚醒時(shí)間,滿足不同應(yīng)用場(chǎng)景的需求。

責(zé)任編輯:David

【免責(zé)聲明】

1、本文內(nèi)容、數(shù)據(jù)、圖表等來源于網(wǎng)絡(luò)引用或其他公開資料,版權(quán)歸屬原作者、原發(fā)表出處。若版權(quán)所有方對(duì)本文的引用持有異議,請(qǐng)聯(lián)系拍明芯城(marketing@iczoom.com),本方將及時(shí)處理。

2、本文的引用僅供讀者交流學(xué)習(xí)使用,不涉及商業(yè)目的。

3、本文內(nèi)容僅代表作者觀點(diǎn),拍明芯城不對(duì)內(nèi)容的準(zhǔn)確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨(dú)立判斷做出的,請(qǐng)讀者明確相關(guān)結(jié)果。

4、如需轉(zhuǎn)載本方擁有版權(quán)的文章,請(qǐng)聯(lián)系拍明芯城(marketing@iczoom.com)注明“轉(zhuǎn)載原因”。未經(jīng)允許私自轉(zhuǎn)載拍明芯城將保留追究其法律責(zé)任的權(quán)利。

拍明芯城擁有對(duì)此聲明的最終解釋權(quán)。

相關(guān)資訊

拍明芯城微信圖標(biāo)

各大手機(jī)應(yīng)用商城搜索“拍明芯城”

下載客戶端,隨時(shí)隨地買賣元器件!

拍明芯城公眾號(hào)
拍明芯城抖音
拍明芯城b站
拍明芯城頭條
拍明芯城微博
拍明芯城視頻號(hào)
拍明
廣告
恒捷廣告
廣告
深亞廣告
廣告
原廠直供
廣告