1、前言

一个周期性控制系统的核心为CM3计算板,在电池供电情况下要求尽可能提高使用时长。由于系统空闲时长较多,因此在考虑低功耗的情况下将系统关机以进一步降低功耗。需要注意的是,系统关机后需要在指定时间唤醒,继续执行相关任务,这涉及到如何唤醒系统。

系统关机很容易用代码实现功能,一旦关机系统的服务都挂掉,如何保留开机任务?需要借助系统外围设计。

可以进一步抽象该需求,如何定时开机。目前我的设计比较暴力,其一,开机方式通过重置CM3计算板的Reset (RUN)引脚加以实现;其二,定时方式通过外部RTC时钟芯片进行设置,且RTC时钟芯片可以设置闹钟,产生硬件中断等电平触发跳变。

2、硬件

根据前面的描述,硬件连接示意图如下所示。详细电路连接不在此处罗列,以下介绍设计的要求。

  • CM3:提供一组I2C接口用于设置外部RTC
  • RTC:电池供电的实时时钟芯片,用I2C进行通信,具有闹钟功能,能产生闹钟中断
  • MCU:识别RTC闹钟中断信号,输出CM3系统复位信号。

具体地,选用的RTC为DS3231,该RTC的芯片资料可以在这里查看,逻辑框图大概就是这么回事。

本例的MCU作用很单一,检测RTC中断,并复位CM3。所以可以用很简单的单片机,比如51单片机都可以,我这里用的是SOP8封装的STC15W104单片机,STC单片机,你懂得。单片机采用中断还是电平检测都可以,这是由于DS3231产生闹钟中断后,INT管脚在没有被清除闹钟之前一直保持低电平,这很重要。

当然,如果不想对MCU单片机编程,也可以用其他边沿触发电路来代替MCU,比如采用JK触发器实现下降沿的捕获,再配合其他的硬件电路产生一个CM3复位电平即可。CM3的复位管脚Run为电平复位,拉低然后保持一点时间,再松开即可完成复位重启。如下图。

其他需要说明的,在采用MCU方式输出CM3复位信号的方案下,通常不要用MCU管脚直接连接CM3的复位系统,做一次信号隔离和驱动以保证两个系统的耦合性,例如,可以采用以下三极管驱动的方式。SYS_RST为MCU输出的信号,注意,此处需要MCU拉电流,因此配置MCU的相关管脚为强输出,即推挽输出以保证足够的驱动能力。

3、软件

3.1 DS3231驱动软件

DS3231采用标准I2C接口,Linux环境下在Github找到了现成的驱动rtcctl[点击链接]。使用起来非常方便,简单介绍使用方法。

(1) 下载

github地址: https://github.com/bablokb/pi-wake-on-rtc

(2)  安装

cd pi-wake-on-rtc //进入下载的文件夹内
sudo tools/install //执行安装脚本

(3)  使用

命令为rtcctl,详细的命令参数如下所示:

Available commands (date and time are synonyms):help                                - dump list of available commandsinit                                - initialize RTCshow  [date|time|alarm1|alarm2|sys]- display given type or alldump  [control|status|alarm1|alarm1]- display registers (hex/binary format)set   date|time|alarm1|alarm2|sys   - set date/time, alarm1, alarm2 timesFormat: dd.mm.YYYY [HH:MM[:SS]] ormm/dd.YYYY [HH:MM[:SS]](does not turn alarm on!)on    alarm1|alarm2                 - turn alarm1/alarm2 onoff   alarm1|alarm2                 - turn alarm1/alarm2 offclear alarm1|alarm2                 - clear alarm1/alarm2-flag

****注意1,该脚本使用的I2C默认挂接到I2C1,需要在系统中提前打开I2C接口,用i2cdetect 识别一下是否存在ID为68的设备。

****注意2,该脚本部分为window环境下编辑,如果执行命令报错,且提示存在"\r\n"错误,需要将该格式全部换成linux下的文件,可以参考这篇博文。

rtcctl命令使用起来很简单,如下:

/* rtcctl 初始化 */
rtcctl init
/* rtcctl 查看系统时间 */
rtcctl show sys
/* rtcctl 查看闹钟1信息 */
rtcctl show alarm1
/* rtcctl 启用闹钟1 */
rtcctl on alarm1
/* rtcctl 清除闹钟1 */
rtcctl clear alarm1
/* rtcctl 设置闹钟1时间 2019/06/01 15:30:00 闹钟产生中断*/
rtcctl set 06/01/2019 15:30:00

3.2 MCU软件

MCU主要检测RTC闹钟中断,RTC闹钟产生中断后如果不清除则一直保持低电平状态。简单写的一个边沿识别程序如下:

void main()
{uint16_t Alarm1_tick = 0;uint8_t isSYSRstWorked = 0;uint8_t Alarm_reg0 = 0;uint8_t Alarm_reg1 = 0;/*! I/O configure */P3M1 = 0x00;P3M0 = 0x0C;SYS_RST_Out = 0;//init pin statewhile(1){delay_ms(1);//systick/*!  handle RTC wake up alarm1  */if(isSYSRstWorked == 0){Alarm_reg1 = Alarm_reg0;Alarm_reg0 = RTC_Alarm1_In;/*! check RTC alarm1 fall-edge */if((!Alarm_reg0) && Alarm_reg1 == 1){isSYSRstWorked = 1;}}else{Alarm1_tick++;/* ___________|-----|_____________ */if(Alarm1_tick < 2000) SYS_RST_Out = 1;else{Alarm1_tick = 0;SYS_RST_Out = 0;isSYSRstWorked = 0;}}}
}

可见,只要MCU识别到一个下降沿,就会产生一个CM3复位脉冲,脉冲宽度为2s,经过测试,可以实现CM3复位重启,达到定时开机的要求了。

