大麦和小麦有什么区别| 运动减肥为什么体重不减反增| 书犹药也下一句是什么| 屮艸芔茻什么意思| 脑梗会引起什么症状| 胆固醇高是什么引起的| 鸦片鱼又叫什么鱼| 膝盖肿胀是什么原因| 许嵩的粉丝叫什么| 情人节送什么礼物好| 高血脂吃什么食物最好| 争是什么生肖| 一什么之什么成语| 菊花的功效是什么| 奢侈的近义词是什么| 属狗和什么属相最配| 痛风吃什么药好| 丁毒豆泡酒能治什么病| 起床头疼是什么原因| 罗飞鱼是什么鱼| 什么蜂蜜最好| 一个木一个寿念什么| 梦见被追杀预示什么| 什么叫ins风格| 来姨妈吃什么水果好| 2023什么年| 宫寒应该吃什么怎样调理| bb粥指的是什么意思| 白玉兰奖是什么级别的| 古代人用什么刷牙| 撩是什么意思| 乙肝235阳性是什么意思| 三个虫念什么| 豆皮炒什么好吃| 梦见煮鱼有什么预兆| 双绿生肖是什么生肖| 双侧基底节区腔隙灶是什么意思| 肝病有什么反应| 木薯粉是什么东西| 268数字代表什么意思| 贡中毒有什么症状| 花中之王是什么花| 什么的微风填空| 煮方便面什么时候放鸡蛋| 吸水石是什么石头| 22点是什么时辰| 白细胞正常c反应蛋白高说明什么| 什么品种的芒果最好吃| 窈窕是什么意思| 结膜炎吃什么药| 为什么现在| 北京有什么好吃的| 什么是因果| 孕妇梦见掉牙齿是什么意思| 鼻梁歪的男人说明什么| 什么地唱歌| 耳石症看什么科| apk是什么格式| 老放屁是什么病的征兆| 百合什么时候种植最好| 姚明什么时候退役的| 2000年属什么生肖| 梦见亲人死了是什么意思| 大拇指发麻是什么原因| 氟苯尼考兽药治什么病| 老年人贫血吃什么补血最快最有效| 洗澡用什么香皂好| 韶关有什么特产| 什么鱼刺少好吃| 小孩腿抽筋是什么原因引起的| 占有欲强是什么意思| 一什么湖面| 早上9点到10点是什么时辰| 氟是什么| 桑葚不能和什么一起吃| 脚臭用什么洗效果最好| 三竖一横念什么| 大拇指戴戒指是什么意思| 乌龟吃什么| 脂肪肝有什么症状| 打饱嗝是什么原因| 舌尖发麻是什么问题| 女人左手麻要注意什么| 尼日利亚说什么语言| 灌肠为什么能通输卵管| chloe是什么牌子| 爸爸的爷爷叫什么| 消化道出血吃什么药| 怎么知道自己缺什么五行| 足跟痛用什么药| 梦见大蜘蛛是什么预兆| 大忌什么意思| ppm是什么单位| 主观意识是什么意思| 栗棕色是什么颜色| 麻醉评估是什么意思| 风水宝地是什么意思| 燥湿什么意思| 天地银行是什么意思| 减肥吃什么米| 丑未戌三刑会发生什么| 飞机联程票是什么意思| 龛影是什么意思| 充气娃娃是什么| 杏色配什么颜色好看| 怕冷畏寒是什么原因| 手术室为什么在三楼| 卵泡破裂有什么症状| 五行缺水是什么意思| 蚊子怕什么颜色| 失眠多梦吃什么药| 羊肉馅饺子放什么菜| 高反人群一般是什么人| 七个月宝宝能吃什么水果| 儿童经常流鼻血什么原因造成的| 7.7什么星座| 鱼饼是什么做的| 隐晦是什么意思| 看静脉曲张挂什么科| 男人太瘦吃什么可以长胖| 人为什么会长白头发| 夜未央什么意思| mm什么意思| 脊椎挂什么科| 梦见自己鼻子流血是什么预兆| 你是什么动物| 白带是什么味道| 15号来月经排卵期是什么时候| 十一月什么星座| qeelin是什么牌子| 男人脚肿是什么病的前兆| 头皮问题挂什么科| icloud是什么| 姝字五行属什么| 怀孕第一个月吃什么对胎儿好| 沉甸甸的爱是什么意思| 7月8日是什么星座| 种什么药材最快又值钱| 大拇指戴戒指是什么意思| 瓜皮是什么意思| 胶原蛋白的成分是什么| 痿是什么意思| 尿酸高吃什么菜| 水银中毒会出现什么状况| 生孩子前做什么检查| 塔罗牌逆位是什么意思| 儿童遗尿挂什么科| 固本培元是什么意思| 胃食管反流吃什么中成药最好| 6月25日是世界什么日| 李白为什么叫青莲居士| 梦见黄金是什么意思| 2010属什么| 做春梦是什么原因| 槟榔长什么样子| 美帝是什么意思| 吃猪脑有什么好处和坏处| 有酒瘾是什么感觉| 肛裂用什么药膏| 大便绿色的是什么原因| 女性分泌物增多发黄是什么原因| 头皮发麻什么原因| 乙肝核心抗体阳性是什么意思| 当所有的人离开我的时候是什么歌| 尿细菌计数高是什么原因| 什么的摇动| 肝郁有什么症状| 内射什么感觉| 友人是什么意思| 茵陈是什么植物| 小暑吃什么食物| nbp是什么意思| rj什么意思| 有小肚子是什么原因| 牙齿出血是什么原因| 牙松动了还疼用什么方法处理最好| csf是什么意思| 低压高吃什么中成药| 角膜炎用什么药| 八月六号是什么星座| 散漫是什么意思| 吃脆骨有什么好处| 7个月的宝宝吃什么辅食| 尿酸偏高有什么危害| 亏电是什么意思| nu11是什么意思| 投行是做什么的| 大面念什么| 高血压二级是什么意思| 阴道瘙痒什么原因| 香蕉不能和什么一起吃| 3月5日是什么星座| 马提尼是什么酒| 头疼头晕挂什么科| 11月10日是什么星座| 硬不起来吃什么好| 腱鞘炎看什么科| 坐骨神经痛吃什么药好得快| beyond是什么意思| 马女和什么属相最配| 手指关节发黑是什么原因| 减胎对另一个胎儿有什么影响| 夏天煲什么汤好| 双向情感障碍是什么| 尿失禁是什么症状| aaa是什么意思| 晨勃是什么意思| a4纸可以做什么手工| 50而知天命什么意思| 紫水晶五行属什么| 小腿肿是什么原因| 煮方便面什么时候放鸡蛋| 64年的龙是什么命| 支付宝账户是什么| 什么是消炎药| 不期而遇什么意思| 诗经又称什么| touch是什么意思| 纸尿裤和拉拉裤有什么区别| 大象是什么颜色| 一个大一个多念什么| 尿肌酐是什么| 两个马念什么字| 黄柏胶囊主要治什么病| 荷花五行属什么| 内眼角越揉越痒用什么眼药水| rmb是什么货币| 虾仁炒什么好吃又简单| 多吃木耳有什么好处和坏处| 无花果什么品种最好吃| 什么叫败血症| 地铁站务员是干什么的| 为什么会长水泡| 哈尔滨有什么好吃的| 中性粒细胞偏低是什么意思| 口腔医学技术是干什么的| 腮腺炎不能吃什么东西| 尿检蛋白质弱阳性是什么意思| 我的星座是什么| 尿液细菌高是什么原因| 精液少是什么原因| 什么是激素脸| 发光免疫是检查什么的| 陈宝莲为什么自杀| 足金什么意思| 肝硬化适合吃什么食物| 落井下石什么意思| 翅膀最长的鸟是什么鸟| 80岁属什么生肖| 心跳加快吃什么药| 虾青素有什么功效| 农历六月十一是什么星座| 朱元璋属什么生肖| 减脂早餐吃什么| 左边头痛什么原因| 晋五行属什么| 葡萄糖属于什么糖| 2a是什么意思| 可颂是什么意思| 药引是什么意思| 类似蜈蚣的虫子叫什么| 10月28日是什么日子| 责任是什么生肖| 大葱和小葱有什么区别| 百度
打印
[单片机芯片]

