更新RTC时钟

This commit is contained in:
许晟昊 2025-01-21 13:37:26 +08:00
parent f0d23f8870
commit 587e9158f2
12 changed files with 828 additions and 4389 deletions

View File

@ -78,18 +78,6 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_USER_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : PC14 PC15 PC0 PC1
PC2 PC3 PC4 PC5
PC6 PC7 PC8 PC9
PC10 PC11 PC12 */
GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1
|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9
|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pins : PF0 PF1 PF2 PF3
PF4 PF5 PF6 PF7
PF8 PF9 PF10 PF11
@ -102,6 +90,18 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
/*Configure GPIO pins : PC0 PC1 PC2 PC3
PC4 PC5 PC6 PC7
PC8 PC9 PC10 PC11
PC12 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pins : PA0 PA1 PA2 PA3
PA4 PA5 PA6 PA7
PA8 PA9 PA10 PA11

View File

@ -91,15 +91,13 @@ int main(void)
MX_GPIO_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
board_init();
app_init();
/* USER CODE END 2 */
/* Call init function for freertos objects (in freertos.c) */
MX_FREERTOS_Init();
board_init();
app_init();
/* Start scheduler */
osKernelStart();
@ -132,8 +130,9 @@ void SystemClock_Config(void)
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 4;

View File

