CM3计算板RTC闹钟唤醒系统

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源码,学习了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] 在React中如果去除生产环境上的sourcemap?

[react] 在React中如果去除生产环境上的sourcemap&#xff1f; GENERATE_SOURCEMAPfalse react-scripts buildIf you use the Create-React-APP 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目…

[相关总结性文章] 写给即将入行的程序员的一封信

本文来自&#xff1a;安卓航班网 首先&#xff0c;欢迎来到程序员的世界。在这个世界上&#xff0c;不是有很多人想创造软件并解决问题。你是一名hacker&#xff0c;属于那些愿意做一些有挑战性的事情的人。  “当你不创造东西时&#xff0c;你只会根据自己的感觉而不是能力去…

火狐浏览器所有的快捷键

From: http://zhidao.baidu.com/question/218604936.html firefox快捷键搜索类&#xff1a;本页查找&#xff1a; CtrlF 再次查找&#xff1a; F3 输入查找链接&#xff1a; 输入查找文本&#xff1a; / 查找&#xff1a; ShiftF3 网页搜索&#xff1a; CtrlK 或 CtrlEfire…

超文本引用href的几种用法

href"要跳转目标链接"; href"#";当前页面不跳转&#xff08;返回顶部&#xff09; href"###";当前页面不跳转&#xff08;同时不回到顶部&#xff09; href"javascript:;";当前页面不跳转&#xff0c;返回空 href"javscript:void…

[react] React的触摸事件有哪几种?

[react] React的触摸事件有哪几种&#xff1f; onTouchCancel onTouchEnd onTouchMove onTouchStart 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

arm-linux-gnueabihf gcc8.3交叉编译工具搭建教程

一、运行环境 1.1 执行机环境 ld GNU ld (GNU Binutils for Raspbian) 2.31.1 ldd ldd (Debian GLIBC 2.28-10rpi1) 2.28 Copyright (C) 2018 Free Software Foundation, Inc. gcc (Raspbian 8.3.0-6rpi1) 8.3.0 Copyright (C) 2018 Free Software Foundation, Inc.…

Md5 Md5实现原理

参考&#xff1a; http://wenku.baidu.com/view/ddb1008271fe910ef12df8df.html转载于:https://www.cnblogs.com/85538649/archive/2011/08/24/2152187.html

Linux tcpdump命令详解

From: http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 简介 用简单的话来定义tcpdump&#xff0c;就是&#xff1a;dump the traffic on a network&#xff0c;根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包…

Win7 64bit系统下未能加载文件或程序集“System.Data.SQLite”的另一解决办法

在http://www.cnblogs.com/downcom/archive/2009/10/26/1590120.html中我曾给出一种解决方法&#xff0c;但这种方法在本地用64位系统开发程序&#xff0c;但服务器却是使用的32位的系统时却是很麻烦的&#xff0c;一直得改来改去的&#xff0c;今天使用另一种解决方法。 1、打…

整理一下网上看到的几个巧妙小电路

1、单按键开关机电路 思路&#xff1a;按下按键后&#xff0c;MCU输出开机信号PG1&#xff0c;关机则检测KEY1的电平&#xff0c;关键是二极管构成“或”的电路。 2、USB和电池供电切换电路 思路&#xff1a;USB有电则断开电池供电回路&#xff0c;用P-MOS管实现 3、快速放电…

[react] 状态管理器解决了什么问题?什么时候用状态管理器?

[react] 状态管理器解决了什么问题&#xff1f;什么时候用状态管理器&#xff1f; 专注 view 层 React 官网是这么简介的。JavaScript library for building user interfaces.专注 view 层 的特点决定了它不是一个全能框架&#xff0c;相比 angular 这种全能框架&#xff0c;R…

艾伟:ASP.NET跨页面传值技巧总结

关于页面传值的方法&#xff0c;引发了很多讨论。看来有很多人关注这个&#xff0c;我就我个人观点做了些总结&#xff0c;希望对大家有所帮助。 1. 使用QueryString变量 QueryString是一种非常简单的传值方式&#xff0c;他可以将传送的值显示在浏览器的地址栏中。如果是传递…

BCC异或校验 Linux C

1、BCC异或校验 从输入的HEX第一个字节开始&#xff0c;按字节依次循环计算异或值直到HEX结尾字节&#xff0c;得到的最终一个字节值。 2、C程序 /******************************************************************************* _____ ___ ____ ___ _____ _ …

Linux tcpdump命令用法详解

From: http://os.51cto.com/art/201005/201921.htm TCPDUMP简介 在传统的网络分析和测试技术中&#xff0c;嗅探器(sniffer)是最常见&#xff0c;也是最重要的技术之一。sniffer工具首先是为网络管理员和网络程序员 进行网络分析而设计的。对于网络管理人员来说&#xff0c;使用…

[react] 在React中怎么引用sass或less?

[react] 在React中怎么引用sass或less&#xff1f; 安装 npm node-sass -D 导入&#xff1a; import app from ../app.module.scss 使用&#xff1a; <div className{app.tabbar}> 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c;…

Revit二次开发“创建组遍历组Group”

group 就是吧一些有关系的对象放在一个组里面 [Transaction(TransactionMode.Manual)][Regeneration(RegenerationOption.Manual)]//[Journaling(JournalingMode.NoCommandData)]publicclasscmdGroup : IExternalCommand{ publicResult Execute(ExternalCommandData cmdData…

hdu 3951 硬币围成一圈(博弈)

n个硬币围成一个环 每次只能取1-K个硬币 最后取完者胜 假如5个硬币 每次取1-2个情况1 先手取1个 后手取剩下4个中间2个 破坏了连续 虽然最后剩2个&#xff0c;但先手只能取一个 然后后再取一个 后手胜 情况2 先手取2个 后手取剩下3个中间的那1个 然后同理 后手胜 Sample Input2…

C 如何对指针进行指定字节的偏置操作

1、概念 指针进行偏置操作后&#xff0c;需要注意的是偏置指向为同类型的指针&#xff0c;不可简单认为指针的指向地址增加或减小响应的偏置量。 2、示例 int aVal 100; int *pVal; int offset 2; pVal &aValoffset;Q:假设aVal的地址为6684156&#xff1b;求pVal的值…

[react] 举例说明如何在React创建一个事件

[react] 举例说明如何在React创建一个事件 import React, { Component } from react; import ReactDOM from react-dom; var EventEmitter require(events).EventEmitter; let emitter new EventEmitter();class ListItem extends Component {static defaultProps {checked…

c# 2.0实现摄象头视频采集,拍照,录象

From: http://blog.csdn.net/ysq5202121/article/details/5672291 Camera.cs类文件using System; using System.IO; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.Drawing; using System.Collections; using System.Data;namespace So…