日军曾在中苏蒙边界修军事工程 视劳工生命如草芥

[复制链接]
399|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
   最近有个项目GUI开发,用的迪文屏(DGUS屏),作为一款常用的串口智能显示屏,不内置独立的RTC(实时时钟)模块,迪文屏主打高性价比和易用性,核心功能聚焦于图形界面显示与触控交互。RTC模块需独立晶振、备份电池及低功耗电路,会增加硬件成本和设计复杂度,不符合其市场定位其时间显示功能需依赖外部MCU或主机设备提供时间数据。    CH32V*具备RTC 功能,实时时钟(RTC)是一个独立的定时器模块,其可编程计数器最大可达到 32 位,配合软件即可以实现实时时钟功能,并且可以修改计数器的值来重新配置系统的当前时间和日期。RTC 模块在后备供电区域,系统复位和待机模式唤醒对其不造成影响。

  
     RTC 模块主要是 PB1 总线接口、分频器和计数器、控制和状态寄存器三部分组成,其中分频器和计数器部分在后备区域,可由 VBAT供电。RTCCLK 输入分频器(RTC_DIV)之后,被分频成TR_CLK。值得注意的是,分频器(RTC_DIV)的内部是一个自减计数器,自减到溢出就会输出一个 TR_CLK,然后从重装值寄存器(RTC_PSCR)里取出预设值重装到分频器里,读分频器实际上是读取它的实时值。(read only),写分频系数应该写到重装值寄存器(RTC_PSCR)里。一般 TR_CLK 的周期被设置为 1秒,TR_CLK 会触发秒事件,同时会使主计数器(RTC_CNT)自增 1;当主计数器增加到和闹钟寄存器的值一致时,会触发闹钟事件;当主计数器自增到溢出时,会触发溢出事件。以上三种事件都可以触发中断,并对应相应中断使能位控制。

   供电方案:
  
  VDD和VBAT均可连接内部模拟开关为备份区域以及PC13、PC14和PC15引脚供电,这个模拟开关只能够通过有限的电流(3mA)。当由VDD供电时:PC14和PC15可用于GPIO或LSE引脚、PC13可作为通用I/O口、TAMPER引脚、RTC校准时钟、RTC闹钟或秒输出;PC13、PC14和PC15作为GPIO输出脚时只能工作在2MHz模式下,
