0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > STM32L151 RTC自动唤醒-附加RTC日历-串口修改唤醒时间(最小系统+源码)

STM32L151 RTC自动唤醒-附加RTC日历-串口修改唤醒时间(最小系统+源码)

来源: 电路城
2021-12-13
类别:工业控制
eye 24
文章创建人 拍明

原标题:STM32L151 RTC自动唤醒-附加RTC日历-串口修改唤醒时间(最小系统+源码)

STM32L151 RTC自动唤醒及附加RTC日历设计详解

在低功耗应用中,利用STM32L151的RTC(实时时钟)模块进行自动唤醒和附加RTC日历管理是非常关键的设计要点。STM32L151作为STM32系列中的低功耗型号,具备强大的低功耗模式,可以通过RTC模块配合自动唤醒机制来实现节能目标。本文将详细阐述如何使用STM32L151的RTC模块进行自动唤醒,并结合附加RTC日历功能,以及如何通过串口修改唤醒时间的相关技术细节,最终呈现一个基于最小系统的源码示例。

image.png

一、主控芯片型号及在设计中的作用

1.1 STM32L151的型号介绍

STM32L151属于STMicroelectronics的STM32系列微控制器,基于ARM Cortex-M3内核,主频最高可达32MHz。STM32L151是该系列中主打低功耗和高效能的型号,特别适合低功耗电池驱动的应用场景。STM32L151拥有丰富的外设资源,支持多种低功耗工作模式,内建实时时钟(RTC)、低功耗看门狗(IWDG)等模块,可以实现高效的时间管理和低功耗控制。

STM32L151系列的主要特点包括:

  • 最高主频32 MHz

  • 低功耗设计,具有多种省电模式(待机、睡眠、停机模式等)

  • 内置16-bit RTC模块,支持自动唤醒和时间计数

  • 集成多种外设,如USART、I2C、SPI、ADC等

  • 具有内置闪存和RAM,适用于嵌入式系统开发

1.2 在设计中的作用

在本设计中,STM32L151作为核心控制单元,承担了以下几项重要任务:

  • RTC自动唤醒管理:利用RTC模块在设定的时间周期内唤醒系统,控制功耗,实现精确的时间调度。

  • 附加RTC日历功能:借助RTC模块实现基于时间的事件触发,控制设备的行为,比如定时开关机、定时操作等。

  • 串口通信:通过USART串口接口接收外部命令,修改唤醒时间等参数,实现灵活的控制。

通过合理配置STM32L151的低功耗模式和RTC唤醒机制,能够在不需要频繁唤醒的情况下大幅降低系统的功耗,提高系统的续航能力。

二、RTC模块与自动唤醒机制

2.1 RTC模块工作原理

STM32L151的RTC模块基于外部32.768 kHz晶振或内部低速振荡器(LSI)工作,提供精确的时钟源。在设计中,RTC模块不仅用于提供准确的时间,还能用于定时唤醒系统。RTC模块具有以下功能:

  • 实时时钟:RTC提供准确的年月日、时分秒计时,适合用于日历和定时器应用。

  • 定时唤醒:通过设置RTC的闹钟或定时器,系统可以在设定的时间周期内自动唤醒,适用于周期性唤醒场景。

  • 低功耗运行:RTC能够在STM32L151进入低功耗模式(如待机模式)时继续运行,不会受到主系统休眠的影响。

2.2 RTC自动唤醒流程

RTC的自动唤醒流程通常包括以下几个步骤:

  1. 配置RTC时钟源:选择32.768 kHz的外部晶振作为RTC时钟源,以保证精确度。

  2. 设置RTC的闹钟时间:配置闹钟或定时器,在设定的时间内触发唤醒。

  3. 进入低功耗模式:将STM32L151进入低功耗模式(如待机模式、睡眠模式等),以降低功耗。

  4. 触发唤醒:当RTC计时器或闹钟到达设定时间时,系统会自动从低功耗模式唤醒。

2.3 配置RTC模块的关键寄存器

