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_SetDate
和 HAL_RTC_GetDate
函数。请在评论中询问是否还有任何不清楚或无法正常工作的地方!
我正在尝试在 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_SetDate
和 HAL_RTC_GetDate
函数。请在评论中询问是否还有任何不清楚或无法正常工作的地方!