最大驱动负载为30pF,并且不能作为电流源(如驱动LED)。而当由VBAT供电时:PC14和PC15只能用于LSE引脚、PC13可作为TAMPER引脚、RTC闹钟或秒输出。

#include "debug.h"

/* Global define */

/* Global Variable */
typedef struct
{
    vu8 hour;
    vu8 min;
    vu8 sec;

    vu16 w_year;
    vu8  w_month;
    vu8  w_date;
    vu8  week;
} _calendar_obj;

_calendar_obj calendar;

u8 const table_week[12] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
const u8 mon_table[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

/* Exported_Functions */
u8 RTC_Init(void);
u8 Is_Leap_Year(u16 year);
u8 RTC_Alarm_Set(u16 syear, u8 smon, u8 sday, u8 hour, u8 min, u8 sec);
u8 RTC_Get(void);
u8 RTC_Get_Week(u16 year, u8 month, u8 day);
u8 RTC_Set(u16 syear, u8 smon, u8 sday, u8 hour, u8 min, u8 sec);

/*********************************************************************
* @fn      RTC_NVIC_Config
*
* [url=home.php?mod=space&uid=247401]@brief[/url]   Initializes RTC Int.
*
* [url=home.php?mod=space&uid=266161]@return[/url]  none
*/
static void RTC_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure = {0};
    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*********************************************************************
* @fn      RTC_Init
*
* @brief   Initializes RTC collection.
*
* @return  1 - Init Fail
*          0 - Init Success
*/
u8 RTC_Init(void)
{
    u8 temp = 0;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    PWR_BackupAccessCmd(ENABLE);
    RTC_ClearITPendingBit(RTC_IT_ALR);
    RTC_ClearITPendingBit(RTC_IT_SEC);

    /* Is it the first configuration */

    BKP_DeInit();
    RCC_LSEConfig(RCC_LSE_ON);
    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && temp < 250)
    {
        temp++;
        Delay_Ms(20);
    }
    if(temp >= 250)
        return 1;
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
    RCC_RTCCLKCmd(ENABLE);
    RTC_WaitForLastTask();
    RTC_WaitForSynchro();
    //                RTC_ITConfig(RTC_IT_ALR, ENABLE);
    RTC_ITConfig(RTC_IT_SEC, ENABLE);
    RTC_WaitForLastTask();
    RTC_EnterConfigMode();
    RTC_SetPrescaler(32767);
    RTC_WaitForLastTask();
    RTC_Set(2019, 10, 8, 13, 58, 55); /* Setup Time */
    RTC_ExitConfigMode();
    BKP_WriteBackupRegister(BKP_DR1, 0XA1A1);

    RTC_NVIC_Config();
    RTC_Get();

    return 0;
}

