打印
[CW32L083系列]

CW32L083实现串口AT指令设置RTC时间

[复制链接]
21297|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lulugl|  楼主 | 2023-7-14 07:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创# #有奖活动#[url=home.php?mod=space&uid=760190]@21小跑堂 [/url]
基于CW32L083的AT指令框架 - - 21ic电子技术开**坛
RTC时间需要在设备初始化时进行设置。为了解决RTC能实时设置或者较调,我这里设计了用AT指令来设置RTC的实时时间。
开机复位时需要初始化RTC,初始化如下:

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

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

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

constAT_cmd_funcat_cmd_func[]= {

    {AT_CMD_TEST,       "AT",           at_cmd_test},

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

    {AT_END,        NULL,           NULL}

};

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

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


实现效果:我们在串口发送设置命令后如期更新为最新设置时间

【总结】
CW32L083提供了完善的RTC驱动库,只要按其指定的格式传入数据,就可以简单的实现RTC的实时时间设置,当然按类似的方法也可以实现闹钟等功能。

使用特权

评论回复
沙发
tpgf| | 2023-8-12 15:15 | 只看该作者
at指令框架是说这个指令的格式还是说具体到协议的内容呢

使用特权

评论回复
板凳
wowu| | 2023-8-12 15:30 | 只看该作者
为什么很多设备的通讯协议都喜欢使用at指令呢

使用特权

评论回复
地板
木木guainv| | 2023-8-12 15:49 | 只看该作者
每次开机复位都需要重新初始化一下rtc时间吗

使用特权

评论回复
5
lulugl|  楼主 | 2023-8-12 18:03 | 只看该作者
木木guainv 发表于 2023-8-12 15:49
每次开机复位都需要重新初始化一下rtc时间吗

有复位判断。当然也可以自己设置。

使用特权

评论回复
6
磨砂| | 2023-8-12 19:19 | 只看该作者
使用这种发送数据的方式需要对数据进行校验吗

使用特权

评论回复
7
xiaoqizi| | 2023-8-12 20:01 | 只看该作者
请问楼主日期如何转化为bcd格式的数据呢

使用特权

评论回复
评论
pssyx 2023-8-14 10:05 回复TA
不必转换,RTC输出的正是BCD码格式。 
8
wakayi| | 2023-8-12 21:00 | 只看该作者
RTC驱动库里边使用的就是at指令吗

使用特权

评论回复
评论
pssyx 2023-8-14 10:07 回复TA
RTC驱动库没有AT指令集,需用户自己定义。 
9
pssyx| | 2023-8-14 10:03 | 只看该作者
木木guainv 发表于 2023-8-12 15:49
每次开机复位都需要重新初始化一下rtc时间吗

为保证RTC的时间有效,只在初次上电时初始化RTC,后续的复位操作则不必初始化RTC,除非检测到RTC已失效。

使用特权

评论回复
10
小夏天的大西瓜| | 2023-8-26 22:19 | 只看该作者
AT指令一般是蓝牙wifi模块会使用

使用特权

评论回复
11
星辰大海不退缩| | 2023-8-27 19:40 | 只看该作者
AT指令是系统自带的指令集?

使用特权

评论回复
12
OKAKAKO| | 2023-8-27 22:35 | 只看该作者
wowu 发表于 2023-8-12 15:30
为什么很多设备的通讯协议都喜欢使用at指令呢

是方便简单还有移植性强

使用特权

评论回复
评论
lulugl 2023-8-28 07:27 回复TA
都有吧,不过现在可能应用会越来越少了。 
13
caizhiwei| | 2023-8-28 13:17 | 只看该作者
constAT_cmd_funcat_cmd_func[] 这个东西的定义能贴出来吗?

使用特权

评论回复
14
lulugl|  楼主 | 2023-8-28 15:49 | 只看该作者
caizhiwei 发表于 2023-8-28 13:17
constAT_cmd_funcat_cmd_func[] 这个东西的定义能贴出来吗?

我回去把工程源码附上吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

683

帖子

7

粉丝