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,一经查实,立即删除!

相关文章

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

本文来自&#xff1a;安卓航班网 首先&#xff0c;欢迎来到程序员的世界。在这个世界上&#xff0c;不是有很多人想创造软件并解决问题。你是一名hacker&#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.…

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、快速放电…

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

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

socket初级使用(客户端)

在国庆这段时间里用零星的一些时间看了一下socket的学习资料&#xff0c;由于笔者偏向学习实用方面的内容&#xff0c;因此此篇文章涉及理论知识较少&#xff0c;主要是以实现思路(怎么做)为主,但在实现之前还是需要了解一些基础的理论知识(如果其中有误请指出) TCP是用socket来…

第11章 路由器OSPF动态路由配置

实验目标&#xff1a; 一、掌握OSPF协议的配置方法&#xff1b; 二、掌握查看通过动态路由协议OSPF学习产生的路由信息&#xff1b; 三、熟悉广域网线缆连接方式&#xff1b; 技术原理&#xff1a; OSFP开放式最短路径优先协议&#xff0c;是目前网络中最广泛的路由协议之一。属…

Hi3515的开发板 Hi3515 SDK编译出错 提示缺少libpciv.a的解决办法

From: http://zyd87818.blog.163.com/blog/static/17488150120124300261687/ 这是HI3515说明文档的说明 但是我进去编译却通不过&#xff0c;提示错误如下 通过qq群里的好人帮助解决方法如下首先看一下makefile自己看不懂&#xff0c;经高人指点需要修改Makefile.param文件…

poj1222

题意&#xff1a;一个01矩阵&#xff0c;表示灯的亮灭状态&#xff0c;每次操作可以改变一个十字形状内的五个灯的状态。问能否将所有灯熄灭。 分析&#xff1a;高斯消元法 对于每个灯的两灭有影响的开关就是它附近十字形内的五个开关。所以对于每个灯可以列一个方程&#xff0…

iphone开发我的新浪微博客户端-用户登录准备篇(1.1)

首先说一下我这个的实现思路&#xff0c;登录支持多个账号&#xff0c;也就是说可以保存多个微博账号登录的时候选择其中一个登录。多个账号信息保存在sqlite的数据库中&#xff0c; 每一个账号信息就是一条记录, 当用户启动微博客户端的时候去取保存在sqlite数据库中的账号记录…

基于密度的异常值检测方法整理

基于密度的异常值检测方法的原理认为正常样本点所处的类簇密度要高于异常点样本所处的类簇密度。为解决实际异常值检测情况 中出现的问题&#xff0c;有一种基于局部异常因子 LOF 方法。

GWT 入门介绍

From: http://blog.csdn.net/struts2/article/details/1758122 GWT 入门介绍 GWT使用JSON格式的数据通讯 GWT是 Google Web Toolkit的简称。 GWT是一个以Java语言为工具&#xff0c;以类似Swing的方式编写UI组件&#xff0c;之后通过GWT Compiler编译 为JavaScritp和HTM…

SQL Server 2008空间数据应用系列十一:Bing Maps中呈现GeoRSS订阅的空间数据

友情提示&#xff0c;您阅读本篇博文的先决条件如下&#xff1a; 1、本文示例基于Microsoft SQL Server 2008 R2调测。 2、具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验。 3、熟悉或了解Microsoft SQL Server 2008中的空间数据类型。 4、具备相应&am…

聚类算法的分类整理

1、基于划分的聚类算法 基于划分的聚类算法 主要通过聚类中心的迭代重置&#xff0c;直到达到“簇内点足够近&#xff0c;簇间点足够远”的目标效果&#xff0c;完成样本集的最优化分。其算法优点是时间、空间复杂度低&#xff0c;可以处理大规模数据集。缺点包括容易陷入局部…

minGW64安装和使用 极简教程

1、下载minGW64 官网下载&#xff1a;https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/我的FTP&#xff1a;a、minGW64 install.exe b、解压免安装版 2、解压 3、添加环境变量 4、CMD 运行gcc 安装完成。 5、使用minGW编译C源码 6、运行

[C#反编译教程]001.Reflector.NET反编译工具 v8.5绿色版+注册机+注册教程

截图 下载地址 Reflector.NET反编译工具 v8.5绿色版注册机 下载地址&#xff1a;http://pan.baidu.com/s/1mgN1Cpi 密码&#xff1a;mx19 简介 .NET Reflector是一个类浏览器和反编译器&#xff0c;.NET Reflector可以分析程序集并向你展示它的所有秘密。.NET 框架向全世界引入…

openOCD安装 极简教程

1、下载openOCD 官网下载&#xff1a;https://gnutoolchains.com/arm-eabi/openocd/我的FTP&#xff1a;openOCD 2、解压 3、添加环境变量 ->path 4、CMD运行openOCD 安装完成。

一起谈.NET技术,.NET4.0 之 Dynamic VS Reflection 效率

在我先前的文章中&#xff0c;不断的推广.NET4.0新特性。特别是.NET4.0 Dynamic 这个新特性。随之而来的问题也出现了—Dynamic 执行效率如何&#xff1f; 我们做开发的不光需要代码简洁&#xff0c;能够希望自己能够写出好的架构。还有一点非常重要的就是&#xff0c;我们的写…