/*********************************************************************
* @fn      Is_Leap_Year
*
* @brief   Judging whether it is a leap year.
*
* @param   year
*
* @return  1 - Yes
*          0 - No
*/
u8 Is_Leap_Year(u16 year)
{
    if(year % 4 == 0)
    {
        if(year % 100 == 0)
        {
            if(year % 400 == 0)
                return 1;
            else
                return 0;
        }
        else
            return 1;
    }
    else
        return 0;
}

/*********************************************************************
* @fn      RTC_Set
*
* @brief   Set Time.
*
* @param   Struct of _calendar_obj
*
* @return  1 - error
*          0 - success
*/
u8 RTC_Set(u16 syear, u8 smon, u8 sday, u8 hour, u8 min, u8 sec)
{
    u16 t;
    u32 seccount = 0;
    if(syear < 1970 || syear > 2099)
        return 1;
    for(t = 1970; t < syear; t++)
    {
        if(Is_Leap_Year(t))
            seccount += 31622400;
        else
            seccount += 31536000;
    }
    smon -= 1;
    for(t = 0; t < smon; t++)
    {
        seccount += (u32)mon_table[t] * 86400;
        if(Is_Leap_Year(syear) && t == 1)
            seccount += 86400;
    }
    seccount += (u32)(sday - 1) * 86400;
    seccount += (u32)hour * 3600;
    seccount += (u32)min * 60;
    seccount += sec;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    PWR_BackupAccessCmd(ENABLE);
    RTC_SetCounter(seccount);
    RTC_WaitForLastTask();
    return 0;
}

/*********************************************************************
* @fn      RTC_Alarm_Set
*
* @brief   Set Alarm Time.
*
* @param   Struct of _calendar_obj
*
* @return  1 - error
*          0 - success
*/
u8 RTC_Alarm_Set(u16 syear, u8 smon, u8 sday, u8 hour, u8 min, u8 sec)
{
    u16 t;
    u32 seccount = 0;
    if(syear < 1970 || syear > 2099)
        return 1;
    for(t = 1970; t < syear; t++)
    {
        if(Is_Leap_Year(t))
            seccount += 31622400;
        else
            seccount += 31536000;
    }
    smon -= 1;
    for(t = 0; t < smon; t++)
    {
        seccount += (u32)mon_table[t] * 86400;
        if(Is_Leap_Year(syear) && t == 1)
            seccount += 86400;
    }
    seccount += (u32)(sday - 1) * 86400;
    seccount += (u32)hour * 3600;
    seccount += (u32)min * 60;
    seccount += sec;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    PWR_BackupAccessCmd(ENABLE);
    RTC_SetAlarm(seccount);
    RTC_WaitForLastTask();

    return 0;
}