在STM32L151中,配置RTC模块需要操作几个关键寄存器:

  • RTC_CR(RTC控制寄存器):用于使能RTC和配置时钟源。

  • RTC_PRER(RTC预分频器寄存器):设置RTC的预分频器,用于调整RTC计时精度。

  • RTC_ALRMAR(RTC闹钟A寄存器):配置闹钟A的触发时间。

  • RTC_ISR(RTC初始化和状态寄存器):用于检查RTC的初始化状态和相关事件。

三、附加RTC日历功能

附加RTC日历功能通常用于系统需要精确的时间和日期管理。例如,在一个基于RTC的自动唤醒系统中,可能需要根据日期和时间触发不同的事件。STM32L151的RTC模块支持完整的日历功能,包括年、月、日、小时、分钟和秒等信息。RTC模块通过闹钟、周期定时器等方式与日历结合,从而实现按特定时间段或日期触发事件。

3.1 配置RTC日历功能

STM32L151支持将RTC模块配置为日期和时间功能,可以精确到年、月、日、小时、分钟、秒。通过设置RTC的日期和时间寄存器(RTC_TR和RTC_DR),可以实现日历功能。具体步骤如下:

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

  • 设置时间寄存器(RTC_TR):配置小时、分钟、秒信息。

  • 设置闹钟触发:结合RTC模块的闹钟功能,实现按特定时间触发事件。

3.2 示例代码:RTC日历配置

以下是一个配置RTC日历和时间的示例代码:

#include "stm32l1xx.h"

void RTC_Config(void) {
   // 使能LSE外部晶振
   RCC->APB1ENR |= RCC_APB1ENR_PWREN;
   PWR->CR |= PWR_CR_DBP;  // 使能备份域电源
   RCC->CSR |= RCC_CSR_LSEON;  // 启动LSE
   while (!(RCC->CSR & RCC_CSR_LSERDY));  // 等待LSE准备好

   // 配置RTC
   RCC->APB1ENR |= RCC_APB1ENR_RTCEN;  // 使能RTC
   RTC->CRL &= ~RTC_CRL_RSF;  // 等待RTC同步
   RTC->CRL |= RTC_CRL_CNF;  // 进入配置模式
   RTC->PRER = 0x007F00FF;  // 设置RTC预分频器
   RTC->CRL &= ~RTC_CRL_CNF;  // 退出配置模式

   // 配置日期和时间
   RTC->DR = 0x0023;  // 设置日期:星期一,日期为1号
   RTC->TR = 0x1230;  // 设置时间:12:30:00
}

3.3 时间和日期格式化

为了便于操作,STM32L151的RTC日历功能可以通过将RTC寄存器中的数据提取并格式化为常见的时间字符串格式(例如“YYYY-MM-DD HH:MM:SS”)。可以通过位操作提取出年、月、日、时、分、秒,然后进行格式化。

四、通过串口修改唤醒时间

为了使系统的唤醒时间更具灵活性,设计中可以通过USART串口接收外部命令,动态修改RTC闹钟的唤醒时间。通过UART串口与PC或其他外部设备进行通信,接收新的唤醒时间并更新RTC模块的闹钟寄存器。

4.1 串口通信配置

STM32L151支持多种串口协议,其中USART是常用的串口通信接口。以下是串口配置代码示例:

#include "stm32l1xx.h"

void USART_Config(void) {
   // 使能USART外设
   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;  // 设置波特率为9600
   USART1->CR1 |= USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;  // 使能USART、发送和接收功能
}

void USART_SendChar(char c) { while (!(USART1->SR & USART_SR_TXE));  // 等待数据寄存器空
   USART1->DR = (uint8_t)c;  // 发送字符
}

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

4.2 串口接收并修改RTC唤醒时间

一旦串口通信配置完成,可以通过USART接收来自外部设备的命令,这些命令可以包括新的唤醒时间。当系统接收到新的唤醒时间时,可以通过修改RTC的闹钟寄存器来改变唤醒时间。下面是一个接收并更新RTC唤醒时间的示例代码:

#include "stm32l1xx.h"

