打印
[MM32硬件]

MM32F3273实现RTC的程序

[复制链接]
2000|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
地瓜patch|  楼主 | 2025-1-21 20:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 地瓜patch 于 2025-1-21 20:49 编辑

MM32F3273使用高性能的 Arm® Cortex-M3 为内核的 32 位微控制器,最高工作频率可达 120MHz,内置高速存储器,丰富的 I/O 端口和多种外设。
- 512KB Flash,128KB SRAM
- 3 个 12 位的 ADC、2 个 12 位的DAC、2 个比较器
- 2 个 16 位通用定时器、2 个 32 位通用定时器、2 个 16 位基本定时器和 2 个 16 位高级定时器
- 2 个 I2C 接口、3 个 SPI 接口、3 个 I2S 接口和 8 个 UART 接口
- 1 个 USB OTG 全速接口
- 1 个 CAN 接口
- 1 个 SDIO 接口
- 工作电压为 2.0V - 5.5V
- 工作温度范围(环境温度)-40℃ - 85℃ 工业和-40℃ - 105℃ 扩展工业(后缀为V)
- 多种省电工作模式支持低功耗应用的需求

void RTC_Calendar_Sample(void)
{
    printf("\r\nTest %s", __FUNCTION__);

    RTC_Configure();

    while (1)
    {
        PLATFORM_LED_Toggle(LED1);
        PLATFORM_DelayMS(100);
    }
}
void RTC_Configure(void)
{
    NVIC_InitTypeDef NVIC_InitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1ENR_BKP, ENABLE);

    PWR_BackupAccessCmd(ENABLE);

    BKP_DeInit();

    if (BKP_ReadBackupRegister(BKP_DR1) != 0x5B5B)
    {
        RCC_LSICmd(ENABLE);

        while (RESET == RCC_GetFlagStatus(RCC_FLAG_LSIRDY))
        {
            __NOP();
        }

        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

        RCC_RTCCLKCmd(ENABLE);

        RTC_WaitForSynchro();
        RTC_WaitForLastTask();

        RTC_ITConfig(RTC_IT_SEC, ENABLE);
        RTC_WaitForLastTask();

        RTC_SetPrescaler(40000);
        RTC_WaitForLastTask();

        printf("\r\n%s", __FUNCTION__);

        BKP_WriteBackupRegister(BKP_DR1, 0x5B5B);
    }
    else
    {
        printf("\r\nNeed't to configure RTC.");

        RTC_WaitForSynchro();

        RTC_ITConfig(RTC_IT_SEC, ENABLE);
        RTC_WaitForLastTask();
    }

    NVIC_InitStruct.NVIC_IRQChannel = RTC_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    RTC_LoadDefault();
}
void RTC_SetDateTime(uint16_t Year, uint8_t Month, uint8_t Day, uint8_t Hour, uint8_t Minute, uint8_t Second)
{
    uint32_t TotalSecond = 0;
    uint16_t y = 0;
    uint8_t  m = 0;

    if ((Year >= 1970) && (Year <= 2099))
    {
        for (y = 1970; y < Year; y++)
        {
            if (RTC_LeapYear(y) == 1)
            {
                TotalSecond += 31622400; /* Total Seconds Of Leap   Year */
            }
            else
            {
                TotalSecond += 31536000; /* Total Seconds Of Normal Year */
            }
        }

        for (m = 0; m < (Month - 1); m++)
        {
            TotalSecond += RTC_DayOfMonth[m] * 86400; /* Total Seconds Of Month */

            if ((RTC_LeapYear(Year) == 1) && (m == 1))
            {
                TotalSecond += 86400;
            }
        }

        TotalSecond += (uint32_t)(Day - 1) * 86400; /* Total Seconds Of Day    */
        TotalSecond += (uint32_t)Hour * 3600;       /* Total Seconds Of Hour   */
        TotalSecond += (uint32_t)Minute * 60;       /* Total Seconds Of Minute */
        TotalSecond += Second;

        RCC_APB1PeriphClockCmd(RCC_APB1ENR_BKP, ENABLE);

        PWR_BackupAccessCmd(ENABLE);

        RTC_SetCounter(TotalSecond);
        RTC_WaitForLastTask();

        RTC_UpdateCalendar();
    }
    else
    {
        printf("\r\nError Date & Time!!!\r\n");
    }
}

void RTC_UpdateCalendar(void)
{
    static uint32_t PreTotalDay = 0;
    uint32_t TotalSecond = 0;
    uint32_t TotalDay    = 0;
    uint16_t Year  = 1970;
    uint8_t  Month = 0;

    TotalSecond = RTC_GetCounter();
    TotalDay    = TotalSecond / 86400;

    if (PreTotalDay != TotalDay)
    {
        PreTotalDay = TotalDay;

        while (TotalDay >= 365)
        {
            if (RTC_LeapYear(Year) == 1)
            {
                if (TotalDay >= 366)
                {
                    TotalDay -= 366;
                }
                else
                {
                    break;
                }
            }
            else
            {
                TotalDay -= 365;
            }

            Year++;
        }

        RTC_Calendar.year = Year;

        while (TotalDay >= 28)
        {
            if ((Month == 1) && (RTC_LeapYear(RTC_Calendar.year) == 1))
            {
                if (TotalDay >= 29)
                {
                    TotalDay -= 29;
                }
                else
                {
                    break;
                }
            }
            else
            {
                if (TotalDay >= RTC_DayOfMonth[Month])
                {
                    TotalDay -= RTC_DayOfMonth[Month];
                }
                else
                {
                    break;
                }
            }

            Month++;
        }

        RTC_Calendar.month = Month + 1;
        RTC_Calendar.day   = TotalDay + 1;

        RTC_Calendar.week  = RTC_GetWeek(RTC_Calendar.year, RTC_Calendar.month, RTC_Calendar.day);
    }

    RTC_Calendar.hour   = (TotalSecond % 86400) / 3600;
    RTC_Calendar.minute = ((TotalSecond % 86400) % 3600) / 60;
    RTC_Calendar.second = ((TotalSecond % 86400) % 3600) % 60;
}



使用特权

评论回复
沙发
小小蚂蚁举千斤| | 2025-1-22 22:40 | 只看该作者
功能还是比较齐全的

使用特权

评论回复
板凳
OKAKAKO| | 2025-1-23 08:10 | 只看该作者
非常不错的案例程序

使用特权

评论回复
地板
等你下课| | 2025-3-31 13:23 | 只看该作者
该函数负责初始化 RTC,并配置时钟源以及定时器的预分频。

使用特权

评论回复
5
jf101| | 2025-3-31 23:03 | 只看该作者
MM32F3273实现RTC的程序

使用特权

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

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1429

主题

13699

帖子

27

粉丝