Files
CHJ/user/MCU/lhl_lptimer.c

196 lines
6.6 KiB
C
Raw Permalink Normal View History

2026-03-20 21:16:58 +08:00
#include "../main/SystemInclude.h"
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief LPTimer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD> LPTIM_CLK_ENABLE_LSE <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Ԥ<EFBFBD><EFBFBD>Ƶϵ<EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>Ϊ DIV2<EFBFBD><EFBFBD>LSI <EFBFBD><EFBFBD> LSE Ƶ<EFBFBD>ʳ<EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>
* @param lptimer: LPTIM1 <EFBFBD><EFBFBD> LPTIM2
* @example <EFBFBD>ڲ<EFBFBD>ʹ<EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD>
2026-03-20 21:16:58 +08:00
**/
static void LPTIM_Init(LPTIM_TypeDef *lptimer)
{
LPTIM_InitTypeDef LPTIM_InitStructure; /* 1. <20><>ʼ<EFBFBD><CABC>LPTimer Base */
LPTIM_InitStructure.Mode = LPTIM_MODE_TIMER_COUNTER; // <20><>ʱ<EFBFBD><CAB1>ģʽ
#if LPTIM_CLK_ENABLE_LSE
LHL_RCC_LSEConfig(ENABLE);
LPTIM_InitStructure.Clock = LPTIM_CLOCKSOURCE_LSE; // LPTIMʱ<4D><CAB1>ԴLSE
#else
2026-03-20 21:19:53 +08:00
LHL_RCC_LSEConfig(DISABLE);
2026-03-20 21:16:58 +08:00
LPTIM_InitStructure.Clock = LPTIM_CLOCKSOURCE_LSI; // LPTIMʱ<4D><CAB1>ԴLSI
#endif
2026-03-20 21:19:53 +08:00
LPTIM_InitStructure.Prescaler = LPTIM_PRESCALER_DIV2; // Ԥ<><D4A4>Ƶϵ<C6B5><CFB5>2 <20><><EFBFBD><EFBFBD> 16384 Ϊ1s
LPTIM_InitStructure.FreeRunning = DISABLE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
2026-03-20 21:16:58 +08:00
LHL_LPTIM_Init(lptimer, &LPTIM_InitStructure);
}
2026-03-20 21:19:53 +08:00
2026-03-20 21:16:58 +08:00
/*==================================================================================*/
/*LPTimer1==========================================================================*/
/*==================================================================================*/
2026-03-20 21:19:53 +08:00
2026-03-20 21:16:58 +08:00
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> LPTIM1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* @note ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>Ϊ 32768Hz<EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD>Ƶ DIV2 <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ϊ 16384Hz<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ uploadCounter = (16384/1000) * t(ms) = 16.384 * t
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> t=125ms<EFBFBD><EFBFBD>uploadCounter<EFBFBD><EFBFBD>2048<EFBFBD><EFBFBD>
* @param uploadCounter: <EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ 1~65535<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @example StartLPTimer1(2048); // <20><><EFBFBD><EFBFBD> 125ms <20><><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><CAB1>
2026-03-20 21:16:58 +08:00
**/
void StartLPTimer1(u16 uploadCounter)//125ms 250ms ......
{
/* 1. <20><>ʼ<EFBFBD><CABC>LPTimer Base */
LHL_LPTIM_DeInit(LPTIM1);
LPTIM_Init(LPTIM1);
/* 2. <20><><EFBFBD><EFBFBD>LPTimer<65>ж<EFBFBD> */
LHL_LPTIM_ITConfig(LPTIM1, ENABLE);
NVIC_EnableIRQ(LPTIM1_IRQn);
/* 3. <20><><EFBFBD><EFBFBD>LPTimer1 */
2026-03-20 21:19:53 +08:00
LHL_LPTIM_Start(LPTIM1, uploadCounter);
2026-03-20 21:16:58 +08:00
}
2026-03-20 21:19:53 +08:00
2026-03-20 21:16:58 +08:00
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> LPTIM1 <EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>޸ģ<EFBFBD>
* @note <EFBFBD><EFBFBD>ͣ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±Ƚ<EFBFBD>ֵ CMR<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param uploadCounter: <EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>ֵ <EFBFBD><EFBFBD><EFBFBD>ʽ16.384 * t
* @example ResetLPTimer1(4096); // <20><><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>Ϊ 250ms
2026-03-20 21:16:58 +08:00
**/
void ResetLPTimer1(u16 uploadCounter)
{
LPTIM1->CSR &= ~LPTIM_CSR_TEN_Msk;// 1. <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
LPTIM1->CSR |= LPTIM_CSR_TCF_Msk; // 2. <20><><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD>жϱ<D0B6>־
LPTIM1->CMR = uploadCounter; // 3. <20><><EFBFBD><EFBFBD><EFBFBD>µıȽ<C4B1>ֵ
LPTIM1->CSR |= LPTIM_CSR_TEN_Msk; // 4. <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><>ʼ
}
2026-03-20 21:19:53 +08:00
/**------------------------------------------------------------------------
* @brief ֹͣ LPTIM1
* @note <EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>λ TEN <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @example StopLPTimer1();
**/
void StopLPTimer1(void)
{
LPTIM1->CSR &= ~LPTIM_CSR_TEN_Msk;// 1. <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
LPTIM1->CSR |= LPTIM_CSR_TCF_Msk; // 2. <20><><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD>жϱ<D0B6>־
}
2026-03-20 21:16:58 +08:00
/*==================================================================================*/
2026-03-20 21:19:53 +08:00
/*LPTimer2==========================================================================*/
2026-03-20 21:16:58 +08:00
/*==================================================================================*/
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> LPTIM2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* @note ͬ LPTIM1<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> 32768Hz<EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD>Ƶ DIV2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>
* @param uploadCounter: <EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>ֵ
* @example StartLPTimer2(2048); // <20><><EFBFBD><EFBFBD> 125ms <20><><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><CAB1>
2026-03-20 21:16:58 +08:00
**/
void StartLPTimer2(u16 uploadCounter)//125ms 250ms ......
{
2026-03-20 21:19:53 +08:00
/* 1. <20><>ʼ<EFBFBD><CABC>LPTimer Base */
LHL_LPTIM_DeInit(LPTIM2);
LPTIM_Init(LPTIM2);
/* 2. <20><><EFBFBD><EFBFBD>LPTimer<65>ж<EFBFBD> */
LHL_LPTIM_ITConfig(LPTIM2, ENABLE);
2026-03-20 21:16:58 +08:00
NVIC_EnableIRQ(LPTIM2_IRQn);
/* 3. <20><><EFBFBD><EFBFBD>LPTimer1<72><31>2 */
2026-03-20 21:19:53 +08:00
LHL_LPTIM_Start(LPTIM2, uploadCounter);
2026-03-20 21:16:58 +08:00
}
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> LPTIM2 <EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>޸ģ<EFBFBD>
* @param uploadCounter: <EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>ֵ <EFBFBD><EFBFBD><EFBFBD>ʽ16.384 * t
* @example ResetLPTimer2(4096);
2026-03-20 21:16:58 +08:00
**/
void ResetLPTimer2(u16 uploadCounter)
{
LPTIM2->CSR &= ~LPTIM_CSR_TEN_Msk;// 1. <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
LPTIM2->CSR |= LPTIM_CSR_TCF_Msk; // 2. <20><><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD>жϱ<D0B6>־
LPTIM2->CMR = uploadCounter; // 3. <20><><EFBFBD><EFBFBD><EFBFBD>µıȽ<C4B1>ֵ
LPTIM2->CSR |= LPTIM_CSR_TEN_Msk; // 4. <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><>ʼ
}
2026-03-20 21:19:53 +08:00
/**------------------------------------------------------------------------
* @brief ֹͣ LPTIM2
* @example StopLPTimer2();
**/
void StopLPTimer2(void)
{
LPTIM2->CSR &= ~LPTIM_CSR_TEN_Msk;// 1. <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
LPTIM2->CSR |= LPTIM_CSR_TCF_Msk; // 2. <20><><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD>жϱ<D0B6>־
}
2026-03-20 21:16:58 +08:00
/*==================================================================================*/
2026-03-20 21:19:53 +08:00
/*<2A>͹<EFBFBD><CDB9>Ķ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>====================================================================*/
2026-03-20 21:16:58 +08:00
/*==================================================================================*/
2026-03-20 21:19:53 +08:00
2026-03-20 21:16:58 +08:00
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief ע<EFBFBD><EFBFBD> LPTIM1/LPTIM2 <EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param lptimer: LPTIM1 <EFBFBD><EFBFBD> LPTIM2
* @param lptim_irq_callback: <EFBFBD>û<EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>޲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
* @note ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ע<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NVIC <EFBFBD>жϡ<EFBFBD>
* @example lptimer_register_irq_callback(LPTIM1, my_callback);
2026-03-20 21:16:58 +08:00
**/
static lptimer_irq_callback_t lptim1_irq_callback,lptim2_irq_callback ;
void lptimer_register_irq_callback(LPTIM_TypeDef *lptimer ,lptimer_irq_callback_t lptim_irq_callback)
{
if(lptimer == LPTIM1)
{
lptim1_irq_callback = lptim_irq_callback;//<2F><>ֵ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
LHL_LPTIM_ClearPending(LPTIM1);// <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
NVIC_EnableIRQ(LPTIM1_IRQn);//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
}
else if(lptimer == LPTIM2)
{
lptim2_irq_callback = lptim_irq_callback;
LHL_LPTIM_ClearPending(LPTIM2);// <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
NVIC_EnableIRQ(LPTIM2_IRQn);
}
}
2026-03-20 21:19:53 +08:00
/**------------------------------------------------------------------------
* @brief LPTIM1 <EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>Ļص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
**/
2026-03-20 21:16:58 +08:00
void LPTIM1_IRQHandler(void)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>˻ص<CBBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
if (lptim1_irq_callback != NULL) lptim1_irq_callback();// <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
LHL_LPTIM_ClearPending(LPTIM1); // <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
}
2026-03-20 21:19:53 +08:00
/**------------------------------------------------------------------------
* @brief LPTIM2 <EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>Ļص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
**/
2026-03-20 21:16:58 +08:00
void LPTIM2_IRQHandler(void)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>˻ص<CBBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
if (lptim2_irq_callback != NULL) lptim2_irq_callback();// <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
LHL_LPTIM_ClearPending(LPTIM2); // <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
}