3.3 CM3执行逻辑

RTC和MCU的外设配置完成后,需要在CM3编写执行逻辑。首先CM3开机后执行清除RTC闹钟(# rtcctl clear alarm1),或者直接对RTC进行初始化(# rtcctl init),其次执行正常监控管理任务,最后在关机之前设置下一次需要唤醒的RTC闹钟时间,推荐采用绝对时间方式,即计算重启时间到1970年1月1日(epoch·time)过了多少秒,再将重启时间的秒数转换为rtcctl命令的时间戳 mm/dd/yyyy HH:MM:SS,即可。

4、最后

总的来说,这个方案容易想到,实现起来也不复杂,简单的外设即可搞定。多谢github作者的rtcctl源码,学习了。

CM3计算板RTC闹钟唤醒系统相关推荐

  1. stm32单片机实现多个闹钟_STM32实现对RTC闹钟唤醒的设计

    工程中用到低功耗的控制,本来想使用待机模式,后来发现待机后所有IO口为高阻态,这样对于一些IO口控制的外设有些不妥,想过外部上拉一个电阻可是功耗不好控制放弃该方案选用停止模式.停止模式后IO口保持停止 ...

  2. STM32的RTC闹钟唤醒待机模式

    通过RTC闹钟不能唤醒待机模式下的STM32,但是当注释掉下面这一句程序的时候,就能通过RTC闹钟唤醒. PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚功能 这就给我们一种错误的判 ...

  3. STM32:RTC闹钟唤醒

    想使用闹钟唤醒功能使系统从待机下唤醒,遇到一个问题:使用闹钟唤醒就不能使用wakeup pin唤醒.二者只能取其一. 此问题解决,画了个板子wakeup pin 接下拉电阻解决. 写新代码时候遇到一个 ...

  4. STM32CubeMX(stm32F030C8T6) 之RTC闹钟唤醒停机模式-STM32开发实战 (2)

    一.概述 本例程是用STOP休眠模式,用RTC的周期性自动唤醒功能来唤醒芯片. 根据手册的说明:这里有个可编程的可自动重装的向下计数器,按照相应的时钟频率赋予适当的值,每当向下计数到0时便产生一个唤醒 ...

  5. RK3399平台开发系列讲解(应用开发篇)1.12、RTC闹钟唤醒

    平台 内核版本 安卓版本 RK3399 Linux4.4 Android7.1 文章目录 一.结构体说明 itimerspec sigevent 二.定时器例子 一.结构体说明 itimerspec ...

  6. STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)

    STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...

  7. 【STM32】RTC休眠唤醒(停机模式)、独立看门狗开启状态下

    本文章基于STM32F103RC: 在开启独立看门狗的状态下,进入停机模式,由RTC定时闹钟唤醒系统. 直接上代码: #include "main.h" static void R ...

  8. GD32F4—RTC闹钟及自动唤醒中断配置详解

    GD32F4-RTC闹钟及自动唤醒中断配置详解 一.简介 二.框图 三.RTC 初始化和配置 一.简介 GD32F4x的RTC例程网上资源较少,详细阅读用户手册后做出如下配置.RTC模块提供了一个包含 ...

  9. STM32F030的低功耗案例(RTC闹钟中断定时唤醒喂狗+按键外部中断唤醒)

    最近使用到低功耗方案,采用的是STM32F030C8T6芯片,由于任务开启了看门狗,进入休眠后(采用的是STOP模式),需要及时喂狗,故而使用RTC闹钟中断定时唤醒来喂狗. 对比三种休眠模式:就设备的 ...

最新文章

  1. vue2.0中文网站2.0
  2. JavaScript prototype整理(网上的三种理解)
  3. 用栈实现队列和用队列实现栈
  4. ASP——判断数据库NULL值
  5. mysqls压力测试怎么用_阿里研究员:测试稳定性三板斧,我怎么用?
  6. (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第零节:MYSQL环境安装和表的建立以及一些注意事项
  7. jQuery1.9+ 废弃的函数和方法 升级Jquery版本遇到的问题
  8. css3中的@font-face的用法(定义多个规则)
  9. php微信小程序 留言功能,微信小程序评论/留言功能,附:前端+后端代码+视频讲解!...
  10. Unity3D基本知识 构造函数 this用法
  11. 什么是Pythonic?
  12. 显示器U2518怎么连服务器,【戴尔 U2518D 显示器使用感受】尺寸|分辨率|边框|底座|颜色_摘要频道_什么值得买...
  13. INVE主网砸金蛋小游戏玩法
  14. aws eks 快速启动和配置
  15. webmatrix3 php,webmatrix下载_webmatrix v3.0 官方版_魅蓝下载
  16. 基于Youtube-8M的视频场景分类
  17. PulpSolverError: Pulp: Error while executing
  18. 张小龙发布2018微信全新计划(内附演讲全文)
  19. Android ------ 360加固出现预签名失败align error
  20. 既然选择了远方便只顾风雨兼程

热门文章

  1. c++中的delete和delete[]
  2. 使用X.509数字证书加密解密实务(一)-- 证书的获得和管理
  3. java.util.set cannot be assigned from null_Java中有关Null的9件事
  4. python快速检测视频跳过帧_使用Python实现跳帧截取视频帧
  5. 机器学习的练功心法(二)——引入
  6. 在手机测试html,借助 IIS 管理器 -- 用手机测试HTML页面
  7. 【 Grey Hack 】WIFI万能钥匙
  8. Exynos4412 Uboot 移植(三)—— Uboot添加自定义命令
  9. Linux 设备驱动的并发控制
  10. VC命令行编译参数介绍