我最近一直在尝试使用STM32-DISCOVERY,但我不确定什么是真正开始使用该主板应用程序的最佳方法。
我想在stm32的显示屏上显示RTC的时间。我一直在寻找很多教程,但我似乎找不到任何教程。
你们有没有想过开始这个的最佳方法是什么?我已经为STM32安装了库。
提前致谢。
答案 0 :(得分:8)
我不确定'display'究竟是什么意思(即它是LCD屏幕,串行输出终端等?)。
在任何情况下,RTC通常通过I2C总线连接到STM32,因此您需要初始化两个控制器(RTC和I2C),然后才能在RTC上获取/设置日期和时间。
以下是初始化RTC控制器的方法:
void rtc_init()
{
RTC_InitTypeDef RTC_InitStructure;
RTC_TimeTypeDef RTC_TimeStruct;
/* Enable the PWR clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
/* Allow access to RTC */
PWR_BackupAccessCmd(ENABLE);
/* Reset RTC Domain */
RCC_BackupResetCmd(ENABLE);
RCC_BackupResetCmd(DISABLE);
/* Enable the LSE OSC */
RCC_LSEConfig(RCC_LSE_ON);
/* Wait until LSE is ready */
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
/* Select the RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
/* Configure the RTC data register and RTC prescaler */
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
RTC_InitStructure.RTC_SynchPrediv = 0xFF;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
RTC_Init(&RTC_InitStructure);
/* Set the time to 00h 00mn 00s AM */
RTC_TimeStruct.RTC_H12 = RTC_H12_AM;
RTC_TimeStruct.RTC_Hours = 0x00;
RTC_TimeStruct.RTC_Minutes = 0x00;
RTC_TimeStruct.RTC_Seconds = 0x00;
RTC_SetTime(RTC_Format_BCD,&RTC_TimeStruct);
}
以下是您如何获取/设置RTC的日期和时间,不包括星期几:
在头文件中:
typedef struct
{
unsigned char second;
unsigned char minute;
unsigned char hour;
unsigned char day;
unsigned char month;
unsigned char year;
}
rtc_data_t;
void rtc_get(rtc_data_t* rtc_data);
void rtc_set(rtc_data_t* rtc_data);
在源文件中:
#define SENSOR_ADDRESS 0xD0 // or set this according to your HW configuration
#define HEX_2_DEC(val) (((val)/16)*10+((val)%16))
#define DEC_2_HEX(val) (((val)/10)*16+((val)%10))
typedef struct
{
unsigned char second;
unsigned char minute;
unsigned char hour;
unsigned char weekday;
unsigned char day;
unsigned char month;
unsigned char year;
}
raw_data_t;
void rtc_get(rtc_data_t* rtc_data)
{
raw_data_t raw_data;
i2c_polling_read(SENSOR_ADDRESS,0x00,sizeof(raw_data),(char*)&raw_data);
rtc_data->second = HEX_2_DEC(raw_data.second);
rtc_data->minute = HEX_2_DEC(raw_data.minute);
rtc_data->hour = HEX_2_DEC(raw_data.hour );
rtc_data->day = HEX_2_DEC(raw_data.day );
rtc_data->month = HEX_2_DEC(raw_data.month );
rtc_data->year = HEX_2_DEC(raw_data.year );
}
void rtc_set(rtc_data_t* rtc_data)
{
raw_data_t raw_data;
raw_data.second = DEC_2_HEX(rtc_data->second);
raw_data.minute = DEC_2_HEX(rtc_data->minute);
raw_data.hour = DEC_2_HEX(rtc_data->hour );
raw_data.day = DEC_2_HEX(rtc_data->day );
raw_data.month = DEC_2_HEX(rtc_data->month );
raw_data.year = DEC_2_HEX(rtc_data->year );
raw_data.weekday = RTC_Weekday_Monday; // or calculate the exact day
i2c_polling_write(SENSOR_ADDRESS,0x00,sizeof(raw_data),(char*)&raw_data);
}
除了I2C控制器的初始化之外,您还需要实现读/写例程。
给定rtc_data_t* rtc_data
,这是一个用于在LCD上显示HH:MM:SS
的Segger-GUI代码:
char text[16] = {0};
sprintf(text,"%.2u:%.2u:%.2u",rtc_data->hour,rtc_data->minute,rtc_data->second);
GUI_RECT gui_rect = {0,0,SCREEN_WIDTH-1,SCREEN_HEIGHT-1};
GUI_DispStringInRect(text,&gui_rect,GUI_TA_HCENTER|GUI_TA_VCENTER);
当然,你必须初始化LCD控制器......
答案 1 :(得分:4)
查看RTC库。它应该被称为“stm32f2xx_rtc.h”。您必须先启用RTC。
例如,我们使用32 KHz低速外部晶振来运行RTC。我们正在执行以下命令来配置RTC(F2系列微型):
/*** Clock Enable ***/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // PWR clock must be enabled to access RTC and RTC backup registers
/*** Unlock RTC Registers ***/
PWR_BackupAccessCmd(ENABLE); // Enable access to backup domain (RTC registers, RTC backup data registers, and backup SRAM)
RTC_WriteProtectionCmd(DISABLE); // Disable RTC register write protection
/*** RTC Enable ***/
RCC_LSEConfig(RCC_LSE_ON); // Enable LSE (32.768 kHz low speed external) crystal
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); // Select LSE as RTC source
RCC_RTCCLKCmd(ENABLE); // Enable RTC
/*** Enter RTC Initialization Mode ***/
if(RTC_EnterInitMode() == ERROR)
THROW(EXCODE_RTC_ENTER_INIT_MODE_ERROR);
/*** RTC Configuration ***/
/* Internal Clock Frequency */
/* (F_RTCCLK) / ((PREDIV_A + 1) * (PREDIV_S + 1)) */
/* Example: 32768 Hz / (128 * 256) = 1 Hz */
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
RTC_InitStructure.RTC_AsynchPrediv = 127;
RTC_InitStructure.RTC_SynchPrediv = 255;
if(RTC_Init(&RTC_InitStructure) == ERROR)
{
/*** Lock RTC Registers ***/
RTC_ExitInitMode(); // Exit RTC initialization mode
RTC_WriteProtectionCmd(ENABLE); // Enable RTC register write protection
PWR_BackupAccessCmd(DISABLE); // Disable access to backup domain (RTC registers, RTC backup data registers, and backup SRAM)
THROW(EXCODE_RTC_INIT_ERROR);
}