热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

CH579/578/577/573/571/57x内部RTC使用

本文目的本文将记录如何在沁恒的blesoc上使用rtc以及注意事项对于用到BLE功能,不建议直接对RTC直接操作,而是使用wch提供的系统TMOS的API,这里有个使用总结:htt

本文目的

本文将记录如何在沁恒的ble soc上使用rtc 以及注意事项

对于用到BLE功能,不建议直接对RTC直接操作,而是使用wch提供的"系统" TMOS的API,这里有个使用总结: https://www.cnblogs.com/iot-fan/p/13460082.html


适用芯片

  • CH579/CH578/CH577

  • CH573/CH571


差异部分






















差异部分CH579/578/577CH573/571
上电默认启动
触发值设置

说明

  • 直至目前,WCH的CH57*系列芯片都是只提供了一个RTC外设

  • CH57*系列的RTC外设不支持独立供电

  • 该RTC只有一个触发(CC)中断,和一个定时中断

  • 该RTC的时钟源不支持预分频,即为固定1s=32768当用的是32.768的外部时钟时候

  • 该RTC的CNT最大值不是对齐到2的N次方-1 ,而是以1s=37268 记一天的值即0xA8C00000


使用

实际上在wch 提供的ble 工程里,有比较充分的rtc的使用方式

如下是一个CH573 ble sdk 里面的提供的代码(在CH573EVT_1.6\EXAM\BLE\HAL\RTC.c)

void HAL_TimeInit( void )
{
#if( CLK_OSC32K ) //使用内部的32K RC作为RTC的时钟,由于rc振荡器是误差比较大,所以wch提供了校准函数,并且根据需求是校准到32Khz 还是32.768khz
R8_SAFE_ACCESS_SIG = 0x57;
R8_SAFE_ACCESS_SIG = 0xa8;
R8_CK32K_CONFIG &= ~(RB_CLK_OSC32K_XT|RB_CLK_XT32K_PON);
R8_CK32K_CONFIG |= RB_CLK_INT32K_PON;
Lib_Calibration_LSI(); // 32K rc的校准,如果不需要高精度(比如一些非ble应用),可以注释掉这个代码,可以省去一些RAM和flash空间
#else
R8_SAFE_ACCESS_SIG = 0x57;
R8_SAFE_ACCESS_SIG = 0xa8;
R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT | RB_CLK_INT32K_PON | RB_CLK_XT32K_PON;
R8_SAFE_ACCESS_SIG = 0;
#endif
RTC_InitTime( 2020, 1, 1, 0, 0, 0 ); //RTC时钟初始化当前时间,这里实际上年月日时分秒的计算都是软件实现,如果不需要,可以注释掉.同样可以省区一些RAM和flash资源
TMOS_TimerInit( 0 ); //tmos的时间初始化,当我么没有用到tmos时候,这里注释掉即可
}
//这里传入的是RTC的值
//WCH 的rtc这里的设计比较奇葩,rtc 的cnt最大是一天的,所以这里的设置触发值最大是32768*3600*24 = 0xA8C00000,
//所以time 在传入前,需要做 if( time > 0xA8C00000 ) time -= 0xA8C00000; (出处:CH573EVT_1.6\EXAM\BLE\HAL\SLEEP.c 中的CH57X_LowPower 函数)
void RTC_SetTignTime( u32 time )
{
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
R32_RTC_TRIG = time;
RTCTigFlag = 0;
}
__attribute__((interrupt("WCH-Interrupt-fast"))) // wch的硬件压栈
__attribute__((section(".highcode"))) // 需要放到RAM里面
void RTC_IRQHandler( void )
{
R8_RTC_FLAG_CTRL = ( RB_RTC_TMR_CLR | RB_RTC_TRIG_CLR ); //这里的清理中断标志位是两个都清理,实际上这样写是推荐的,在早期的一些bootloader里面某些rtc 功能打开了,可能导致这里没有清理中断标志位而卡住
RTCTigFlag = 1;
}

其中还有个唤醒配置(在CH573EVT_1.6\EXAM\BLE\HAL\SLEEP.c):

void HAL_SleepInit( void )
{
#if (defined (HAL_SLEEP)) && (HAL_SLEEP == TRUE) // 蓝牙工程里面的 开启休眠的宏,由于wch 的ble只有在休眠时候,才会用到RTC的中断,所以这里有个开启宏
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
R8_SLP_WAKE_CTRL |= RB_SLP_RTC_WAKE; // RTC唤醒
R8_RTC_MODE_CTRL |= RB_RTC_TRIG_EN; // 触发模式
R8_SAFE_ACCESS_SIG = 0; //
PFIC_EnableIRQ( RTC_IRQn );
#endif
}

时间戳映射

很多时候我们需要把时间映射成时间戳(按照秒为单位的计数器),然后再用一些通用的方法,把时间戳转换成时间

wch的rtc也可以变相的实现该时间的方式:

//获取时间戳
//修改时间戳

注意事项

  • 获取当前的RTC的CNT一定要使用wch提供的函数RTC_GetCycle32k(),不要直接读寄存器,寄存器R32_RTC_CNT_32K其实是两个16bit的寄存器,在变化时候存在不同步的变化的情况,如果直接读寄存器,有几率得到一个奇怪的值;

  • 如果用的是内部RC作为RTC的时钟,外部的32.768K 的晶体使能功能一定要关掉(尤其是CH579,默认是开启的);

  • RTC的寄存器是复位保持的,所以一个好的习惯是在初始化时候保证用到的位都写一遍,而不是某些bit跟上电默认一致就不配置了.



推荐阅读
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • ServiceStack与Swagger的无缝集成指南
    本文详细介绍了如何在ServiceStack项目中集成Swagger,以实现API文档的自动生成和在线测试。通过本指南,您将了解从配置到部署的完整流程,并掌握如何优化API接口的开发和维护。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • Google最新推出的嵌入AI技术的便携式相机Clips现已上架,旨在通过人工智能技术自动捕捉用户生活中值得纪念的时刻,帮助人们减少照片数量过多的问题。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 本文详细介绍了 MySQL 的查询处理流程,包括从客户端连接到服务器、查询缓存检查、语句解析、查询优化及执行等步骤。同时,深入探讨了 MySQL 中的乐观锁机制及其在并发控制中的应用。 ... [详细]
author-avatar
上海福千物流_573
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有