历史上的今天
今天是:2024年08月24日(星期六)
2019年08月24日 | stm32在rt-thread上的RTC(实时时钟)
2019-08-24 来源:eefocus
rt-thread中已经部分实现了rtc的内容 ---> rtc.c ,调用rt_hw_rtc_init()函数即可使用msh设置date和time等
rtc时钟来源有三个:
HSE, LSE, LSI, 实现如下: 在原RTC_Configuration(void)进行替换即可
/* Enable LSE */
#ifdef USE_LSE
RCC_LSEConfig(RCC_LSE_ON);
/* Wait till LSE is ready */
while ( (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) && (--count) );
#else
#ifdef USE_HSE
#else
RCC_LSICmd(ENABLE);
/* Wait till LSE is ready */
while ( (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) && (--count) );
#endif
#endif
if ( count == 0 )
{
return -1;
}
/* Select LSE as RTC Clock Source */
#ifdef USE_LSE
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
#else
#ifdef USE_HSE
RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
#else
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
#endif
#endif
/* Enable RTC Clock */
RCC_RTCCLKCmd(ENABLE);
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro();
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Set RTC prescaler: set RTC period to 1sec */
#ifdef USE_LSE
RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
#else
#ifdef USE_HSE
RTC_SetPrescaler(93749); /* 72 MHz / 128 */
#else
RTC_SetPrescaler(40000); /* 40 KHz */
#endif
#endif
注意:/* Note:If the HSE divided by 128 is used as the RTC clock, this bit must remain set to 1. */
秒中断和ALARM中断实现:
rt_hw_rtc_navi_init();
RTC_WaitForLastTask();
RTC_SetAlarm(RTC_GetCounter()+25); //当前RTC值的基础上加时间
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能秒中断
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_ALR,ENABLE); //使能arlarm中断
RTC_WaitForLastTask();
void rt_hw_rtc_navi_init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_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);
}
void RTC_IRQHandler(void)
{
/* enter interrupt */
rt_interrupt_enter();
if(RTC_GetITStatus(RTC_IT_ALR) == SET)
{
rt_kprintf("RTCAlarm_IRQHandler1~~~rn");
RTC_ClearITPendingBit(RTC_IT_ALR);
}
if(RTC_GetITStatus(RTC_IT_SEC) == SET)
{
RTC_ClearITPendingBit(RTC_IT_SEC);
rt_kprintf("RTCAlarm_IRQHandler2~~~rn");
}
/* leave interrupt */
rt_interrupt_leave();
}
ps:RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ 这个不是alarm的中断函数哟
史海拾趣
|
Skype,这个最热门的网络电话软件,明天即将发布4.0 Beta版本,到时候大家可以到这里下载。你很可能会为这个版本感动吃惊,因为它的界面设计可以说颠覆了skype的传统,不再是那个瘦削的拨号电话,而让位于全屏幕的、视频占主体地位的界面。 我们先 ...… 查看全部问答> |
|
S7-200PLC是西门子公司的小型PLC系统,具有简单灵活的特点,但是,模拟量通道少的可怜,增加一个扩展模块也只有4路模拟量输入,尤其热电偶温度、热电阻温度采集模块,不但通道少,而且价格高,信号类型必须统一选择,不能混合输入,当需要采集大量 ...… 查看全部问答> |
|
我在DXP 里打印元器件图,顺序是File-Fabrication outputs-Final ,这里所有的连线图和放元器件的图,我是需要打印元器件图,打出来的图都是虚线,看的不清楚,有什么办法能打印出清楚呢?谢谢大家帮忙了!… 查看全部问答> |
|
eboot能烧进去,可是启动的时候在FMD_Init()一步就出错了! 这个eboot我们一直在用的!肯定是没问题。问题是这批板子是新做的,跟以前的那些原理图一点没变,难道是打板的时候出错了?或者焊接的时候有问题?如果有问题也不会这一批30块全是同样 ...… 查看全部问答> |
|
我以DSP2812为核心做了一块实验板,外扩了一块64K的RAM,但是在程序下载的时候,若把.cinit指向外部RAM就无法下载,若不使用外部RAM就可以下载,不知何故,请朋友们帮忙看看!谢谢!… 查看全部问答> |