@ -31,14 +31,14 @@ void MX_RTC_Init(void)
{
/* USER CODE BEGIN RTC_Init 0 */
#if 0
/* USER CODE END RTC_Init 0 */
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
/* USER CODE BEGIN RTC_Init 1 */
#endif
/* USER CODE END RTC_Init 1 */
/** Initialize RTC Only
@ -56,7 +56,7 @@ void MX_RTC_Init(void)
}
/* USER CODE BEGIN Check_RTC_BKUP */
#if 0
/* USER CODE END Check_RTC_BKUP */
/** Initialize RTC and set the Time and Date
@ -80,9 +80,8 @@ void MX_RTC_Init(void)
Error_Handler();
}
/* USER CODE BEGIN RTC_Init 2 */
#endif
/* USER CODE END RTC_Init 2 */
}
void HAL_RTC_MspInit(RTC_HandleTypeDef *rtcHandle)
@ -98,7 +97,7 @@ void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
/** Initializes the peripherals clock
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV8;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();

File diff suppressed because one or more lines are too long

View File

@ -149,6 +149,31 @@
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
<WatchWindow1>
<Ww>
<count>0</count>
<WinNumber>1</WinNumber>
<ItemText>board,0x0A</ItemText>
</Ww>
<Ww>
<count>1</count>
<WinNumber>1</WinNumber>
<ItemText>board,0x0A</ItemText>
</Ww>
<Ww>
<count>2</count>
<WinNumber>1</WinNumber>
<ItemText>hrtc,0x0A</ItemText>
</Ww>
</WatchWindow1>
<MemoryWindow1>
<Mm>
<WinNumber>1</WinNumber>
<SubType>0</SubType>
<ItemText>0x40002850</ItemText>
<AccSizeX>0</AccSizeX>
</Mm>
</MemoryWindow1>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ void business_task(void *pvParameters)
for (;;)
{
led_toggle(LED_USER);
// rtc_update();
rtc_update();
vTaskDelay(1000);
}
}

View File

@ -1,5 +1,6 @@
#include "board.h"
#include "main.h"
#include "rtc.h"
board_t board;
void led_open(led_e led)
@ -38,52 +39,97 @@ void led_toggle(led_e led)
}
}
void rtc_set_default(void)
/**
* @brief RTC写入后备区域SRAM
* @param bkrx : ,:0~31
* @param data : ,32
* @retval
*/
void rtc_write_bkr(uint32_t bkrx, uint32_t data)
{
HAL_PWR_EnableBkUpAccess(); /* 取消备份区写保护 */
HAL_RTCEx_BKUPWrite(&hrtc, bkrx, data);
}
/**
* @brief RTC读取后备区域SRAM
* @param bkrx : ,:0~31
* @retval
*/
static uint32_t rtc_read_bkr(uint32_t bkrx)
{
uint32_t temp = 0;
temp = RTC_BASE + 0x50 + bkrx * 4;
return (*(uint32_t *)temp); /* 返回读取到的值 */
}
BOOL rtc_set_time(rtc_time_t time, uint8_t ampm)
{
RTC_TimeTypeDef rtc_time;
rtc_time.Hours = time.hour;
rtc_time.Minutes = time.minute;
rtc_time.Seconds = time.second;
rtc_time.TimeFormat = ampm;
rtc_time.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
rtc_time.StoreOperation = RTC_STOREOPERATION_RESET;
return HAL_RTC_SetTime(&hrtc, &rtc_time, RTC_FORMAT_BIN) == HAL_OK;
}
BOOL rtc_set_date(rtc_date_t date)
{
RTC_DateTypeDef rtc_date;
rtc_date.Month = date.month;
rtc_date.Date = date.day;
rtc_date.Year = date.year;
rtc_date.WeekDay = date.weekday;
return HAL_RTC_SetDate(&hrtc, &rtc_date, RTC_FORMAT_BIN) == HAL_OK;
}
void rtc_update(void)
{
RTC_DateTypeDef rtc_date;
RTC_TimeTypeDef rtc_time;
HAL_RTC_GetTime(&hrtc, &rtc_time, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &rtc_date, RTC_FORMAT_BIN);
board.rtc_time.Hours = rtc_time.Hours;
board.rtc_time.Minutes = rtc_time.Minutes;
board.rtc_time.Seconds = rtc_time.Seconds;
board.rtc_date.WeekDay = rtc_date.WeekDay;
board.rtc_date.Month = rtc_date.Month;
board.rtc_date.Date = rtc_date.Date;
board.rtc_date.Year = rtc_date.Year;
}
BOOL rtc_init(void)
{
uint16_t bkpflag = 0;
/* 检查是不是第一次配置时钟 */
bkpflag = rtc_read_bkr(RTC_BKP_DR0); /* 读取BKP0的值 */
if ((bkpflag != 0x5050) && (bkpflag != 0x5051)) /* 之前未初始化过, 重新配置 */
{
rtc_date_t date;
rtc_time_t time;
date.year = 25;
date.month = 1;
date.day = 1;
date.weekday = get_weekday(date.year, date.month, date.day);
time.hour = 0;
time.minute = 0;
time.second = 0;
// rtc_set(date, time, LL_RTC_WEEKDAY_WEDNESDAY);
rtc_set_time(time, RTC_HOURFORMAT12_AM); /* 设置时间, 根据实际时间修改 */
rtc_set_date(date); /* 设置日期 */
rtc_write_bkr(RTC_BKP_DR0, 0x5051); /* 写入标记位 */
}
void rtc_set(rtc_date_t date, rtc_time_t time, uint8_t weekday)
{
// // Enable access to RTC
// LL_PWR_EnableBkUpAccess();
// LL_RCC_EnableRTC();
// LL_RTC_DateTypeDef rtc_date;
// LL_RTC_TimeTypeDef rtc_time;
// rtc_time.Hours = time.hour;
// rtc_time.Minutes = time.minute;
// rtc_time.Seconds = time.second;
// rtc_date.WeekDay = weekday;
// rtc_date.Day = date.day;
// rtc_date.Month = date.month;
// rtc_date.Year = date.year;
// LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BIN, &rtc_time);
// LL_RTC_DATE_Init(RTC, LL_RTC_FORMAT_BIN, &rtc_date);
// // Disable access to RTC
// LL_PWR_DisableBkUpAccess();
}
void rtc_update(void)
{
// board.rtc_time.Hours = LL_RTC_TIME_GetHour(RTC);
// board.rtc_time.Minutes = LL_RTC_TIME_GetMinute(RTC);
// board.rtc_time.Seconds = LL_RTC_TIME_GetSecond(RTC);
// board.rtc_date.WeekDay = LL_RTC_DATE_GetWeekDay(RTC);
// board.rtc_date.Day = LL_RTC_DATE_GetDay(RTC);
// board.rtc_date.Month = LL_RTC_DATE_GetMonth(RTC);
// board.rtc_date.Year = LL_RTC_DATE_GetYear(RTC);
return TRUE;
}
/**
@ -92,10 +138,6 @@ void rtc_update(void)
*/
void board_init(void)
{
rtc_update();
// if (board.rtc_date.Year == 0)
// {
// rtc_set_default();
// }
rtc_init();
// sd_test();
}

View File

@ -25,8 +25,8 @@ typedef enum
typedef struct
{
uint16_t adc_raw[ADC1_MAX];
// LL_RTC_DateTypeDef rtc_date;
// LL_RTC_TimeTypeDef rtc_time;
RTC_DateTypeDef rtc_date;
RTC_TimeTypeDef rtc_time;
} board_t;
extern board_t board;
@ -37,8 +37,8 @@ void led_open(led_e led);
void led_close(led_e led);
void led_toggle(led_e led);
void rtc_update(void);
void rtc_set(rtc_date_t date, rtc_time_t time, uint8_t weekday);
BOOL rtc_set_time(rtc_time_t time, uint8_t ampm);
BOOL rtc_set_date(rtc_date_t date);
// float32 get_cpu_temperature(void);
// float32 get_cpu_voltage(void);
#endif

View File

@ -67,6 +67,7 @@ typedef struct
uint16_t year;
uint8_t month;
uint8_t day;
uint8_t weekday;
} rtc_date_t;
typedef struct

