#申请原创# #有奖活动#[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的实时时间设置,当然按类似的方法也可以实现闹钟等功能。
|