stm32 Nucleo中的RTC值

RTC value in stm32 Nucleo

我正在尝试在 Tera Term 上打印 RTC 日期和时间。但是我收到代码中提到的错误。 Tera term 也没有打印任何内容。我已经使用指针作为 Setdate 和 Getdate 的声明中提到的。 也有一些警告,例如 1) 格式 '%d' 需要一个匹配的 'int' 参数 [-Wformat=] 2) 从不兼容的指针类型 [-Wincompatible-pointer-types] 传递 'HAL_RTC_GetDate' 的参数 2 3) 从不兼容的指针类型 [-Wincompatible-pointer-types]

传递 'HAL_RTC_SetDate' 的参数 2
#include "main.h"
#include "stdio.h"

//uint8_t Time[6]="HH:MM:SS";
//uint8_t Date[6]="DD/MM/YY";
int main(void)
{
  /* USER CODE BEGIN 1 */
    typedef struct
    {
      uint8_t Month = 0x03;
      uint8_t Date = 0x24;
      uint8_t Year = 0x21;
    }Date_struct;
  uint8_t *Date;
  Date = &Date_struct;  Error: Expected expression before Date_struct

HAL_RTC_SetDate(&hrtc, &Date, RTC_FORMAT_BCD);
  while (1)
  {
      HAL_RTC_GetDate(&hrtc,&Date, RTC_FORMAT_BCD);
      HAL_Delay(1000);
  }
}

坦率地说,我没有特别使用 Tera Term 的经验,但我之前编写过 Atmel MCU 并且您的通用 C 代码似乎存在问题,而不是 MCU 功能。 C 编译器错误通常难以阅读,但我可以看到您混淆了结构定义、声明和初始化,以及与指针的斗争。


考虑以下纯 C 代码,让我们检查一下与您的不同之处。

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    struct date_struct
    {
        uint8_t month;
        uint8_t date;
        uint8_t year;
    }; // Define a structure named date_struct

    typedef struct date_struct date_struct_type; // make 'struct date_struct' into a new type

    date_struct_type date; // Declare a variable of the new type

    date.month = 0x03; // Initialize the fields of the variable
    date.date = 0x24;
    date.year = 0x21;

    date_struct_type * date_ptr; // Create a new pointer to the struct

    date_ptr = &date; // Assign the address of the variable to the pointer

    // Use the pointer to adress the structure's values
    printf("Month: %d\nDate: %d\nYear: %d\n", date_ptr->month, date_ptr->date, date_ptr->year);

    // ... or pass the pointer into any hypothetical function
    // func(date_ptr);

    // ... or pass a reference to the structure, but never a reference to the pointer
    // unless you know that you need it!
    // func(&date);

    return 0;
}

在您的代码中,您首先定义一个匿名 local structure and immediately typedef 它来创建一个 新类型 。这意味着,从那时起,您可以像对待变量类型一样使用该结构。

在我的代码中,我将结构定义和 typedef 拆分为两个单独的语句。该代码与编写相同

typedef struct date_struct
{
    uint8_t Month;
    uint8_t Date;
    uint8_t Year;
} date_struct_type; // Define and typedef a structure at the same time

... 或者我们甚至可以省略结构的名称并将其匿名 - 就像您在代码中所做的那样 - 我们根本不需要它命名,因为我们已经有了一个新的类型我们可以使用。

typedef struct // <-- leave out the name
{
    uint8_t Month;
    uint8_t Date;
    uint8_t Year;
} date_struct_type; // Define and typedef a structure at the same time

但是,结构定义是一个“模板”,它告诉编译器如何分配和访问内存中的结构。定义本身不存储任何值,因此我们无法分配给它。我们首先需要声明一个该类型的变量*.

date_struct_type date;

* C 是一种非常狂野的语言,您可以使用各种 shorthand,例如 。但是,我强烈建议您在刚开始时(以及将来)不要这样做,因为它确实不需要并且更难阅读、维护和调试。

有了变量,我们终于可以将我们的值分配给结构的各个元素。当访问结构的成员时,我们使用 member reference operator - ..

date.month = 0x03;
date.date = 0x24;
date.year = 0x21;

现在我们转向指针和两个神奇的运算符 - C 中的 *&,它们经常引起很多麻烦。

在您的代码中,您已经成功声明了一个指针:uint8_t *Date;。这里,* 不是运算符,它表示变量持有一个指针 - 换句话说,uint8_t *Date; 表示 “有一个名为 Date 的变量,它将在内存中某处保存 uint8_t 变量的地址".

然而,这不是我们想要的 - 我们想要指向我们的新结构,而不是 uint8_t。指针都具有相同的大小(在您的情况下 smt32 平台上为 32 位),因此它可以工作,但这就是引发 "incompatible pointer type" 警告的原因编译器。

相反,我们应该声明一个与我们打算使用该指针“指向”的变量类型相同的指针。为了清楚起见,我们将再次拆分声明和赋值语句 - 我们正在做两件事,将它们写成一个语句只是 shorthand.

date_struct_type * date_ptr;

赋值是 & 运算符发挥作用的地方。 & 运算符接受任何变量和 returns 它的地址 - 这正是我们想要存储在我们的 指针 [= 中的东西87=].

date_ptr = &date;

现在,每当我们想要传递指向新结构的指针时,要么使用我们刚刚创建的结构 - date_ptr,要么直接传递对结构的引用 - &date。两者都是可行的,但一定不要写错了:&date_prt。这给你一个指向指针的指针,这不是你通常想要的。

还有一些事情。当通过指向该结构的指针访问该结构的成员时,我们必须使用 structure dereference operator - ->。这就是 printf 语句包含 -> 运算符而不仅仅是 ..

的原因

我相信您可以通过调整代码使其正常工作。您的函数调用和无限 while 循环中应该不会再有任何问题,只需注意您将哪些指针传递给 HAL_RTC_SetDateHAL_RTC_GetDate 函数。请在评论中询问是否还有任何不清楚或无法正常工作的地方!