程序1:
#include "RTC.h"
#define RTC_CLOCK_SOURCE_LXTAL // ÅäÖÃRTCʱÖÓÔ´
#define BKP_VALUE 0x32F0
rtc_parameter_struct rtc_initpara;
rtc_alarm_struct rtc_alarm;
__IO uint32_t prescaler_a = 0, prescaler_s = 0;
uint32_t RTCSRC_FLAG = 0;
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
void RTC_Init(void)
{
printf("\n\r ****************** RTC calendar demo ******************\n\r");
/* enable PMU clock */
rcu_periph_clock_enable(RCU_PMU);
/* enable the access of the RTC registers */
pmu_backup_write_enable();
rtc_pre_config();
/* get RTC clock entry selection */
RTCSRC_FLAG = GET_BITS(RCU_BDCTL, 8, 9);
/* check if RTC has aready been configured */
if((BKP_VALUE != RTC_BKP0) || (0x00 == RTCSRC_FLAG)){
/* backup data register value is not correct or not yet programmed
or RTC clock source is not configured (when the first time the program
is executed or data in RCU_BDCTL is lost due to Vbat feeding) */
rtc_setup();
}else{
/* detect the reset source */
if (RESET != rcu_flag_get(RCU_FLAG_PORRST)){
printf("power on reset occurred....\n\r");
}else if (RESET != rcu_flag_get(RCU_FLAG_EPRST)){
printf("external reset occurred....\n\r");
}
printf("no need to configure RTC....\n\r");
rtc_show_time();
}
rcu_all_reset_flag_clear();
}
/*!
\brief RTC configuration function
\param[in] none
\param[out] none
\retval none
*/
void rtc_pre_config(void)
{
#if defined (RTC_CLOCK_SOURCE_IRC32K)
rcu_osci_on(RCU_IRC32K);
rcu_osci_stab_wait(RCU_IRC32K);
rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
prescaler_s = 0x13F;
prescaler_a = 0x63;
#elif defined (RTC_CLOCK_SOURCE_LXTAL)
rcu_osci_on(RCU_LXTAL);
rcu_osci_stab_wait(RCU_LXTAL);
rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
prescaler_s = 0xFF;
prescaler_a = 0x7F;
#else
#error RTC clock source should be defined.
#endif /* RTC_CLOCK_SOURCE_IRC32K */
rcu_periph_clock_enable(RCU_RTC);
rtc_register_sync_wait();
}
/*!
\brief use hyperterminal to setup RTC time and alarm
\param[in] none
\param[out] none
\retval none
*/
void rtc_setup(void)
{
/* setup RTC time value */
uint32_t tmp_year = 0xFF, tmp_month = 0xFF, tmp_day = 0xFF;
uint32_t tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF;
rtc_initpara.factor_asyn = prescaler_a;
rtc_initpara.factor_syn = prescaler_s;
rtc_initpara.year = 0x16;
rtc_initpara.day_of_week = RTC_SATURDAY;
rtc_initpara.month = RTC_APR;
rtc_initpara.date = 0x30;
rtc_initpara.display_format = RTC_24HOUR;
rtc_initpara.am_pm = RTC_AM;
/* current time input */
printf("=======Configure RTC Time========\n\r");
printf(" please set the last two digits of current year:\n\r");
while(tmp_year == 0xFF) {
tmp_year = usart_input_threshold(99);
rtc_initpara.year = tmp_year;
}
printf(" 20%0.2x\n\r", tmp_year);
printf(" please input month:\n\r");
while(tmp_month == 0xFF) {
tmp_month = usart_input_threshold(12);
rtc_initpara.month = tmp_month;
}
printf(" %0.2x\n\r", tmp_month);
printf(" please input day:\n\r");
while(tmp_day == 0xFF) {
tmp_day = usart_input_threshold(31);
rtc_initpara.date = tmp_day;
}
printf(" %0.2x\n\r", tmp_day);
printf(" please input hour:\n\r");
while (0xFF == tmp_hh){
tmp_hh = usart_input_threshold(23);
rtc_initpara.hour = tmp_hh;
}
printf(" %0.2x\n\r", tmp_hh);
printf(" please input minute:\n\r");
while (0xFF == tmp_mm){
tmp_mm = usart_input_threshold(59);
rtc_initpara.minute = tmp_mm;
}
printf(" %0.2x\n\r", tmp_mm);
printf(" please input second:\n\r");
while (0xFF == tmp_ss){
tmp_ss = usart_input_threshold(59);
rtc_initpara.second = tmp_ss;
}
printf(" %0.2x\n\r", tmp_ss);
/* RTC current time configuration */
if(ERROR == rtc_init(&rtc_initpara)){
printf("\n\r** RTC time configuration failed! **\n\r");
}else{
printf("\n\r** RTC time configuration success! **\n\r");
rtc_show_time();
RTC_BKP0 = BKP_VALUE;
}
// /* setup RTC alarm */
// tmp_hh = 0xFF;
// tmp_mm = 0xFF;
// tmp_ss = 0xFF;
// rtc_alarm_disable(RTC_ALARM0);
// printf("=======Input Alarm Value=======\n\r");
// rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;
// rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
// rtc_alarm.alarm_day = 0x31;
// rtc_alarm.am_pm = RTC_AM;
// /* RTC alarm input */
// printf(" please input Alarm Hour:\n\r");
// while (0xFF == tmp_hh){
// tmp_hh = usart_input_threshold(23);
// rtc_alarm.alarm_hour = tmp_hh;
// }
// printf(" %0.2x\n\r", tmp_hh);
// printf(" Please Input Alarm Minute:\n\r");
// while (0xFF == tmp_mm){
// tmp_mm = usart_input_threshold(59);
// rtc_alarm.alarm_minute = tmp_mm;
// }
// printf(" %0.2x\n\r", tmp_mm);
// printf(" Please Input Alarm Second:\n\r");
// while (0xFF == tmp_ss){
// tmp_ss = usart_input_threshold(59);
// rtc_alarm.alarm_second = tmp_ss;
// }
// printf(" %0.2x", tmp_ss);
// /* RTC alarm configuration */
// rtc_alarm_config(RTC_ALARM0,&rtc_alarm);
// printf("\n\r** RTC Set Alarm Success! **\n\r");
// rtc_show_alarm();
// rtc_interrupt_enable(RTC_INT_ALARM0);
// rtc_alarm_enable(RTC_ALARM0);
}
/*!
\brief display the current time
\param[in] none
\param[out] none
\retval none
*/
void rtc_show_time(void)
{
// uint32_t time_subsecond = 0;
// uint8_t subsecond_ss = 0,subsecond_ts = 0,subsecond_hs = 0;
rtc_current_time_get(&rtc_initpara);
/* get the subsecond value of current time, and convert it into fractional format */
// time_subsecond = rtc_subsecond_get();
// subsecond_ss=(1000-(time_subsecond*1000+1000)/400)/100;
// subsecond_ts=(1000-(time_subsecond*1000+1000)/400)%100/10;
// subsecond_hs=(1000-(time_subsecond*1000+1000)/400)%10;
printf("\r\nCurrent time: 20%0.2x-%0.2x-%0.2x", \
rtc_initpara.year, rtc_initpara.month, rtc_initpara.date);
printf(" : %0.2x:%0.2x:%0.2x \r\n", \
rtc_initpara.hour, rtc_initpara.minute, rtc_initpara.second);
}
/*!
\brief display the alram value
\param[in] none
\param[out] none
\retval none
*/
void rtc_show_alarm(void)
{
rtc_alarm_get(RTC_ALARM0,&rtc_alarm);
printf("The alarm: %0.2x:%0.2x:%0.2x \n\r", rtc_alarm.alarm_hour, rtc_alarm.alarm_minute,\
rtc_alarm.alarm_second);
}
/*!
\brief get the input character string and check if it is valid
\param[in] none
\param[out] none
\retval input value in BCD mode
*/
uint8_t usart_input_threshold(uint32_t value)
{
uint32_t index = 0;
uint32_t tmp[2] = {0, 0};
while (index < 2){
while (RESET == usart_flag_get(USART0, USART_FLAG_RBNE));
tmp[index++] = usart_data_receive(USART0);
if ((tmp[index - 1] < 0x30) || (tmp[index - 1] > 0x39)){
printf("\n\r please input a valid number between 0 and 9 \n\r");
index--;
}
}
index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10);
if (index > value){
printf("\n\r please input a valid number between 0 and %d \n\r", value);
return 0xFF;
}
index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) <<4);
return index;
}
程序2:
/************************************************************
* °æÈ¨£º2025CIMC Copyright¡£
* Îļþ£ºRTC.c
* ×÷Õß: Qiao Qin @ GigaDevice
* ƽ̨: 2025CIMC IHD-V04
* °æ±¾: Qiao Qin 2025/4/20 V0.01 original
************************************************************/
#include "RTC.h"
#define RTC_CLOCK_SOURCE_LXTAL // ÅäÖÃRTCʱÖÓÔ´
#define BKP_VALUE 0x32F0
rtc_parameter_struct rtc_initpara;
rtc_alarm_struct rtc_alarm;
__IO uint32_t prescaler_a = 0, prescaler_s = 0;
uint32_t RTCSRC_FLAG = 0;
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
void RTC_Init(void)
{
printf("\n\r ****************** RTC calendar demo ******************\n\r");
/* enable PMU clock */
rcu_periph_clock_enable(RCU_PMU);
/* enable the access of the RTC registers */
pmu_backup_write_enable();
rtc_pre_config();
printf("Configuring RTC on every initialization...\n\r");
char cmd_buffer[32] = "2000-01-01 00:02:51";
rtc_settime((const char*)cmd_buffer); // ????RTC??
if (RESET != rcu_flag_get(RCU_FLAG_PORRST)) {
printf("power on reset occurred....\n\r");
} else if (RESET != rcu_flag_get(RCU_FLAG_EPRST)) {
printf("external reset occurred....\n\r");
}
rtc_show_time(); // ??????
rcu_all_reset_flag_clear();
}
/*!
\brief RTC configuration function
\param[in] none
\param[out] none
\retval none
*/
void rtc_pre_config(void)
{
#if defined (RTC_CLOCK_SOURCE_IRC32K)
rcu_osci_on(RCU_IRC32K);
rcu_osci_stab_wait(RCU_IRC32K);
rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
prescaler_s = 0x13F;
prescaler_a = 0x63;
#elif defined (RTC_CLOCK_SOURCE_LXTAL)
rcu_osci_on(RCU_LXTAL);
rcu_osci_stab_wait(RCU_LXTAL);
rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
prescaler_s = 0xFF;
prescaler_a = 0x7F;
#else
#error RTC clock source should be defined.
#endif /* RTC_CLOCK_SOURCE_IRC32K */
rcu_periph_clock_enable(RCU_RTC);
rtc_register_sync_wait();
}
/*!
\brief use hyperterminal to setup RTC time and alarm
\param[in] none
\param[out] none
\retval none
*/
void rtc_settime(const char *datetime)
{
/* setup RTC time value */
uint32_t tmp_year = 0, tmp_month = 0, tmp_day = 0;
uint32_t tmp_hh = 0, tmp_mm = 0, tmp_ss = 0;
if (sscanf(datetime, "%4u-%2u-%2u %2u:%2u:%2u",
&tmp_year, &tmp_month, &tmp_day,
&tmp_hh, &tmp_mm, &tmp_ss) != 6) {
printf(" ERROR: Invalid time format!\n\r");
return;
}
rtc_initpara.factor_asyn = prescaler_a;
rtc_initpara.factor_syn = prescaler_s;
rtc_initpara.year = 0x16;
rtc_initpara.day_of_week = RTC_SATURDAY;
rtc_initpara.month = RTC_APR;
rtc_initpara.date = 0x30;
rtc_initpara.display_format = RTC_24HOUR;
rtc_initpara.am_pm = RTC_AM;
// Äê·Ý(2000-2099)
if (tmp_year < 2000 || tmp_year > 2099) {
printf(" ERROR: Year out of range [2000-2099]!\n\r");
return;
}
rtc_initpara.year = tmp_year % 100; // ????
// ÔÂ·Ý (1-12)
if (tmp_month < 1 || tmp_month > 12) {
printf(" ERROR: Month out of range [1-12]!\n\r");
return;
}
rtc_initpara.month = tmp_month;
// ÈÕÆÚ (1-31)
if (tmp_day < 1 || tmp_day > 31) {
printf(" ERROR: Day out of range [1-31]!\n\r");
return;
}
rtc_initpara.date = tmp_day;
// Сʱ(0-23)
if (tmp_hh > 23) {
printf(" ERROR: Hour out of range [0-23]!\n\r");
return;
}
rtc_initpara.hour = tmp_hh;
// ·ÖÖÓ(0-59)
if (tmp_mm > 59) {
printf(" ERROR: Minute out of range [0-59]!\n\r");
return;
}
rtc_initpara.minute = tmp_mm;
// mÃëÖÓ(0-59)
if (tmp_ss > 59) {
printf(" ERROR: Second out of range [0-59]!\n\r");
return;
}
rtc_initpara.second = tmp_ss;
printf("\n\rRTC Config success\n\r");
printf("Time: 20%02u-%02u-%02u %02u:%02u:%02u\n\r",
rtc_initpara.year, rtc_initpara.month, rtc_initpara.date,
rtc_initpara.hour, rtc_initpara.minute, rtc_initpara.second);
/*RTC³õʼ»¯*/
if (ERROR == rtc_init(&rtc_initpara)) {
// printf("\n\r** RTC configuration failed! **\n\r");
} else {
// printf("\n\r** RTC configuration success! **\n\r");
RTC_BKP0 = BKP_VALUE;
}
}
/*!
\brief display the current time
\param[in] none
\param[out] none
\retval none
*/
void rtc_show_time(void)
{
rtc_current_time_get(&rtc_initpara);
printf("\r\nCurrent Time: 20%02u-%02u-%02u %02u:%02u:%02u\n\r",
rtc_initpara.year, rtc_initpara.month, rtc_initpara.date,
rtc_initpara.hour, rtc_initpara.minute, rtc_initpara.second);
}
/*!
\brief display the alram value
\param[in] none
\param[out] none
\retval none
*/
void rtc_show_alarm(void)
{
rtc_alarm_get(RTC_ALARM0,&rtc_alarm);
printf("The alarm: %0.2x:%0.2x:%0.2x \n\r", rtc_alarm.alarm_hour, rtc_alarm.alarm_minute,\
rtc_alarm.alarm_second);
}
/*!
\brief get the input character string and check if it is valid
\param[in] none
\param[out] none
\retval input value in BCD mode
*/
uint8_t usart_input_threshold(uint32_t value)
{
uint32_t index = 0;
uint32_t tmp[2] = {0, 0};
while (index < 2){
while (RESET == usart_flag_get(USART0, USART_FLAG_RBNE));
tmp[index++] = usart_data_receive(USART0);
if ((tmp[index - 1] < 0x30) || (tmp[index - 1] > 0x39)){
printf("\n\r please input a valid number between 0 and 9 \n\r");
index--;
}
}
index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10);
if (index > value){
printf("\n\r please input a valid number between 0 and %d \n\r", value);
return 0xFF;
}
index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) <<4);
return index;
}
程序1可以正常记时,程序二时间会有跳变,请改错
程序1:
#include "RTC.h"
#define RTC_CLOCK_SOURCE_LXTAL // ÅäÖÃRTCʱÖÓÔ´
#define BKP_VALUE 0x32F0
rtc_parameter_struct rtc_initpara;
rtc_alarm_struct rtc_alarm;
__IO uint32_t prescaler_a = 0, prescaler_s = 0;
uint32_t RTCSRC_FLAG = 0;
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
void RTC_Init(void)
{
printf("\n\r ****************** RTC calendar demo ******************\n\r");
/* enable PMU clock */
rcu_periph_clock_enable(RCU_PMU);
/* enable the access of the RTC registers */
pmu_backup_write_enable();
rtc_pre_config();
/* get RTC clock entry selection */
RTCSRC_FLAG = GET_BITS(RCU_BDCTL, 8, 9);
/* check if RTC has aready been configured */
if((BKP_VALUE != RTC_BKP0) || (0x00 == RTCSRC_FLAG)){
/* backup data register value is not correct or not yet programmed
or RTC clock source is not configured (when the first time the program
is executed or data in RCU_BDCTL is lost due to Vbat feeding) */
rtc_setup();
}else{
/* detect the reset source */
if (RESET != rcu_flag_get(RCU_FLAG_PORRST)){
printf("power on reset occurred....\n\r");
}else if (RESET != rcu_flag_get(RCU_FLAG_EPRST)){
printf("external reset occurred....\n\r");
}
printf("no need to configure RTC....\n\r");
rtc_show_time();
}
rcu_all_reset_flag_clear();
}
/*!
\brief RTC configuration function
\param[in] none
\param[out] none
\retval none
*/
void rtc_pre_config(void)
{
#if defined (RTC_CLOCK_SOURCE_IRC32K)
rcu_osci_on(RCU_IRC32K);
rcu_osci_stab_wait(RCU_IRC32K);
rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
prescaler_s = 0x13F;
prescaler_a = 0x63;
#elif defined (RTC_CLOCK_SOURCE_LXTAL)
rcu_osci_on(RCU_LXTAL);
rcu_osci_stab_wait(RCU_LXTAL);
rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
prescaler_s = 0xFF;
prescaler_a = 0x7F;
#else
#error RTC clock source should be defined.
#endif /* RTC_CLOCK_SOURCE_IRC32K */
rcu_periph_clock_enable(RCU_RTC);
rtc_register_sync_wait();
}
/*!
\brief use hyperterminal to setup RTC time and alarm
\param[in] none
\param[out] none
\retval none
*/
void rtc_setup(void)
{
/* setup RTC time value */
uint32_t tmp_year = 0xFF, tmp_month = 0xFF, tmp_day = 0xFF;
uint32_t tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF;
rtc_initpara.factor_asyn = prescaler_a;
rtc_initpara.factor_syn = prescaler_s;
rtc_initpara.year = 0x16;
rtc_initpara.day_of_week = RTC_SATURDAY;
rtc_initpara.month = RTC_APR;
rtc_initpara.date = 0x30;
rtc_initpara.display_format = RTC_24HOUR;
rtc_initpara.am_pm = RTC_AM;
/* current time input */
printf("=======Configure RTC Time========\n\r");
printf(" please set the last two digits of current year:\n\r");
while(tmp_year == 0xFF) {
tmp_year = usart_input_threshold(99);
rtc_initpara.year = tmp_year;
}
printf(" 20%0.2x\n\r", tmp_year);
printf(" please input month:\n\r");
while(tmp_month == 0xFF) {
tmp_month = usart_input_threshold(12);
rtc_initpara.month = tmp_month;
}
printf(" %0.2x\n\r", tmp_month);
printf(" please input day:\n\r");
while(tmp_day == 0xFF) {
tmp_day = usart_input_threshold(31);
rtc_initpara.date = tmp_day;
}
printf(" %0.2x\n\r", tmp_day);
printf(" please input hour:\n\r");
while (0xFF == tmp_hh){
tmp_hh = usart_input_threshold(23);
rtc_initpara.hour = tmp_hh;
}
printf(" %0.2x\n\r", tmp_hh);
printf(" please input minute:\n\r");
while (0xFF == tmp_mm){
tmp_mm = usart_input_threshold(59);
rtc_initpara.minute = tmp_mm;
}
printf(" %0.2x\n\r", tmp_mm);
printf(" please input second:\n\r");
while (0xFF == tmp_ss){
tmp_ss = usart_input_threshold(59);
rtc_initpara.second = tmp_ss;
}
printf(" %0.2x\n\r", tmp_ss);
/* RTC current time configuration */
if(ERROR == rtc_init(&rtc_initpara)){
printf("\n\r** RTC time configuration failed! **\n\r");
}else{
printf("\n\r** RTC time configuration success! **\n\r");
rtc_show_time();
RTC_BKP0 = BKP_VALUE;
}
// /* setup RTC alarm */
// tmp_hh = 0xFF;
// tmp_mm = 0xFF;
// tmp_ss = 0xFF;
// rtc_alarm_disable(RTC_ALARM0);
// printf("=======Input Alarm Value=======\n\r");
// rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK|RTC_ALARM_HOUR_MASK|RTC_ALARM_MINUTE_MASK;
// rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
// rtc_alarm.alarm_day = 0x31;
// rtc_alarm.am_pm = RTC_AM;
// /* RTC alarm input */
// printf(" please input Alarm Hour:\n\r");
// while (0xFF == tmp_hh){
// tmp_hh = usart_input_threshold(23);
// rtc_alarm.alarm_hour = tmp_hh;
// }
// printf(" %0.2x\n\r", tmp_hh);
// printf(" Please Input Alarm Minute:\n\r");
// while (0xFF == tmp_mm){
// tmp_mm = usart_input_threshold(59);
// rtc_alarm.alarm_minute = tmp_mm;
// }
// printf(" %0.2x\n\r", tmp_mm);
// printf(" Please Input Alarm Second:\n\r");
// while (0xFF == tmp_ss){
// tmp_ss = usart_input_threshold(59);
// rtc_alarm.alarm_second = tmp_ss;
// }
// printf(" %0.2x", tmp_ss);
// /* RTC alarm configuration */
// rtc_alarm_config(RTC_ALARM0,&rtc_alarm);
// printf("\n\r** RTC Set Alarm Success! **\n\r");
// rtc_show_alarm();
// rtc_interrupt_enable(RTC_INT_ALARM0);
// rtc_alarm_enable(RTC_ALARM0);
}
/*!
\brief display the current time
\param[in] none
\param[out] none
\retval none
*/
void rtc_show_time(void)
{
// uint32_t time_subsecond = 0;
// uint8_t subsecond_ss = 0,subsecond_ts = 0,subsecond_hs = 0;
rtc_current_time_get(&rtc_initpara);
/* get the subsecond value of current time, and convert it into fractional format */
// time_subsecond = rtc_subsecond_get();
// subsecond_ss=(1000-(time_subsecond*1000+1000)/400)/100;
// subsecond_ts=(1000-(time_subsecond*1000+1000)/400)%100/10;
// subsecond_hs=(1000-(time_subsecond*1000+1000)/400)%10;
printf("\r\nCurrent time: 20%0.2x-%0.2x-%0.2x", \
rtc_initpara.year, rtc_initpara.month, rtc_initpara.date);
printf(" : %0.2x:%0.2x:%0.2x \r\n", \
rtc_initpara.hour, rtc_initpara.minute, rtc_initpara.second);
}
/*!
\brief display the alram value
\param[in] none
\param[out] none
\retval none
*/
void rtc_show_alarm(void)
{
rtc_alarm_get(RTC_ALARM0,&rtc_alarm);
printf("The alarm: %0.2x:%0.2x:%0.2x \n\r", rtc_alarm.alarm_hour, rtc_alarm.alarm_minute,\
rtc_alarm.alarm_second);
}
/*!
\brief get the input character string and check if it is valid
\param[in] none
\param[out] none
\retval input value in BCD mode
*/
uint8_t usart_input_threshold(uint32_t value)
{
uint32_t index = 0;
uint32_t tmp[2] = {0, 0};
while (index < 2){
while (RESET == usart_flag_get(USART0, USART_FLAG_RBNE));
tmp[index++] = usart_data_receive(USART0);
if ((tmp[index - 1] < 0x30) || (tmp[index - 1] > 0x39)){
printf("\n\r please input a valid number between 0 and 9 \n\r");
index--;
}
}
index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10);
if (index > value){
printf("\n\r please input a valid number between 0 and %d \n\r", value);
return 0xFF;
}
index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) <<4);
return index;
}
程序2:
/************************************************************
* °æÈ¨£º2025CIMC Copyright¡£
* Îļþ£ºRTC.c
* ×÷Õß: Qiao Qin @ GigaDevice
* ƽ̨: 2025CIMC IHD-V04
* °æ±¾: Qiao Qin 2025/4/20 V0.01 original
************************************************************/
#include "RTC.h"
#define RTC_CLOCK_SOURCE_LXTAL // ÅäÖÃRTCʱÖÓÔ´
#define BKP_VALUE 0x32F0
rtc_parameter_struct rtc_initpara;
rtc_alarm_struct rtc_alarm;
__IO uint32_t prescaler_a = 0, prescaler_s = 0;
uint32_t RTCSRC_FLAG = 0;
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
void RTC_Init(void)
{
printf("\n\r ****************** RTC calendar demo ******************\n\r");
/* enable PMU clock */
rcu_periph_clock_enable(RCU_PMU);
/* enable the access of the RTC registers */
pmu_backup_write_enable();
rtc_pre_config();
printf("Configuring RTC on every initialization...\n\r");
char cmd_buffer[32] = "2000-01-01 00:02:51";
rtc_settime((const char*)cmd_buffer); // ????RTC??
if (RESET != rcu_flag_get(RCU_FLAG_PORRST)) {
printf("power on reset occurred....\n\r");
} else if (RESET != rcu_flag_get(RCU_FLAG_EPRST)) {
printf("external reset occurred....\n\r");
}
rtc_show_time(); // ??????
rcu_all_reset_flag_clear();
}
/*!
\brief RTC configuration function
\param[in] none
\param[out] none
\retval none
*/
void rtc_pre_config(void)
{
#if defined (RTC_CLOCK_SOURCE_IRC32K)
rcu_osci_on(RCU_IRC32K);
rcu_osci_stab_wait(RCU_IRC32K);
rcu_rtc_clock_config(RCU_RTCSRC_IRC32K);
prescaler_s = 0x13F;
prescaler_a = 0x63;
#elif defined (RTC_CLOCK_SOURCE_LXTAL)
rcu_osci_on(RCU_LXTAL);
rcu_osci_stab_wait(RCU_LXTAL);
rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
prescaler_s = 0xFF;
prescaler_a = 0x7F;
#else
#error RTC clock source should be defined.
#endif /* RTC_CLOCK_SOURCE_IRC32K */
rcu_periph_clock_enable(RCU_RTC);
rtc_register_sync_wait();
}
/*!
\brief use hyperterminal to setup RTC time and alarm
\param[in] none
\param[out] none
\retval none
*/
void rtc_settime(const char *datetime)
{
/* setup RTC time value */
uint32_t tmp_year = 0, tmp_month = 0, tmp_day = 0;
uint32_t tmp_hh = 0, tmp_mm = 0, tmp_ss = 0;
if (sscanf(datetime, "%4u-%2u-%2u %2u:%2u:%2u",
&tmp_year, &tmp_month, &tmp_day,
&tmp_hh, &tmp_mm, &tmp_ss) != 6) {
printf(" ERROR: Invalid time format!\n\r");
return;
}
rtc_initpara.factor_asyn = prescaler_a;
rtc_initpara.factor_syn = prescaler_s;
rtc_initpara.year = 0x16;
rtc_initpara.day_of_week = RTC_SATURDAY;
rtc_initpara.month = RTC_APR;
rtc_initpara.date = 0x30;
rtc_initpara.display_format = RTC_24HOUR;
rtc_initpara.am_pm = RTC_AM;
// Äê·Ý(2000-2099)
if (tmp_year < 2000 || tmp_year > 2099) {
printf(" ERROR: Year out of range [2000-2099]!\n\r");
return;
}
rtc_initpara.year = tmp_year % 100; // ????
// ÔÂ·Ý (1-12)
if (tmp_month < 1 || tmp_month > 12) {
printf(" ERROR: Month out of range [1-12]!\n\r");
return;
}
rtc_initpara.month = tmp_month;
// ÈÕÆÚ (1-31)
if (tmp_day < 1 || tmp_day > 31) {
printf(" ERROR: Day out of range [1-31]!\n\r");
return;
}
rtc_initpara.date = tmp_day;
// Сʱ(0-23)
if (tmp_hh > 23) {
printf(" ERROR: Hour out of range [0-23]!\n\r");
return;
}
rtc_initpara.hour = tmp_hh;
// ·ÖÖÓ(0-59)
if (tmp_mm > 59) {
printf(" ERROR: Minute out of range [0-59]!\n\r");
return;
}
rtc_initpara.minute = tmp_mm;
// mÃëÖÓ(0-59)
if (tmp_ss > 59) {
printf(" ERROR: Second out of range [0-59]!\n\r");
return;
}
rtc_initpara.second = tmp_ss;
printf("\n\rRTC Config success\n\r");
printf("Time: 20%02u-%02u-%02u %02u:%02u:%02u\n\r",
rtc_initpara.year, rtc_initpara.month, rtc_initpara.date,
rtc_initpara.hour, rtc_initpara.minute, rtc_initpara.second);
/*RTC³õʼ»¯*/
if (ERROR == rtc_init(&rtc_initpara)) {
// printf("\n\r** RTC configuration failed! **\n\r");
} else {
// printf("\n\r** RTC configuration success! **\n\r");
RTC_BKP0 = BKP_VALUE;
}
}
/*!
\brief display the current time
\param[in] none
\param[out] none
\retval none
*/
void rtc_show_time(void)
{
rtc_current_time_get(&rtc_initpara);
printf("\r\nCurrent Time: 20%02u-%02u-%02u %02u:%02u:%02u\n\r",
rtc_initpara.year, rtc_initpara.month, rtc_initpara.date,
rtc_initpara.hour, rtc_initpara.minute, rtc_initpara.second);
}
/*!
\brief display the alram value
\param[in] none
\param[out] none
\retval none
*/
void rtc_show_alarm(void)
{
rtc_alarm_get(RTC_ALARM0,&rtc_alarm);
printf("The alarm: %0.2x:%0.2x:%0.2x \n\r", rtc_alarm.alarm_hour, rtc_alarm.alarm_minute,\
rtc_alarm.alarm_second);
}
/*!
\brief get the input character string and check if it is valid
\param[in] none
\param[out] none
\retval input value in BCD mode
*/
uint8_t usart_input_threshold(uint32_t value)
{
uint32_t index = 0;
uint32_t tmp[2] = {0, 0};
while (index < 2){
while (RESET == usart_flag_get(USART0, USART_FLAG_RBNE));
tmp[index++] = usart_data_receive(USART0);
if ((tmp[index - 1] < 0x30) || (tmp[index - 1] > 0x39)){
printf("\n\r please input a valid number between 0 and 9 \n\r");
index--;
}
}
index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10);
if (index > value){
printf("\n\r please input a valid number between 0 and %d \n\r", value);
return 0xFF;
}
index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) <<4);
return index;
}
程序1可以正常记时,不会出现跳变,程序二时间会有跳变,请改错程序2,我需要在程序2上改错,保留大部分不错的内容,仅改变错误的地方