STM32/STM8技术william hill官网
直播中

654524

12年用户 475经验值
擅长:嵌入式技术 模拟技术 控制/MCU
私信 关注
[经验]

【STM32F411 Nucleo试用体验】(四)RTC实时时钟以及RTC硬件方式1Hz脉冲输出(RTX系统)

STM32F411 Nucleo实验板上有低速晶振,虽然没有电池。但是还是可以测试一下。这里顺便打开RTC外设的 1Hz 脉冲输出。后面项目里要用到,用硬件1Hz的脉冲给不同的定时器捕获通道,这几个定时器就有了同样的时间基准,触发捕获的时候同时处理各自其他通道上的事情。
3.jpg
板载的外部晶振32.768KHz
4.jpg
RTC外设1Hz脉冲输出
5.jpg
RTC输出用到的是 PC13引脚
6.jpg
实验板上PC13引脚连接的是用户按键,不是很方便后续捕获,但是还是可以看下波形
初始化一下PC13:配置为开漏输出,频率不需要很高
  1. GPIO_InitTypeDef        GPIO_InitStructure;
  2.         
  3.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
  4.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  5.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  6.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  7.         GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  8.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  9.         GPIO_Init(GPIOC,&GPIO_InitStructure);
配置RTC : 日期、时间都被初始化为0了。闹钟暂时不用,被我注释掉了。
  1. void RTC_Configuration(void)
  2. {
  3.         RTC_TimeTypeDef RTC_TimeStructure;
  4.   RTC_DateTypeDef RTC_DateStructure;
  5.         RTC_InitTypeDef  RTC_InitStructure;
  6. //        RTC_AlarmTypeDef RTC_AlarmStructure;

  7.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
  8.         PWR_BackupAccessCmd(ENABLE);
  9.         RCC_BackupResetCmd(ENABLE);
  10.         RCC_BackupResetCmd(DISABLE);
  11.         
  12.         RCC_LSEConfig(RCC_LSE_ON);
  13.         while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
  14.         RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  15.         RCC_RTCCLKCmd(ENABLE);
  16.         RTC_WaitForSynchro();

  17.         RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
  18.         RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
  19.         RTC_InitStructure.RTC_SynchPrediv = 0xFF;
  20.         RTC_Init(&RTC_InitStructure);

  21.         RTC_DateStructure.RTC_Date = GetDate.RTC_Date;                                                                        //
  22.         RTC_DateStructure.RTC_Month = GetDate.RTC_Month;
  23.         RTC_DateStructure.RTC_Year = GetDate.RTC_Year;
  24.         RTC_DateStructure.RTC_WeekDay = GetDate.RTC_WeekDay;
  25.         RTC_SetDate(RTC_Format_BIN,&RTC_DateStructure);

  26.         RTC_TimeStructure.RTC_H12 = RTC_H12_AM;                                                //
  27.         RTC_TimeStructure.RTC_Hours = GetTime.RTC_Hours;
  28.         RTC_TimeStructure.RTC_Minutes = GetTime.RTC_Minutes;
  29.         RTC_TimeStructure.RTC_Seconds = GetTime.RTC_Seconds;
  30.         RTC_SetTime(RTC_Format_BIN,&RTC_TimeStructure);

  31. //        RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_WeekDay;//;
  32. //        RTC_AlarmStructure.RTC_AlarmDateWeekDay = RTC_Weekday_Tuesday;//RTC_Weekday_Monday;
  33. //        RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_All;
  34. //        RTC_AlarmStructure.RTC_AlarmTime = RTC_TimeStructure;                                        //
  35. //        RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds += 2;                                                //
  36. //        RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmStructure);
  37. //        RTC_AlarmSubSecondConfig(RTC_Alarm_A,0xFF,RTC_AlarmSubSecondMask_All);
  38. //        RTC_AlarmCmd(RTC_Alarm_A,ENABLE);

  39. //        RTC_ITConfig(RTC_IT_ALRA,ENABLE);
  40. //        RTC_ITConfig(RTC_IT_WUT,ENABLE);

  41.         RTC_WakeUpCmd(DISABLE);
  42.         RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
  43.         RTC_SetWakeUpCounter(0);
  44.         RTC_WakeUpCmd(ENABLE);
  45.         
  46.         RTC_OUT_Config();
  47. }
配置一下 RTC 1Hz 脉冲输出:
  1. void RTC_OUT_Config(void)
  2. {
  3.         RTC_OutputTypeConfig(RTC_OutputType_OpenDrain);
  4. //        RTC_OutputConfig(RTC_Output_AlarmA,RTC_OutputPolarity_Low);
  5.         RTC_CalibOutputConfig(RTC_CalibOutput_1Hz);
  6.         RTC_CalibOutputCmd(ENABLE);
  7. }
使用库函数读取日期、时间:
  1. void Get_DateTime(void)
  2. {
  3.         RTC_GetDate(RTC_Format_BIN,&GetDate);
  4.         RTC_GetTime(RTC_Format_BIN,&GetTime);
  5. }
周期性的任务:1S中去读一次当前RTC时间

  1. void AppTaskStart(void const *arg)  
  2. {
  3.         AppTaskCreat();
  4.         for(;;)
  5.         {
  6.                 GPIO_PIN_TogglePin(GPIOA,GPIO_Pin_5);
  7.                 Get_DateTime();
  8.                 osDelay(1000);
  9.         }
  10. }
仿真的结果可以看到RTC跑了起来
0.jpg
再看一下PC13(用户按键)上的波形:
2.jpg
可以看到 RTC 硬件方式输出的 1Hz 还是很精准的。1.000258S的周期性方波。

回帖(5)

h1654155956.5608

2016-7-7 12:48:55
学习学习了。  
举报

hzkcool

2016-7-7 13:15:18
学习一下,RTC输出1HZ方波的作用一般在什么地方用到?计数?
举报

654524

2016-7-7 14:08:42
引用: hzkcool 发表于 2016-7-7 13:15
学习一下,RTC输出1HZ方波的作用一般在什么地方用到?计数?

配置好之后完全由硬件产生这个方波,减轻CPU工作量~ 目前我是把它用作一个 1S的时间基准,输出到2个定时器的捕获引脚。然后定时器其他通道的计数值在每次触发的时候自动保存下来。这个时间比定时器中断精准。其他的应用就不是很了解了。
举报

WAGN8012

2018-4-13 09:47:10

谢谢提供例程,看过还是很完整!
举报

richthoffen

2018-4-13 12:33:04
谢谢分享,初学者向你学习.
举报

更多回帖

发帖
×
20
完善资料,
赚取积分