This commit is contained in:
2026-03-20 21:19:04 +08:00
parent 90c3d919df
commit 9d3b4b836f
247 changed files with 22127 additions and 30305 deletions

165
user/MCU/lhl_rtc.c Executable file → Normal file
View File

@@ -1,133 +1,64 @@
#include "../main/SystemInclude.h"
/**
* @brief RTC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>Σ<EFBFBD>
* @note <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ԴΪ LSI<53><49>32.768kHz<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 32767 <20>õ<EFBFBD> 1Hz <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼֵΪ 0<><30><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʼֵΪ 0<><30>ʹ<EFBFBD>þ<EFBFBD>̬<EFBFBD><CCAC>־ȷ<D6BE><C8B7>ִֻ<D6BB><D6B4>һ<EFBFBD>Ρ<EFBFBD>
* @param <20><>
* @example <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ֱ<EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>
*/
static void RTC_BaseInit(void)
void RTC_SEC_Init(void)
{
static uint8_t rtc_base_inited = 0;
if (rtc_base_inited) return;
RTC_InitTypeDef RTC_InitStructure;
/* 1. <20><>ʼ<EFBFBD><CABC>RTC<54><43><EFBFBD><EFBFBD> */
RTC_InitStructure.ClockSource = RCC_RTCCLKSource_LSI; // RTCʱ<43><CAB1>ԴLSI
RTC_InitStructure.Prescaler = 32767; // RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) = 1S
RTC_InitStructure.Counter = 0; // <20><>0<EFBFBD><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
RTC_InitStructure.Alarm = 10; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>10S
LHL_RTC_Init(&RTC_InitStructure);
/* 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */
LHL_RTC_ITConfig(RTC_IT_SECIE, ENABLE);
NVIC_EnableIRQ(RTC_IRQn); // <20><><EFBFBD>жϺ<D0B6><CFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>RTC_IRQn<51><6E><EFBFBD><EFBFBD>
}
RTC_InitTypeDef cfg;
cfg.ClockSource = RCC_RTCCLKSource_LSI;// RCC_RTCCLKSource_LSE RCC_RTCCLKSource_HSE_DIV128
cfg.Prescaler = 32767; // 1Hz
cfg.Counter = 0;
cfg.Alarm = 0;
LHL_RTC_Init(&cfg);
rtc_base_inited = 1;
void RTC_ALR_Init(void)
{
RTC_InitTypeDef RTC_InitStructure;
/* 1. <20><>ʼ<EFBFBD><CABC>RTC<54><43><EFBFBD><EFBFBD> */
RTC_InitStructure.ClockSource = RCC_RTCCLKSource_LSI; // RTCʱ<43><CAB1>ԴLSI
RTC_InitStructure.Prescaler = 32767; // RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) = 1S
RTC_InitStructure.Counter = 0; // <20><>0<EFBFBD><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
RTC_InitStructure.Alarm = 5-1; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>5S
LHL_RTC_Init(&RTC_InitStructure);
/* 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
LHL_RTC_ITConfig(RTC_IT_ALRIE, ENABLE);
NVIC_EnableIRQ(RTCAlarm_IRQn); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD>RTCAlarm_IRQn<51><6E><EFBFBD><EFBFBD>
}
/**------------------------------------------------------------------------
* @brief <20><><EFBFBD><EFBFBD> RTC <20><><EFBFBD>ж<EFBFBD>
* @note <20>״ε<D7B4><CEB5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Զ<EFBFBD>ִ<EFBFBD><D6B4> RTC_BaseInit() <20><><EFBFBD>ɻ<EFBFBD><C9BB><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
* Ȼ<><C8BB>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD> NVIC <20>ж<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>ص<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ɡ<EFBFBD>
* <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD>ɶ<EFBFBD><C9B6>ε<EFBFBD><CEB5>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>̬<EFBFBD><CCAC>־ȷ<D6BE><C8B7>ִֻ<D6BB><D6B4>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param <20><>
* @example StartRTC_SEC();
**/
void StartRTC_SEC(void)
{
static uint8_t sec_inited = 0;
if (sec_inited) return;
RTC_BaseInit();
LHL_RTC_ITConfig(RTC_IT_SECIE, ENABLE);
// NVIC_EnableIRQ(RTC_IRQn);
// NVIC_SetPriority(RTC_IRQn, 1);
sec_inited = 1 ;
}
/**------------------------------------------------------------------------
* @brief <20><><EFBFBD><EFBFBD> RTC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󴥷<EFBFBD><F3B4A5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>
* @param seconds: <20>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
* @note <20>״ε<D7B4><CEB5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Զ<EFBFBD>ִ<EFBFBD><D6B4> RTC_BaseInit()<29><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϡ<D0B6>
* <20>ڲ<EFBFBD><DAB2><EFBFBD>̬<EFBFBD><CCAC>־ȷ<D6BE><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִֻ<D6BB><D6B4>һ<EFBFBD>Ρ<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>жϵ<D0B6> NVIC ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>ص<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ɡ<EFBFBD>
* @example StartRTC_AlarmAfterSeconds(5); // 5 <20><><EFBFBD>󴥷<EFBFBD><F3B4A5B7><EFBFBD><EFBFBD><EFBFBD>
**/
void StartRTC_AlarmAfterSeconds(uint32_t seconds)
{
static uint8_t rtc_alrm_inited = 0;
if (!rtc_alrm_inited)
{
RTC_BaseInit();
LHL_RTC_ITConfig(RTC_IT_ALRIE, ENABLE);// ʹ<><CAB9> RTC <20><><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6>ע<EFBFBD>⣺SDK <20><><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD> EXTI_LINE_9<5F><39>
// NVIC_EnableIRQ(RTCAlarm_IRQn);// ʹ<><CAB9> NVIC <20>ж<EFBFBD>
// NVIC_SetPriority(RTCAlarm_IRQn, 0);
rtc_alrm_inited = 1;
}
uint32_t now = 0;
LHL_RTC_GetCounter(&now);
LHL_RTC_SetAlarm(now + seconds );
}
/*-=====================================================================================================
//RTC <20>жϻص<EFBFBD>
-=====================================================================================================*/
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϺ<D0B6><CFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */
static rtc_irq_callback_t rtc_sec_irq_callback,rtc_alarm_irq_callback ;
/**------------------------------------------------------------------------
* @brief ע<><D7A2> RTC <20>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
* @param rtc_irq_source: <20>ж<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ѡ RTC_SEC<45><43><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD> RTC_ALR<4C><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6>
* @param rtc_irq_callback: <20>û<EFBFBD><C3BB>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
* @note <20><><EFBFBD>ж<EFBFBD>ע<EFBFBD><D7A2>ʱ<EFBFBD><CAB1><EFBFBD>Զ<EFBFBD>ʹ<EFBFBD><CAB9> RTC_IRQn <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ע<EFBFBD><D7A2>ʱ<EFBFBD><CAB1><EFBFBD>Զ<EFBFBD>ʹ<EFBFBD><CAB9> RTCAlarm_IRQn <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>
* ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE>
* @example rtc_register_irq_callback(RTC_SEC, my_sec_callback);
**/
void rtc_register_irq_callback(RTC_IRQ_SOURCE_t rtc_irq_source ,rtc_irq_callback_t rtc_irq_callback)
{
if(rtc_irq_source == RTC_SEC)
{
rtc_sec_irq_callback = rtc_irq_callback;//<2F><>ֵ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
LHL_RTC_ClearPending(RTC_FLAG_SECF);// <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
NVIC_EnableIRQ(RTC_IRQn);
NVIC_SetPriority(RTC_IRQn, 1);
}
else if(rtc_irq_source == RTC_ALR)
{
rtc_alarm_irq_callback = rtc_irq_callback;
LHL_RTC_ClearPending(RTC_FLAG_ALRF); // <20><><EFBFBD><EFBFBD>RTC<54><43><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
NVIC_EnableIRQ(RTCAlarm_IRQn);// ʹ<><CAB9> NVIC <20>ж<EFBFBD>
NVIC_SetPriority(RTCAlarm_IRQn, 0);
}
}
/**------------------------------------------------------------------------
* @brief RTC <20><><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϺ<D0B6><CFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>
**/
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϺ<D0B6><CFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */
//<2F><><EFBFBD>ж<EFBFBD>
void RTC_IRQHandler(void)
{
uint32_t Time_Count;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>˻ص<CBBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
if (rtc_sec_irq_callback != NULL) rtc_sec_irq_callback();// <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>RTC<54><43><EFBFBD>жϱ<D0B6>־
//if (LHL_RTC_GetPending(RTC_FLAG_SECF) == SET)
LHL_RTC_ClearPending(RTC_FLAG_SECF); // <20><><EFBFBD><EFBFBD>RTC<54><43><EFBFBD>жϱ<D0B6>־
LHL_RTC_ClearPending(RTC_FLAG_OWF); // <20><><EFBFBD><EFBFBD>RTC<54><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
if (LHL_RTC_GetPending(RTC_FLAG_SECF) == SET)
{
// <20><><EFBFBD><EFBFBD>RTC<54><43><EFBFBD>жϱ<D0B6>־
LHL_RTC_ClearPending(RTC_FLAG_SECF);
// <20><>ȡ<EFBFBD><C8A1>ǰRTC <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ӡ
LHL_RTC_GetCounter(&Time_Count);
// printf("%d\n", Time_Count);
}
}
/**------------------------------------------------------------------------
* @brief RTC <20><><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>
**/
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
void RTCAlarm_IRQHandler(void)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>˻ص<CBBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
if (rtc_alarm_irq_callback != NULL) rtc_alarm_irq_callback();// <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
//if (LHL_RTC_GetPending(RTC_FLAG_ALRF) == SET)
LHL_RTC_ClearPending(RTC_FLAG_ALRF); // <20><><EFBFBD><EFBFBD>RTC<54><43><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
LHL_RTC_ClearPending(RTC_FLAG_OWF); // <20><><EFBFBD><EFBFBD>RTC<54><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
uint32_t Time_Count;
if (LHL_RTC_GetPending(RTC_FLAG_ALRF) == SET)
{
LHL_RTC_ClearPending(RTC_FLAG_ALRF); // <20><><EFBFBD><EFBFBD>RTC<54><43><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
LHL_RTC_GetCounter(&Time_Count); // <20><>ȡ<EFBFBD><EFBFBD>ǰRTC <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ
LHL_RTC_SetAlarm(Time_Count+4); // <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>ǰʱ<C7B0><CAB1>+5S
// printf("Alarm is ringing: %d\n", Time_Count);
}
}