void Update_RTC_AlarmTime(int hours, int minutes, int seconds) {
   // 计算新的闹钟时间
   uint32_t alarmTime = ((hours << 16) & 0x003F0000) | ((minutes << 8) & 0x00007F00)
   | (seconds & 0x0000007F);

   // 配置RTC闹钟时间
   RTC->ALRMAR = alarmTime;
   RTC->CRL |= RTC_CRL_ALRF;  // 使能闹钟中断/唤醒
}

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

   // 等待接收小时、分钟和秒的数据
   receivedChar = USART_ReceiveChar();
   hours = receivedChar - '0';  // 假设接收到的字符是'0'到'9'之间的数字
   receivedChar = USART_ReceiveChar();
   minutes = receivedChar - '0';
   receivedChar = USART_ReceiveChar();
   seconds = receivedChar - '0';

   // 更新RTC的闹钟时间
   Update_RTC_AlarmTime(hours, minutes, seconds);
}

在这个示例中,通过USART接收字符(假设每次接收一个数字表示小时、分钟、秒),并将其解析为新的时间值。然后,利用这些值更新RTC模块中的闹钟时间。实际使用时,可能需要根据协议设计更多的字符处理和错误检测机制。

五、最小系统设计与代码实现

5.1 最小系统设计

在基于STM32L151的最小系统设计中,除了主芯片之外,还需要一些基本的外设,如电源电路、时钟电路、调试接口等。最小系统的基本设计框图如下:

  • STM32L151主控芯片:作为核心控制单元,负责执行应用程序、管理外设、控制功耗等。

  • 32.768 kHz外部晶振:提供RTC所需的精确时钟源,确保时间的准确性。

  • 电源管理:使用低功耗设计,包括待机模式、睡眠模式等,以延长电池寿命。

  • 串口接口(USART):用于外部设备与主控芯片之间的通信。

  • 调试接口(如SWD或JTAG):用于开发和调试。

5.2 最小系统电路图

  • 电源:需要确保STM32L151在低功耗模式下能持续运行。可以使用外部低压锂电池(如3.7V)为系统供电。

  • 外部晶振:使用32.768 kHz的晶体振荡器连接到主控芯片的LSE引脚(低速外部时钟),以为RTC提供时钟源。

  • USART连接:将USART1的TX和RX引脚分别连接到外部通信设备(如PC串口),用于接收和发送数据。

5.3 完整的代码示例

结合上述部分代码,以下是一个简化版的完整系统代码,实现了STM32L151的RTC自动唤醒、附加RTC日历和通过串口修改唤醒时间的功能。

#include "stm32l1xx.h"

void RTC_Config(void) {
   // 配置电源和RTC时钟源
   RCC->APB1ENR |= RCC_APB1ENR_PWREN;
   PWR->CR |= PWR_CR_DBP;  // 使能备份域电源
   RCC->CSR |= RCC_CSR_LSEON;  // 启动LSE
   while (!(RCC->CSR & RCC_CSR_LSERDY));  // 等待LSE准备好

   // 配置RTC
   RCC->APB1ENR |= RCC_APB1ENR_RTCEN;  // 使能RTC
   RTC->CRL &= ~RTC_CRL_RSF;  // 等待RTC同步
   RTC->CRL |= RTC_CRL_CNF;  // 进入配置模式
   RTC->PRER = 0x007F00FF;  // 设置RTC预分频器
   RTC->CRL &= ~RTC_CRL_CNF;  // 退出配置模式

   // 配置日期和时间
   RTC->DR = 0x0023;  // 设置日期:星期一,日期为1号
   RTC->TR = 0x1230;  // 设置时间:12:30:00
}

void USART_Config(void) {
   // 使能USART外设
   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;  // 设置波特率为9600
   USART1->CR1 |= USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;  // 使能USART、发送和接收功能
}

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接收新的唤醒时间并更新RTC
       USART_ReceiveAndUpdateAlarm();

       // 进入低功耗模式,等待RTC唤醒
       __WFI();  // 等待中断或唤醒
   }
}

六、总结

本文详细介绍了STM32L151的RTC模块在自动唤醒和附加日历功能中的应用。通过配置STM32L151的RTC模块、串口通信功能及低功耗模式,可以实现系统在低功耗下周期性唤醒,并根据外部输入调整唤醒时间。此设计不仅能够显著降低系统的功耗,还能通过串口灵活调整唤醒时间,满足不同应用场景的需求。

责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告