/*********************************************************************
* @fn      RTC_Get
*
* @brief   Get current time.
*
* @return  1 - error
*          0 - success
*/
u8 RTC_Get(void)
{
    static u16 daycnt = 0;
    u32        timecount = 0;
    u32        temp = 0;
    u16        temp1 = 0;
    timecount = RTC_GetCounter();
    temp = timecount / 86400;
    if(daycnt != temp)
    {
        daycnt = temp;
        temp1 = 1970;
        while(temp >= 365)
        {
            if(Is_Leap_Year(temp1))
            {
                if(temp >= 366)
                    temp -= 366;
                else
                {
                    break;
                }
            }
            else
                temp -= 365;
            temp1++;
        }
        calendar.w_year = temp1;
        temp1 = 0;
        while(temp >= 28)
        {
            if(Is_Leap_Year(calendar.w_year) && temp1 == 1)
            {
                if(temp >= 29)
                    temp -= 29;
                else
                    break;
            }
            else
            {
                if(temp >= mon_table[temp1])
                    temp -= mon_table[temp1];
                else
                    break;
            }
            temp1++;
        }
        calendar.w_month = temp1 + 1;
        calendar.w_date = temp + 1;
    }
    temp = timecount % 86400;
    calendar.hour = temp / 3600;
    calendar.min = (temp % 3600) / 60;
    calendar.sec = (temp % 3600) % 60;
    calendar.week = RTC_Get_Week(calendar.w_year, calendar.w_month, calendar.w_date);
    return 0;
}

/*********************************************************************
* @fn      RTC_Get_Week
*
* @brief   Get the current day of the week.
*
* @param   year/month/day
*
* @return  week
*/
u8 RTC_Get_Week(u16 year, u8 month, u8 day)
{
    u16 temp2;
    u8  yearH, yearL;

    yearH = year / 100;
    yearL = year % 100;
    if(yearH > 19)
        yearL += 100;
    temp2 = yearL + yearL / 4;
    temp2 = temp2 % 7;
    temp2 = temp2 + day + table_week[month - 1];
    if(yearL % 4 == 0 && month < 3)
        temp2--;
    return (temp2 % 7);
}

/*********************************************************************
* @fn      main
*
* @brief   Main program.
*
* @return  none
*/
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);       
    printf("SystemClk:%d\r\n", SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    printf("RTC Test\r\n");
    RTC_Init();

    while(1)
    {
        Delay_Ms(1000);
        printf("year/month/day/week/hour/min/sec:\r\n");
        printf("%d-%d-%d  %d  %d:%d:%d\r\n", calendar.w_year, calendar.w_month, calendar.w_date,
               calendar.week, calendar.hour, calendar.min, calendar.sec);
    }
}


沙发
风之呢喃| | 2025-8-1 13:33 | 只看该作者
rtc不内置的串口屏还是很常见的,毕竟不是刚需。
板凳
ningling_21| | 2025-8-1 15:47 | 只看该作者
芯片内置的RTC还是蛮好用的
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

95

主题

181

帖子

3

粉丝
定性是什么意思 滴度是什么意思 wba是什么意思 梦见吃饭是什么预兆 江字五行属什么
阎王叫什么名字 阴蒂瘙痒是什么原因 白左什么意思 二阴指的是什么 老是掉头发什么原因
护理专业主要学什么 献血证有什么用 黑便是什么原因 50年属什么 喉咙干是什么原因
佝偻病是什么意思 s是什么牌子 肚子怕冷是什么原因该怎么办 冬虫夏草是什么 plg是什么意思
梦见抬棺材是什么意思hcv9jop7ns1r.cn 燊是什么意思hcv8jop5ns0r.cn 怀孕能吃什么hcv8jop8ns0r.cn 耳麦是什么hcv8jop2ns7r.cn 敌人是什么意思96micro.com
支气管炎吃什么药hcv9jop2ns2r.cn 梦见前女友是什么预兆hcv8jop0ns4r.cn 备孕检查什么项目hcv9jop0ns3r.cn 宝宝胀气是什么原因引起的imcecn.com 畸形是什么意思hcv7jop6ns3r.cn
孕妇吃西红柿对胎儿有什么好处hcv8jop5ns5r.cn electrolux是什么牌子baiqunet.com 血糖高的病人吃什么hcv8jop4ns8r.cn 乌龙茶适合什么季节喝hcv9jop1ns0r.cn 什么牌子的麦克风好用hcv7jop7ns3r.cn
血铅是什么hcv9jop1ns6r.cn 结肠炎吃什么食物好hcv7jop6ns7r.cn 海豚用什么呼吸bysq.com 什么水果不能吃hcv9jop7ns4r.cn 矿泉水敷脸有什么作用hcv8jop6ns0r.cn
百度