如何在stm32-discovery上显示时间

问题描述 投票:0回答:2

我最近一直在尝试 STM32-DISCOVERY,但我不确定如何开始使用该板的应用程序。

我想在stm32的显示屏上显示RTC的时间。

我该如何开始呢?我已经安装了STM32的库。

c stm32 microcontroller stm32f4discovery
2个回答
8
投票

我不确定“显示器”到底是什么意思(即,它是液晶屏、串行输出终端等吗?)。

在任何情况下,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 控制器本身...


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);
}
© www.soinside.com 2019 - 2024. All rights reserved.