热门标签 | 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跟上电默认一致就不配置了.



推荐阅读
  • 本文探讨了在特定版本下遇到的RestAPI未被调用的问题,并提供了详细的解决方案。 ... [详细]
  • AB PLC与西门子S7-1200以太网通信详解
    本文探讨了在工业自动化领域中,如何实现AB PLC与西门子S7-1200之间的直接以太网通信。文中详细介绍了通信的基本原理、配置步骤及编程技巧,为工程师提供了实用的操作指南。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 本文详细介绍了如何在本地环境中安装配置Frida及其服务器组件,以及如何通过Frida进行基本的应用程序动态分析,包括获取应用版本和加载的类信息。 ... [详细]
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 深入解析 RuntimeClass 及多容器运行时应用
    本文旨在探讨RuntimeClass的起源、功能及其在多容器运行时环境中的实际应用。通过详细的案例分析,帮助读者理解如何在Kubernetes集群中高效管理不同类型的容器运行时。 ... [详细]
  • 本文详细介绍了如何在ReactJS项目中集成Onsen-UI的ActionSheetButton组件,并通过具体示例展示了其使用方法及效果。 ... [详细]
  • APP及其接口测试全面解析
    本文深入探讨了移动应用(APP)及其接口测试的关键点,包括安装与卸载、功能一致性、系统兼容性、权限管理等多个方面的测试策略,以及针对接口的功能、边界值、参数组合等专业测试方法。同时,介绍了几款常用的测试工具,帮助开发者提高测试效率和质量。 ... [详细]
  • 本文详细介绍了Java API中文文档的位置、用途及其查看方法,帮助开发者更高效地利用这一资源。 ... [详细]
  • 本文探讨了如何在Sitecore 9环境中通过Postman使用API密钥发送请求,包括解决常见错误的方法。 ... [详细]
  • 探讨在iOS客户端向服务器上传数据流的过程中,若服务器因权限校验失败而未接收流直接响应时,如何有效避免客户端出现超时的问题。 ... [详细]
  • 本文旨在为开发者提供详细的指导,如何在Android应用中顺利集成支付宝支付功能及豆瓣API,以满足业务需求。通过本文的步骤,读者可以了解从准备环境到成功调用API的整个流程,避免常见的错误和陷阱。 ... [详细]
  • Kubernetes Services详解
    本文深入探讨了Kubernetes中的服务(Services)概念,解释了如何通过Services实现Pods之间的稳定通信,以及如何管理没有选择器的服务。 ... [详细]
  • 本文探讨了如何在Angular项目中处理URL重写时遇到的参数缺失问题,并提供了一种有效的解决方案。 ... [详细]
  • Unity技巧:实现背景音乐的开关功能
    本文详细介绍了如何在Unity中通过脚本控制背景音乐的开启与关闭,适合初学者参考。 ... [详细]
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社区 版权所有