2026-03-20 21:16:58 +08:00
|
|
|
|
#include "../main/SystemInclude.h"
|
|
|
|
|
|
|
|
|
|
|
|
/*-=====================================================================================================
|
|
|
|
|
|
//TIMER1
|
|
|
|
|
|
-=====================================================================================================*/
|
|
|
|
|
|
/**------------------------------------------------------------------------
|
2026-03-20 21:19:04 +08:00
|
|
|
|
* @brief ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
|
|
|
|
|
|
* @note ʱ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>APB2_CLK
|
|
|
|
|
|
* @param uploadCounter: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Χ:(1~4000)
|
|
|
|
|
|
* @example: StartTimer1(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:04 +08:00
|
|
|
|
* @brief ͨ<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>
|
|
|
|
|
|
* @note ʱ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>APB2_CLK
|
|
|
|
|
|
* @param uploadCounter: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Χ:(1~4000)
|
|
|
|
|
|
* @example: ResetTimer1_UIE(20); // <20><>ʱ<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:04 +08:00
|
|
|
|
* @brief ͨ<EFBFBD>ñȽ϶<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @note ʱ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>APB2_CLK
|
|
|
|
|
|
* @param uploadCounter: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ(1~65535)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ=65535/4000*t
|
|
|
|
|
|
* @example: StartTimer1(327); //<2F><><EFBFBD><EFBFBD>20ms<6D>Ƚ϶<C8BD>ʱ<EFBFBD><CAB1> 327=65535/4000*20
|
2026-03-20 21:16:58 +08:00
|
|
|
|
**/
|
|
|
|
|
|
void StartTimer1_CC1(u16 uploadCounter)
|
|
|
|
|
|
{
|
|
|
|
|
|
TIM_InitTypeDef TIM_InitStructure;
|
2026-03-20 21:19:04 +08:00
|
|
|
|
TIM_InitStructure.Period = 65535;
|
|
|
|
|
|
TIM_InitStructure.Prescaler = 244;
|
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:04 +08:00
|
|
|
|
* @brief ͨ<EFBFBD>ñȽ϶<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TIM1->CNT <EFBFBD><EFBFBD><EFBFBD>±Ƚ<EFBFBD>ֵ
|
|
|
|
|
|
* @note ʱ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>APB2_CLK
|
|
|
|
|
|
* @param uploadCounter: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ(1~65535)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ=65535/4000*t
|
|
|
|
|
|
* @example: ResetTimer1_CC1(327+TIM1->CNT); // <20>¸<EFBFBD>20ms<6D><73><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD>ж<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:04 +08:00
|
|
|
|
* @brief ͣ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* @note
|
|
|
|
|
|
* @param
|
|
|
|
|
|
* @example
|
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:04 +08:00
|
|
|
|
|
2026-03-20 21:16:58 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-=====================================================================================================
|
|
|
|
|
|
//TIMER2
|
|
|
|
|
|
-=====================================================================================================*/
|
2026-03-20 21:19:04 +08:00
|
|
|
|
/**------------------------------------------------------------------------
|
|
|
|
|
|
* @brief ͨ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
|
|
|
|
|
|
* @note ʱ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>APB1_CLK
|
|
|
|
|
|
* @param uploadCounter: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Χ:(1~4000)
|
|
|
|
|
|
* @example: StartTimer2(10); // <20><><EFBFBD><EFBFBD>10ms<6D><73><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
**/
|
2026-03-20 21:16:58 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
/**------------------------------------------------------------------------
|
|
|
|
|
|
* @brief ͨ<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>
|
|
|
|
|
|
* @note ʱ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>APB1_CLK
|
|
|
|
|
|
* @param uploadCounter: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Χ:(1~4000)
|
|
|
|
|
|
* @example: ResetTimer2_UIE(20); // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>Ϊ20ms
|
|
|
|
|
|
**/
|
2026-03-20 21:16:58 +08:00
|
|
|
|
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>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
/**------------------------------------------------------------------------
|
|
|
|
|
|
* @brief ͣ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* @note
|
|
|
|
|
|
* @param
|
|
|
|
|
|
* @example
|
|
|
|
|
|
**/
|
2026-03-20 21:16:58 +08:00
|
|
|
|
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:04 +08:00
|
|
|
|
* @brief <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
|
|
|
|
/*-=====================================================================================================
|
|
|
|
|
|
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD>жϻص<CFBB>
|
|
|
|
|
|
-=====================================================================================================*/
|
2026-03-20 21:16:58 +08:00
|
|
|
|
|
|
|
|
|
|
/**------------------------------------------------------------------------
|
2026-03-20 21:19:04 +08:00
|
|
|
|
* @brief <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>
|
|
|
|
|
|
* @note
|
|
|
|
|
|
* @param TIM_TypeDef *timer<EFBFBD><EFBFBD>pTIM1 pTIM2 <EFBFBD><EFBFBD> timer_irq_callback_t tim_irq_callback <EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @example: Timer_register_irq_callback(pTIM1,callback1);
|
2026-03-20 21:16:58 +08:00
|
|
|
|
**/
|
2026-03-20 21:19:04 +08:00
|
|
|
|
static timer_irq_callback_t tim1_irq_callback ,tim2_irq_callback;
|
|
|
|
|
|
void Timer_register_irq_callback(TIM_TypeDef *timer, timer_irq_callback_t tim_irq_callback)
|
2026-03-20 21:16:58 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
if(timer == TIM1) {tim1_irq_callback = tim_irq_callback; NVIC_EnableIRQ(TIM1_IRQn);}
|
|
|
|
|
|
else if(timer == TIM2) {tim2_irq_callback = tim_irq_callback; NVIC_EnableIRQ(TIM2_IRQn);}
|
2026-03-20 21:16:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-20 21:16:58 +08:00
|
|
|
|
/**------------------------------------------------------------------------
|
2026-03-20 21:19:04 +08:00
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><EFBFBD>1<EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @note <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>
|
|
|
|
|
|
* TIM_IT_UPDATE
|
|
|
|
|
|
* TIM_IT_CC1
|
|
|
|
|
|
* TIM_IT_CC2
|
|
|
|
|
|
* TIM_IT_TRIGGER
|
2026-03-20 21:16:58 +08:00
|
|
|
|
**/
|
|
|
|
|
|
void TIM1_IRQHandler(void)
|
|
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
uint16_t irq_type = TIM1->SR ; //<2F>жϱ<D0B6>־
|
|
|
|
|
|
|
|
|
|
|
|
if (irq_type & TIM_IT_CC1) { // <20><><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD>ж<EFBFBD>
|
|
|
|
|
|
if (tim1_irq_callback != NULL) tim1_irq_callback();// <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TIM1->SR = (uint16_t)~irq_type; //<2F><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
|
|
|
|
|
|
/*
|
|
|
|
|
|
if (LHL_TIM_GetPending(TIM1, TIM_IT_UPDATE)== SET) // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>TIM1 Update<74>ж<EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
LHL_TIM_ClearPending(TIM1, TIM_IT_UPDATE); // <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
|
|
|
|
|
|
}
|
|
|
|
|
|
if (LHL_TIM_GetPending(TIM1, TIM_IT_CC1) == SET) // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>TIM1 CC1<43>ж<EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
LHL_TIM_ClearPending(TIM1, TIM_IT_CC1); // <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
|
|
|
|
|
|
}
|
|
|
|
|
|
if (LHL_TIM_GetPending(TIM1, TIM_IT_CC2) == SET)
|
|
|
|
|
|
{
|
|
|
|
|
|
LHL_TIM_ClearPending(TIM1, TIM_IT_CC2);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (LHL_TIM_GetPending(TIM1, TIM_IT_TRIGGER) == SET)
|
|
|
|
|
|
{
|
|
|
|
|
|
LHL_TIM_ClearPending(TIM1, TIM_IT_TRIGGER);
|
|
|
|
|
|
}
|
|
|
|
|
|
*/
|
2026-03-20 21:16:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**------------------------------------------------------------------------
|
2026-03-20 21:19:04 +08:00
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><EFBFBD>2<EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD>
|
2026-03-20 21:16:58 +08:00
|
|
|
|
**/
|
|
|
|
|
|
void TIM2_IRQHandler(void)
|
|
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
uint16_t irq_type = TIM2->SR ; //<2F>жϱ<D0B6>־
|
|
|
|
|
|
|
|
|
|
|
|
if (tim2_irq_callback != NULL) tim2_irq_callback();// <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
TIM2->SR = (uint16_t)~irq_type; //<2F><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
|
|
|
|
|
|
|
2026-03-20 21:16:58 +08:00
|
|
|
|
}
|
2026-03-20 21:19:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|