View File

@ -75,6 +75,8 @@ void sys_msr_msp(uint32_t addr)
*/
void sys_standby(void)
{
__HAL_RCC_PWR_CLK_ENABLE(); /* 使能电源时钟 */
SET_BIT(PWR->CR, PWR_CR_PDDS); /* 进入待机模式 */
}
/**

View File

@ -18,15 +18,17 @@ Mcu.IPNb=5
Mcu.Name=STM32F407Z(E-G)Tx
Mcu.Package=LQFP144
Mcu.Pin0=PC13-ANTI_TAMP
Mcu.Pin1=PH0-OSC_IN
Mcu.Pin2=PH1-OSC_OUT
Mcu.Pin3=PA13
Mcu.Pin4=PA14
Mcu.Pin5=VP_FREERTOS_VS_CMSIS_V1
Mcu.Pin6=VP_RTC_VS_RTC_Activate
Mcu.Pin7=VP_RTC_VS_RTC_Calendar
Mcu.Pin8=VP_SYS_VS_tim6
Mcu.PinsNb=9
Mcu.Pin1=PC14-OSC32_IN
Mcu.Pin10=VP_SYS_VS_tim6
Mcu.Pin2=PC15-OSC32_OUT
Mcu.Pin3=PH0-OSC_IN
Mcu.Pin4=PH1-OSC_OUT
Mcu.Pin5=PA13
Mcu.Pin6=PA14
Mcu.Pin7=VP_FREERTOS_VS_CMSIS_V1
Mcu.Pin8=VP_RTC_VS_RTC_Activate
Mcu.Pin9=VP_RTC_VS_RTC_Calendar
Mcu.PinsNb=11
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F407ZGTx
@ -56,6 +58,10 @@ PA14.Signal=SYS_JTCK-SWCLK
PC13-ANTI_TAMP.GPIOParameters=GPIO_Label
PC13-ANTI_TAMP.GPIO_Label=LED_USER
PC13-ANTI_TAMP.Signal=GPIO_Output
PC14-OSC32_IN.Mode=LSE-External-Oscillator
PC14-OSC32_IN.Signal=RCC_OSC32_IN
PC15-OSC32_OUT.Mode=LSE-External-Oscillator
PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
PH0-OSC_IN.Mode=HSE-External-Oscillator
PH0-OSC_IN.Signal=RCC_OSC_IN
PH1-OSC_OUT.Mode=HSE-External-Oscillator
@ -108,7 +114,7 @@ RCC.HCLKFreq_Value=168000000
RCC.HSE_VALUE=8000000
RCC.HSI_VALUE=16000000
RCC.I2SClocksFreq_Value=192000000
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RCC_RTC_Clock_Source_FROM_HSE,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_SourceVirtual,RCC_RTC_Clock_Source_FROM_HSE,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
RCC.LSI_VALUE=32000
RCC.MCO2PinFreq_Value=168000000
RCC.PLLCLKFreq_Value=168000000
@ -117,10 +123,9 @@ RCC.PLLN=168
RCC.PLLQ=7
RCC.PLLQCLKFreq_Value=48000000
RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_HSE_DIV8
RCC.RCC_RTC_Clock_SourceVirtual=RCC_RTCCLKSOURCE_LSE
RCC.RCC_RTC_Clock_Source_FROM_HSE=RCC_RTCCLKSOURCE_HSE_DIV8
RCC.RTCFreq_Value=1000000
RCC.RTCFreq_Value=32768
RCC.RTCHSEDivFreq_Value=1000000
RCC.SYSCLKFreq_VALUE=168000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK