[CW32L083系列] CW32L083实现串口AT指令设置RTC时间

[复制链接]
 楼主| lulugl 发表于 2023-7-14 07:51 | 显示全部楼层 |阅读模式
#申请原创# #有奖活动#[url=home.php?mod=space&uid=760190]@21小跑堂 [/url]
基于CW32L083的AT指令框架 - - 21ic电子技术开**坛
RTC时间需要在设备初始化时进行设置。为了解决RTC能实时设置或者较调,我这里设计了用AT指令来设置RTC的实时时间。
开机复位时需要初始化RTC,初始化如下:

  1. void my_rtc_init(void)
  2. {
  3.     RTC_InitTypeDef RTC_InitStruct = {0};
  4.    
  5.     RCC_LSI_Enable();                                                           // 选择LSI为RTC时钟
  6.     RCC_APBPeriphClk_Enable1(RCC_APB1_PERIPH_RTC, ENABLE);
  7.         RTC_InitStruct.DateStruct.Day = 0x12;             //设置日期,DAY、MONTH、YEAR必须为BCD方式,星期为0~6,代表星期日,星期一至星期六
  8.         RTC_InitStruct.DateStruct.Month = RTC_Month_July;
  9.         RTC_InitStruct.DateStruct.Week = RTC_Weekday_Wednesday;
  10.         RTC_InitStruct.DateStruct.Year = 0x23;

  11.     RTC_InitStruct.TimeStruct.Hour = 0x11;         //设置时间,HOUR、MINIUTE、SECOND必须为BCD方式,用户须保证HOUR、AMPM、H24之间的关联正确性
  12.     RTC_InitStruct.TimeStruct.Minute = 0x13;
  13.     RTC_InitStruct.TimeStruct.Second = 0x01;
  14.     RTC_InitStruct.TimeStruct.AMPM = 0;
  15.     RTC_InitStruct.TimeStruct.H24 = 1;
  16.     RTC_InitStruct.RTC_ClockSource = RTC_RTCCLK_FROM_LSI;
  17.     RTC_Init(&RTC_InitStruct);    //  用户需选定需要使用的时钟源
  18. }

在AT指令集上添加设置RTC的指令解析:
  1. /* AT指令表 */

  2. constAT_cmd_funcat_cmd_func[]= {

  3.     {AT_CMD_TEST,       "AT",           at_cmd_test},

  4.     {AT_CMD_SETRTC,     "AT+SETRTC=",   at_cmd_setrtc},

  5.     {AT_END,        NULL,           NULL}

  6. };

添加指令解析函数,这里定义一发送指令为:AT+SETRTC=2307145072001(即年月日星期时分秒),日期及时钟需要设置为BCD格式的数据
  1. /* 设置时钟 */
  2. unsigned char at_cmd_setrtc(unsigned char *p, unsigned char len){

  3.         RTC_DateTypeDef RTC_DateStruct = {0};
  4.         RTC_TimeTypeDef RTC_TimeStruct = {0};
  5.         RTC_DateStruct.Year = ((p[0]-'0')<<4) | (p[1]-'0');
  6.         RTC_DateStruct.Month = ((p[2]-'0')<<4) | (p[3]-'0');
  7.         RTC_DateStruct.Day = ((p[4]-'0')<<4) | (p[5]-'0');
  8.         RTC_DateStruct.Week = p[6]-'0';
  9.         RTC_TimeStruct.Hour = ((p[7]-'0')<<4) | (p[8]-'0');
  10.         RTC_TimeStruct.Minute = ((p[9]-'0')<<4) | (p[10]-'0');
  11.         RTC_TimeStruct.Second = ((p[11]-'0')<<4) | (p[12]-'0');
  12.         RTC_TimeStruct.AMPM = 0;
  13.         RTC_TimeStruct.H24 = 1;
  14.         RTC_SetTime(&RTC_TimeStruct);
  15.         RTC_SetDate(&RTC_DateStruct);
  16.     return 0;
  17. }


实现效果:我们在串口发送设置命令后如期更新为最新设置时间
bcbe4bab7aa348f1fb453b6d46adc01d
【总结】
CW32L083提供了完善的RTC驱动库,只要按其指定的格式传入数据,就可以简单的实现RTC的实时时间设置,当然按类似的方法也可以实现闹钟等功能。

tpgf 发表于 2023-8-12 15:15 | 显示全部楼层
at指令框架是说这个指令的格式还是说具体到协议的内容呢
wowu 发表于 2023-8-12 15:30 | 显示全部楼层
为什么很多设备的通讯协议都喜欢使用at指令呢
木木guainv 发表于 2023-8-12 15:49 | 显示全部楼层
每次开机复位都需要重新初始化一下rtc时间吗
 楼主| lulugl 发表于 2023-8-12 18:03 | 显示全部楼层
木木guainv 发表于 2023-8-12 15:49
每次开机复位都需要重新初始化一下rtc时间吗

有复位判断。当然也可以自己设置。
磨砂 发表于 2023-8-12 19:19 | 显示全部楼层
使用这种发送数据的方式需要对数据进行校验吗
xiaoqizi 发表于 2023-8-12 20:01 | 显示全部楼层
请问楼主日期如何转化为bcd格式的数据呢

评论

不必转换,RTC输出的正是BCD码格式。  发表于 2023-8-14 10:05
wakayi 发表于 2023-8-12 21:00 | 显示全部楼层
RTC驱动库里边使用的就是at指令吗

评论

RTC驱动库没有AT指令集,需用户自己定义。  发表于 2023-8-14 10:07
pssyx 发表于 2023-8-14 10:03 | 显示全部楼层
木木guainv 发表于 2023-8-12 15:49
每次开机复位都需要重新初始化一下rtc时间吗

为保证RTC的时间有效,只在初次上电时初始化RTC,后续的复位操作则不必初始化RTC,除非检测到RTC已失效。
小夏天的大西瓜 发表于 2023-8-26 22:19 | 显示全部楼层
AT指令一般是蓝牙wifi模块会使用
星辰大海不退缩 发表于 2023-8-27 19:40 | 显示全部楼层
AT指令是系统自带的指令集?
OKAKAKO 发表于 2023-8-27 22:35 | 显示全部楼层
wowu 发表于 2023-8-12 15:30
为什么很多设备的通讯协议都喜欢使用at指令呢

是方便简单还有移植性强

评论

都有吧,不过现在可能应用会越来越少了。  发表于 2023-8-28 07:27
caizhiwei 发表于 2023-8-28 13:17 | 显示全部楼层
constAT_cmd_funcat_cmd_func[] 这个东西的定义能贴出来吗?
 楼主| lulugl 发表于 2023-8-28 15:49 | 显示全部楼层
caizhiwei 发表于 2023-8-28 13:17
constAT_cmd_funcat_cmd_func[] 这个东西的定义能贴出来吗?

我回去把工程源码附上吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

830

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部

180

主题

830

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部