你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

l053的RTC时钟

[复制链接]
stary666 发布时间:2015-5-19 16:40
今天终于实现了L053的RTC时钟
下面是代码
#define __RTC_WRITEPROTECTION_DISABLE()             \
    do \
    {                    \
        RTC->WPR = 0xCA;   \
        RTC->WPR = 0x53;   \
    } while (0)

/**
  * @brief  Enable the write protection for RTC registers.
  * @param  __HANDLE__: specifies the RTC handle.
  * @retval None
  */
#define __RTC_WRITEPROTECTION_ENABLE()              \
    do \
    {                      \
        RTC->WPR = 0xFF;     \
    } while (0)
#define ASYN_PREDIVE_SHIFT 16
#define YEAR_SHIFT         16
#define MONTH_SHIFT        8
#define WEEKDAY_SHIFT      13
#define HOUR_SHIFT         16
#define MINUTE_SHIFT       8
#define TIMEFORMAT_SHIFT   13
#define PM_SHIFT           22
void
RTC_Init(void)
{
    RCC->CSR |= RCC_CSR_LSION;

    while ((RCC->CSR & RCC_CSR_LSIRDY) != RCC_CSR_LSIRDY)
    {
    }

    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
    PWR->CR      |= PWR_CR_DBP;
    RCC->CSR      = (RCC->CSR & ~RCC_CSR_RTCSEL) | RCC_CSR_RTCEN | RCC_CSR_RTCSEL_1;
    RCC->APB1ENR &= ~RCC_APB1ENR_PWREN;

    /* Configure RTC */
    __RTC_WRITEPROTECTION_DISABLE();
    /* Clear RTC_CR FMT, OSEL and POL Bits */
    RTC->CR   &= ((uint32_t) ~(RTC_CR_FMT | RTC_CR_OSEL | RTC_CR_POL));

    /* Configure the RTC PRER */
    RTC->PRER  = (uint32_t)(RTC_SYNCH_PREDIV);
    RTC->PRER |= (uint32_t)(RTC_ASYNCH_PREDIV << ASYN_PREDIVE_SHIFT);
    /* Exit Initialization mode */
    RTC->ISR  &= (uint32_t) ~RTC_ISR_INIT;
    RTC->OR   &= (uint32_t) ~(RTC_OR_ALARMOUTTYPE | RTC_OR_RTC_OUT_RMP);
    __RTC_WRITEPROTECTION_ENABLE();
}
收藏 评论6 发布时间:2015-5-19 16:40

举报

6个回答
stary666 回答时间:2015-5-19 16:40:25
设置日期
void
RTC_SetDate(RTC_DateTypeDef * st_Date)
{
    uint32_t u32_TateTmp = 0;

    u32_TateTmp = ((((uint32_t)st_Date->Year) << YEAR_SHIFT) | \
                   (((uint32_t)st_Date->Month) << MONTH_SHIFT) | \
                   ((uint32_t)st_Date->Date) | \
                   (((uint32_t)st_Date->WeekDay) << WEEKDAY_SHIFT));

    __RTC_WRITEPROTECTION_DISABLE();
    RTC->ISR |= RTC_ISR_INIT;

    while ((RTC->ISR & RTC_ISR_INITF) != RTC_ISR_INITF)
    {
    }

    RTC->DR   = (uint32_t)(u32_TateTmp & RTC_DR_RESERVED_MASK);
    RTC->ISR &= (uint32_t) ~RTC_ISR_INIT;

    __RTC_WRITEPROTECTION_ENABLE();
}
stary666 回答时间:2015-5-19 16:40:45
设置时间
void
RTC_SetTime(RTC_TimeTypeDef * st_Time)
{
    uint32_t u32_TimeTmp = 0;

    st_Time->TimeFormat = RTC_HOURFORMAT_24;
    u32_TimeTmp         = (((uint32_t)(st_Time->Hours) << HOUR_SHIFT) | \
                           ((uint32_t)(st_Time->Minutes) << MINUTE_SHIFT) | \
                           ((uint32_t)st_Time->Seconds) | \
                           ((uint32_t)(st_Time->TimeFormat) << TIMEFORMAT_SHIFT));

    __RTC_WRITEPROTECTION_DISABLE();
    RTC->ISR = RTC_INIT_MASK;

    while ((RTC->ISR & RTC_ISR_INITF) != RTC_ISR_INITF)
    {
    }

    /* Set the RTC_TR register */
    RTC->TR   = (uint32_t)(u32_TimeTmp & RTC_TR_RESERVED_MASK);

    /* Clear the bits to be configured */
    RTC->CR  &= (uint32_t) ~RTC_CR_BCK;

    /* Configure the RTC_CR register */
    RTC->CR  |= (uint32_t)(st_Time->DayLightSaving | st_Time->StoreOperation);

    /* Exit Initialization mode */
    RTC->ISR &= (uint32_t) ~RTC_ISR_INIT;

    __RTC_WRITEPROTECTION_ENABLE();
}
stary666 回答时间:2015-5-19 16:41:09
获取时间
void
RTC_GetTime(RTC_TimeTypeDef * st_Time)
{
    uint32_t u32_TimeTmp = 0;

    /* Get subseconds values from the correspondent registers*/
    st_Time->SubSeconds = (uint32_t)(RTC->SSR);

    /* Get the TR register */
    u32_TimeTmp         = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);

    /* Fill the structure fields with the read parameters */
    st_Time->Hours      = (uint8_t)((u32_TimeTmp & (RTC_TR_HT | RTC_TR_HU)) >> HOUR_SHIFT);
    st_Time->Minutes    = (uint8_t)((u32_TimeTmp & (RTC_TR_MNT | RTC_TR_MNU)) >> MINUTE_SHIFT);
    st_Time->Seconds    = (uint8_t)(u32_TimeTmp & (RTC_TR_ST | RTC_TR_SU));
    st_Time->TimeFormat = (uint8_t)((u32_TimeTmp & (RTC_TR_PM)) >> PM_SHIFT);
}
沐紫 回答时间:2015-5-19 16:43:28
恭喜楼主大大
mark0668 回答时间:2015-5-19 17:33:45
恭喜楼主,顶顶加深对RTC知识
为什么是EEFOCUS小白 回答时间:2015-5-20 08:55:14
F0系列的RTC是不是比F1的好用呢

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版