Files
CHJ/user/MCU/lhl_timer.c

359 lines
14 KiB
C
Raw Normal View History

2026-03-20 21:16:58 +08:00
#include "../main/SystemInclude.h"
/*-=====================================================================================================
//TIMER1
-=====================================================================================================*/
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>TIM1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><EFBFBD>
* @note ʱ<EFBFBD><EFBFBD>ԴΪAPB2_CLK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽӽ<EFBFBD>1ms<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD>ʽ (APB2_CLK/16000) <EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ARR = 16 * uploadCounter ʵ<EFBFBD>֡<EFBFBD>
* uploadCounter <EFBFBD><EFBFBD>ΧΪ 1~4000ms<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD>
* @param uploadCounter: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (1~4000)
* @example: StartTimer1_UIE(10); // <20><><EFBFBD><EFBFBD>10ms<6D><73><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><CAB1>
2026-03-20 21:16:58 +08:00
**/
void StartTimer1_UIE(u16 uploadCounter)
{
if(uploadCounter>4000)uploadCounter = 4000;
if(uploadCounter<= 0)uploadCounter = 1;
u32 APB2_CLK = LHL_RCC_GetPCLK2Freq();
u32 prescaler = (APB2_CLK / 16000UL) - 1; //<2F>̶<EFBFBD><CCB6><EFBFBD>Ƶϵ<C6B5><CFB5> (APB1_CLK / 32000UL) - 1;
u32 period =(u32)(16UL * uploadCounter);//<2F><>̬ARR<52><52><EFBFBD><EFBFBD> (uint32_t)(32000UL * uploadCounter) / 1000UL;
TIM_InitTypeDef TIM_InitStructure;
TIM_InitStructure.Period = period;
TIM_InitStructure.Prescaler = prescaler;
TIM_InitStructure.ClockDivision = TIM_CKD_DIV1;
TIM_InitStructure.CounterMode = TIM_COUNTERMODE_UP;
TIM_InitStructure.AutoReloadPreload = ENABLE;
LHL_TIM_Init(TIM1, &TIM_InitStructure);
/*ʹ<><CAB9>TIM1<4D><31><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>UIE */
LHL_TIM_ITConfig(TIM1, TIM_IT_UPDATE, ENABLE);
NVIC_EnableIRQ(TIM1_IRQn);
NVIC_SetPriority(TIM1_IRQn,1);
LHL_TIM_Start(TIM1);
}
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>TIM1<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>ARR<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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CNT
* <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 uploadCounter: <EFBFBD>µĶ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (1~4000)
* @example: ResetTimer1_UIE(20); // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>Ϊ20ms
2026-03-20 21:16:58 +08:00
**/
void ResetTimer1_UIE( u16 uploadCounter )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(uploadCounter>4000)uploadCounter = 4000;
if(uploadCounter<= 0)uploadCounter = 1;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ARR<52><52>ֵ
u32 period =(u32)(16UL * uploadCounter); //PSC<53><43><EFBFBD>䣬ARR<52><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD>StartTimer1<72><31>ͬ
TIM1->CNT = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ARR<52><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LHL_TIM_ClearPending(TIM1, TIM_IT_UPDATE);//<2F><>ǰCNT<4E>Ѿ<EFBFBD><D1BE>ӽ<EFBFBD><D3BD>򳬹<EFBFBD>ARR<52><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
TIM1->ARR = (u16)period ; //<2F>޸<EFBFBD>ARR <20><><EFBFBD><EFBFBD>PSC<53><43>Ҫ<EFBFBD>ı<C4B1><E4A3AC><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
LHL_TIM_Start(TIM1); //ȷ<><C8B7><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
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>TIM1<EFBFBD>Ƚ<EFBFBD>ģʽ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚϣ<EFBFBD><EFBFBD>޵<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note ʱ<EFBFBD><EFBFBD>ԴΪAPB2_CLK<EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>Ϊ251<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>ֵ<EFBFBD>̶<EFBFBD>Ϊ64000<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>Ϊ APB2_CLK / (251+1) <EFBFBD><EFBFBD> 16kHz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 64000/16kHz = 4s<EFBFBD><EFBFBD>
* <EFBFBD>Ƚ<EFBFBD>ֵ uploadCounter Ӧ<EFBFBD><EFBFBD> 1~64000 ֮<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ƚ<EFBFBD>ʱ<EFBFBD><EFBFBD>Ϊ uploadCounter / 16kHz <EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD>
* @param uploadCounter: <EFBFBD>Ƚ<EFBFBD>ֵ (1~64000)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪĿ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> t(ms) = uploadCounter / 16
* @example: StartTimer1_CC1(320); // <20><><EFBFBD><EFBFBD><EFBFBD>Ƚ϶<C8BD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ֵ320<32><30>Ӧ20ms
2026-03-20 21:16:58 +08:00
**/
void StartTimer1_CC1(u16 uploadCounter)
{
2026-03-20 21:19:53 +08:00
if(uploadCounter>64000)uploadCounter = 64000;
if(uploadCounter<= 0)uploadCounter = 1;
2026-03-20 21:16:58 +08:00
TIM_InitTypeDef TIM_InitStructure;
2026-03-20 21:19:53 +08:00
// TIM_InitStructure.Period = 65535;
// TIM_InitStructure.Prescaler = 244;
TIM_InitStructure.Period = 64000;
TIM_InitStructure.Prescaler = 251;
2026-03-20 21:16:58 +08:00
TIM_InitStructure.ClockDivision = TIM_CKD_DIV1;
TIM_InitStructure.CounterMode = TIM_COUNTERMODE_UP;
TIM_InitStructure.AutoReloadPreload = DISABLE;
LHL_TIM_Init(TIM1, &TIM_InitStructure);
TIM1->CCR1 = uploadCounter;
TIM1->CNT = 0;
LHL_TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);/* ʹ<><CAB9>TIM1<4D>Ƚ<EFBFBD><C8BD>ж<EFBFBD>CC1 */
NVIC_EnableIRQ(TIM1_IRQn);
NVIC_SetPriority(TIM1_IRQn, 1);
LHL_TIM_Start(TIM1); /* <20><><EFBFBD><EFBFBD>TIM1 */
}
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>TIM1<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>CCR1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CNT<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>
* @param uploadCounter: <EFBFBD>µıȽ<EFBFBD>ֵ (1~64000)
* @example: ResetTimer1_CC1(327 + TIM1->CNT); // <20>ڵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱԼ20ms<6D><73><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
2026-03-20 21:16:58 +08:00
**/
void ResetTimer1_CC1( u16 uploadCounter )
{
TIM1->CCR1 = uploadCounter;
TIM1->SR = (uint16_t)~TIM_IT_CC1;
LHL_TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
}
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 ֹͣTIM1<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>TIM1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¡<EFBFBD><EFBFBD>Ƚ<EFBFBD>1/2<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>TIM1<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʹ<EFBFBD>ܡ<EFBFBD>
* @param <EFBFBD><EFBFBD>
* @example: StopTimer1(); // ֹͣTIM1
2026-03-20 21:16:58 +08:00
**/
void StopTimer1(void)
{
LHL_TIM_Stop(TIM1);
NVIC_DisableIRQ( TIM1_IRQn );
LHL_TIM_ClearFlag(TIM1, TIM_IT_UPDATE|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_TRIGGER);
LHL_TIM_ITConfig( TIM1, TIM_IT_UPDATE|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_TRIGGER, DISABLE );
}
2026-03-20 21:19:53 +08:00
2026-03-20 21:16:58 +08:00
/*-=====================================================================================================
//TIMER2
-=====================================================================================================*/
void StartTimer2_UIE(u16 uploadCounter)
{
if(uploadCounter>4000)uploadCounter = 4000;
if(uploadCounter<= 0)uploadCounter = 1;
u32 APB1_CLK = LHL_RCC_GetPCLK1Freq();
u32 prescaler = (APB1_CLK / 16000UL) - 1; //<2F>̶<EFBFBD><CCB6><EFBFBD>Ƶϵ<C6B5><CFB5> (APB1_CLK / 32000UL) - 1;
u32 period =(u32)(16UL * uploadCounter);//<2F><>̬ARR<52><52><EFBFBD><EFBFBD> (uint32_t)(32000UL * uploadCounter) / 1000UL;
TIM_InitTypeDef TIM_InitStructure;
TIM_InitStructure.Period = period;
TIM_InitStructure.Prescaler = prescaler;
TIM_InitStructure.ClockDivision = TIM_CKD_DIV1;
TIM_InitStructure.CounterMode = TIM_COUNTERMODE_UP;
TIM_InitStructure.AutoReloadPreload = ENABLE;
LHL_TIM_Init(TIM2, &TIM_InitStructure);
/*ʹ<><CAB9>TIM1<4D><31><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>UIE */
LHL_TIM_ITConfig(TIM2, TIM_IT_UPDATE, ENABLE);
NVIC_EnableIRQ(TIM2_IRQn);
NVIC_SetPriority(TIM2_IRQn, 1);
LHL_TIM_Start(TIM2);
}
void ResetTimer2_UIE(u16 uploadCounter)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(uploadCounter>4000)uploadCounter = 4000;
if(uploadCounter<= 0)uploadCounter = 1;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ARR<52><52>ֵ
u32 period =(u32)(16UL * uploadCounter); //PSC<53><43><EFBFBD>䣬ARR<52><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD>StartTimer1<72><31>ͬ
TIM2->CNT = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ARR<52><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LHL_TIM_ClearPending(TIM2, TIM_IT_UPDATE);//<2F><>ǰCNT<4E>Ѿ<EFBFBD><D1BE>ӽ<EFBFBD><D3BD>򳬹<EFBFBD>ARR<52><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
TIM2->ARR = (u16)period ; //<2F>޸<EFBFBD>ARR <20><><EFBFBD><EFBFBD>PSC<53><43>Ҫ<EFBFBD>ı<C4B1><E4A3AC><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
LHL_TIM_Start(TIM2); //ȷ<><C8B7><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
void StopTimer2(void)
{
LHL_TIM_Stop(TIM2);
NVIC_DisableIRQ( TIM2_IRQn );
LHL_TIM_ClearFlag(TIM2, TIM_IT_UPDATE|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_TRIGGER);
LHL_TIM_ITConfig( TIM2, TIM_IT_UPDATE|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_TRIGGER, DISABLE );
}
2026-03-20 21:19:53 +08:00
/*-=====================================================================================================
//PWM<57><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
-=====================================================================================================*/
2026-03-20 21:16:58 +08:00
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief PWM<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
2026-03-20 21:16:58 +08:00
* @note ʱ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>APB2_CLK
* @param uploadCounter: PWM<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>Hz <EFBFBD><EFBFBD>Χ:(1~400)
duty :PWMռ<EFBFBD>ձ<EFBFBD> <EFBFBD><EFBFBD>Χ:(0-100)
* @example: StartTimer1_PWM(10,50); // <20><><EFBFBD><EFBFBD>10Hz(100ms)<29><><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><CAB1>,PWM<57><4D><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>50%
StartTimer1_PWM(400,50); //<2F><><EFBFBD><EFBFBD>400Hz(2.5ms)<29><><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><CAB1>,PWM<57><4D><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>50%
**/
void StartTimer1_PWM(u16 freq_hz , u16 duty)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_InitTypeDef TIM_InitStructure;
TIM_PWMInitTypeDef TIM_PWMInitStructure;
u32 APB2_CLK = LHL_RCC_GetPCLK2Freq();
u16 period =10000; //<2F>̶<EFBFBD>ARR<52><52><EFBFBD><EFBFBD>
u32 prescaler = (APB2_CLK /(period*freq_hz) )-1;
u16 dutyValue = period*duty/100;
/* 1. TIM1 ͨ<><CDA8>1 GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
GPIO_InitStructure.Pin = GPIO_PIN_5; // P0.5->TIM1 CHANNEL1
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Current = GPIO_CURRENT_16mA;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.SchmittTrigger = ENABLE;
GPIO_InitStructure.Alternate = GPIO0_5_AF_TIM1_CH1;
LHL_GPIO_Init(pGPIO0, &GPIO_InitStructure);
/* 2. TIM1 ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
TIM_InitStructure.Prescaler = prescaler; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>
TIM_InitStructure.Period = period-1; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TIM_InitStructure.ClockDivision = TIM_CKD_DIV1;
TIM_InitStructure.CounterMode = TIM_COUNTERMODE_UP;
TIM_InitStructure.AutoReloadPreload = ENABLE; // <20><><EFBFBD><EFBFBD>ARRԤ<52><D4A4><EFBFBD><EFBFBD>
LHL_TIM_Init(TIM1, &TIM_InitStructure);
/* 3. TIM1 ͨ<><CDA8>1<EFBFBD><31><EFBFBD><EFBFBD>PWM<57><4D><EFBFBD><EFBFBD> */
TIM_PWMInitStructure.Pulse = dutyValue; // <20><><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>
TIM_PWMInitStructure.PWMMode = TIM_PWMMODE_PWM1; // PWMģʽ1
TIM_PWMInitStructure.PWMPolarity = TIM_PWMPOLARITY_ACTIVE_HIGH; // PULSE<53>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>ƽ
TIM_PWMInitStructure.PWMPreload = ENABLE; // <20><><EFBFBD><EFBFBD>CCRԤ<52><D4A4><EFBFBD><EFBFBD>
TIM_PWMInitStructure.PWMFastMode = DISABLE;
LHL_TIM_PWM_Init(TIM1, &TIM_PWMInitStructure, TIM_CHANNEL_1);
/* 4. <20><><EFBFBD><EFBFBD>TIM1 <20><>PWM<57><4D><EFBFBD><EFBFBD> */
LHL_TIM_Start(TIM1);
}
void ResetTimer1_PWM(u16 duty)
{
//<2F>޷<EFBFBD>
if(duty > 100)duty = 100;
if(duty < 0)duty = 0;
u16 dutyValue = 100*duty ; //10000*duty/100;
//<2F><><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>
LHL_TIM_PWM_SetDutyCycle(TIM1, dutyValue, TIM_CHANNEL_1);
}
2026-03-20 21:19:04 +08:00
/*-=====================================================================================================
2026-03-20 21:19:53 +08:00
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD>жϻص<CFBB> - <20><>Դ֧<D4B4><D6A7>
2026-03-20 21:19:04 +08:00
-=====================================================================================================*/
2026-03-20 21:16:58 +08:00
2026-03-20 21:19:53 +08:00
// ΪTIM1<4D><31><EFBFBD>ж<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
static timer_irq_callback_t tim1_update_irq_callback = NULL; // <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB>
static timer_irq_callback_t tim1_cc1_irq_callback = NULL; // <20><><EFBFBD><EFBFBD>/<2F>Ƚ<EFBFBD>1<EFBFBD>жϻص<CFBB>
static timer_irq_callback_t tim1_cc2_irq_callback = NULL; // <20><><EFBFBD><EFBFBD>/<2F>Ƚ<EFBFBD>2<EFBFBD>жϻص<CFBB>
static timer_irq_callback_t tim1_trigger_irq_callback = NULL; // <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB>
// ΪTIM2<4D><32><EFBFBD>ж<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
static timer_irq_callback_t tim2_update_irq_callback = NULL;
static timer_irq_callback_t tim2_cc1_irq_callback = NULL;
static timer_irq_callback_t tim2_cc2_irq_callback = NULL;
static timer_irq_callback_t tim2_trigger_irq_callback = NULL;
2026-03-20 21:16:58 +08:00
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief Ϊָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>ж<EFBFBD>Դע<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param timer: <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD> (pTIM1 / pTIM2)
* @param it_flag: <EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡֵΪ TIM_IT_UPDATE, TIM_IT_CC1, TIM_IT_CC2, TIM_IT_TRIGGER
* @param tim_irq_callback: <EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ΪNULL<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>NVIC<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><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Դ<EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> it_flag <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>ͨ<EFBFBD><EFBFBD>switch<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ļص<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD>ֵ<EFBFBD><EFBFBD>
* @example:
* // ΪTIM1<4D><31><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ע<EFBFBD><D7A2><EFBFBD>ص<EFBFBD>
* Timer_register_irq_callback(pTIM1, TIM_IT_UPDATE, my_update_callback);
* // ΪTIM1<4D>Ƚ<EFBFBD>1<EFBFBD>ж<EFBFBD>ע<EFBFBD><D7A2><EFBFBD>ص<EFBFBD>
* Timer_register_irq_callback(pTIM1, TIM_IT_CC1, my_cc1_callback);
2026-03-20 21:16:58 +08:00
**/
2026-03-20 21:19:53 +08:00
void Timer_register_irq_callback(TIM_TypeDef *timer, uint16_t TIM_IT, timer_irq_callback_t tim_irq_callback)
2026-03-20 21:16:58 +08:00
{
2026-03-20 21:19:53 +08:00
if (timer == pTIM1) {
switch (TIM_IT) {
case TIM_IT_UPDATE: tim1_update_irq_callback = tim_irq_callback; break;
case TIM_IT_CC1: tim1_cc1_irq_callback = tim_irq_callback; break;
case TIM_IT_CC2: tim1_cc2_irq_callback = tim_irq_callback; break;
case TIM_IT_TRIGGER: tim1_trigger_irq_callback= tim_irq_callback; break;
default: return;
}
NVIC_EnableIRQ(TIM1_IRQn);
}
else if (timer == pTIM2) {
switch (TIM_IT) {
case TIM_IT_UPDATE: tim2_update_irq_callback = tim_irq_callback; break;
case TIM_IT_CC1: tim2_cc1_irq_callback = tim_irq_callback; break;
case TIM_IT_CC2: tim2_cc2_irq_callback = tim_irq_callback; break;
case TIM_IT_TRIGGER: tim2_trigger_irq_callback= tim_irq_callback; break;
default: return;
}
NVIC_EnableIRQ(TIM2_IRQn);
}
2026-03-20 21:16:58 +08:00
}
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief TIM1ȫ<EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ֶ<EFBFBD>Դ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD>ȡTIM1<EFBFBD><EFBFBD>״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>SR<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>1<EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>2<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>if<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>SRд<EFBFBD><EFBFBD>~irq_type<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>
* @see <EFBFBD>жϱ<EFBFBD>־λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> TIM_IT_UPDATE (0x0001), TIM_IT_CC1 (0x0002), TIM_IT_CC2 (0x0004),
* TIM_IT_TRIGGER (0x0040)
2026-03-20 21:16:58 +08:00
**/
void TIM1_IRQHandler(void)
{
2026-03-20 21:19:53 +08:00
uint16_t irq_type = TIM1->SR; // <20><>ȡ<EFBFBD>жϱ<D0B6>־
// <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>---------------------------------------
if ((irq_type & TIM_IT_UPDATE) && tim1_update_irq_callback != NULL) {
tim1_update_irq_callback();
}
// <20><><EFBFBD><EFBFBD>/<2F>Ƚ<EFBFBD>1<EFBFBD>ж<EFBFBD>---------------------------------
if ((irq_type & TIM_IT_CC1) && tim1_cc1_irq_callback != NULL) {
tim1_cc1_irq_callback();
}
// <20><><EFBFBD><EFBFBD>/<2F>Ƚ<EFBFBD>2<EFBFBD>ж<EFBFBD>---------------------------------
if ((irq_type & TIM_IT_CC2) && tim1_cc2_irq_callback != NULL) {
tim1_cc2_irq_callback();
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>---------------------------------------
if ((irq_type & TIM_IT_TRIGGER) && tim1_trigger_irq_callback != NULL) {
tim1_trigger_irq_callback();
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
TIM1->SR = (uint16_t)~irq_type;
2026-03-20 21:16:58 +08:00
}
/**------------------------------------------------------------------------
2026-03-20 21:19:53 +08:00
* @brief TIM2ȫ<EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ֶ<EFBFBD>Դ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD>
* @note ͬTIM1_IRQHandler<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TIM2<EFBFBD>ĸ<EFBFBD><EFBFBD>ж<EFBFBD>Դ<EFBFBD><EFBFBD>
2026-03-20 21:16:58 +08:00
**/
void TIM2_IRQHandler(void)
{
2026-03-20 21:19:53 +08:00
uint16_t irq_type = TIM2->SR;
if ((irq_type & TIM_IT_UPDATE) && tim2_update_irq_callback != NULL) {
tim2_update_irq_callback();
}
if ((irq_type & TIM_IT_CC1) && tim2_cc1_irq_callback != NULL) {
tim2_cc1_irq_callback();
}
if ((irq_type & TIM_IT_CC2) && tim2_cc2_irq_callback != NULL) {
tim2_cc2_irq_callback();
}
if ((irq_type & TIM_IT_TRIGGER) && tim2_trigger_irq_callback != NULL) {
tim2_trigger_irq_callback();
}
TIM2->SR = (uint16_t)~irq_type;
2026-03-20 21:16:58 +08:00
}