This commit is contained in:
2026-03-20 21:16:58 +08:00
parent 286ff98b8e
commit 90c3d919df
248 changed files with 94554 additions and 0 deletions

358
user/MCU/lhl_timer.c Executable file
View File

@@ -0,0 +1,358 @@
#include "../main/SystemInclude.h"
/*-=====================================================================================================
//TIMER1
-=====================================================================================================*/
/**------------------------------------------------------------------------
* @brief <20><><EFBFBD><EFBFBD>TIM1<4D><31><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><CAB1>
* @note ʱ<><CAB1>ԴΪAPB2_CLK<4C><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4>Ƶ<EFBFBD><C6B5>ʹ<EFBFBD><CAB9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ڽӽ<DABD>1ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ʽ (APB2_CLK/16000) <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ARR = 16 * uploadCounter ʵ<>֡<EFBFBD>
* uploadCounter <20><>ΧΪ 1~4000ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>޷<EFBFBD><DEB7><EFBFBD>
* @param uploadCounter: <20><><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (1~4000)
* @example: StartTimer1_UIE(10); // <20><><EFBFBD><EFBFBD>10ms<6D><73><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><CAB1>
**/
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);
}
/**------------------------------------------------------------------------
* @brief <20>޸<EFBFBD>TIM1<4D><31><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ģʽ<C4A3>Ķ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
* @note <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8>Զ<EFBFBD><D4B6><EFBFBD>װ<EFBFBD>ؼĴ<D8BC><C4B4><EFBFBD>ARR<52><52><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>Ԥ<EFBFBD><D4A4>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD>ڡ<EFBFBD><DAA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>CNT
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>
* @param uploadCounter: <20>µĶ<C2B5>ʱ<EFBFBD><CAB1><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (1~4000)
* @example: ResetTimer1_UIE(20); // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>Ϊ20ms
**/
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>
}
/**------------------------------------------------------------------------
* @brief <20><><EFBFBD><EFBFBD>TIM1<4D>Ƚ<EFBFBD>ģʽ<C4A3><CABD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚϣ<C8BD><CFA3>޵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note ʱ<><CAB1>ԴΪAPB2_CLK<4C><4B>Ԥ<EFBFBD><D4A4>Ƶ<EFBFBD><C6B5><EFBFBD>̶<EFBFBD>Ϊ251<35><31><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>װ<EFBFBD><D7B0>ֵ<EFBFBD>̶<EFBFBD>Ϊ64000<30><30>
* <20><><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>Ϊ APB2_CLK / (251+1) <20><> 16kHz<48><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 64000/16kHz = 4s<34><73>
* <20>Ƚ<EFBFBD>ֵ uploadCounter Ӧ<><D3A6> 1~64000 ֮<><EFBFBD><E4A3AC>Ӧ<EFBFBD>Ƚ<EFBFBD>ʱ<EFBFBD><CAB1>Ϊ uploadCounter / 16kHz <20><><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD>
* @param uploadCounter: <20>Ƚ<EFBFBD>ֵ (1~64000)<29><><EFBFBD><EFBFBD><E8BBBB>ΪĿ<CEAA><C4BF>ʱ<EFBFBD><CAB1> t(ms) = uploadCounter / 16
* @example: StartTimer1_CC1(320); // <20><><EFBFBD><EFBFBD><EFBFBD>Ƚ϶<C8BD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ֵ320<32><30>Ӧ20ms
**/
void StartTimer1_CC1(u16 uploadCounter)
{
if(uploadCounter>64000)uploadCounter = 64000;
if(uploadCounter<= 0)uploadCounter = 1;
TIM_InitTypeDef TIM_InitStructure;
// TIM_InitStructure.Period = 65535;
// TIM_InitStructure.Prescaler = 244;
TIM_InitStructure.Period = 64000;
TIM_InitStructure.Prescaler = 251;
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 */
}
/**------------------------------------------------------------------------
* @brief <20>޸<EFBFBD>TIM1<4D>Ƚ<EFBFBD>ģʽ<C4A3>ıȽ<C4B1>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±ȽϼĴ<CFBC><C4B4><EFBFBD>CCR1<52><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CNT<4E><54><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>αȽ<CEB1>ʱ<EFBFBD>̡<EFBFBD>
* <20>ʺ<EFBFBD>ʵ<EFBFBD>ֿɱ<D6BF><C9B1><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ơ<EFBFBD><C6A1><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD>жϱ<D0B6>־<EFBFBD><D6BE>ȷ<EFBFBD><C8B7><EFBFBD>±Ƚ<C2B1>ֵ<EFBFBD><D6B5>Ч<EFBFBD><D0A7>
* @param uploadCounter: <20>µıȽ<C4B1>ֵ (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>
**/
void ResetTimer1_CC1( u16 uploadCounter )
{
TIM1->CCR1 = uploadCounter;
TIM1->SR = (uint16_t)~TIM_IT_CC1;
LHL_TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
}
/**------------------------------------------------------------------------
* @brief ֹͣTIM1<4D><31>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* @note <20><><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TIM1<4D><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD>¡<EFBFBD><C2A1>Ƚ<EFBFBD>1/2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>NVIC<49><43>TIM1<4D><31><EFBFBD>ж<EFBFBD>ʹ<EFBFBD>ܡ<EFBFBD>
* @param <20><>
* @example: StopTimer1(); // ֹͣTIM1
**/
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 );
}
/*-=====================================================================================================
//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 );
}
/*-=====================================================================================================
//PWM<57><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
-=====================================================================================================*/
/**------------------------------------------------------------------------
* @brief PWM<57><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
* @note ʱ<><CAB1>Դ<EFBFBD><D4B4>APB2_CLK
* @param uploadCounter: PWM<57><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>λ<EFBFBD><CEBB>Hz <20><>Χ:(1~400)
duty :PWMռ<4D>ձ<EFBFBD> <20><>Χ:(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);
}
/*-=====================================================================================================
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD>жϻص<CFBB> - <20><>Դ֧<D4B4><D6A7>
-=====================================================================================================*/
// Ϊ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;
/**------------------------------------------------------------------------
* @brief Ϊָ<CEAA><D6B8><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6>ж<EFBFBD>Դע<D4B4><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
* @param timer: <20><>ʱ<EFBFBD><CAB1>ָ<EFBFBD><D6B8> (pTIM1 / pTIM2)
* @param it_flag: <20>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ȡֵΪ TIM_IT_UPDATE, TIM_IT_CC1, TIM_IT_CC2, TIM_IT_TRIGGER
* @param tim_irq_callback: <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EBA3AC>ΪNULL<4C><4C>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Դ<EFBFBD><D4B4>ע<EFBFBD><D7A2>
* @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ʹ<EFBFBD>ܶ<EFBFBD>Ӧ<EFBFBD><D3A6>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>NVIC<49>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δʹ<CEB4>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Դ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><E1B4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Դ<EFBFBD>ɶ<EFBFBD><C9B6><EFBFBD>ע<EFBFBD><EFBFBD><E1A3AC><EFBFBD><EFBFBD>Ӱ<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> it_flag <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮һ<D6AE><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>ͨ<EFBFBD><CDA8>switch<63><68><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ļص<C4BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD>ֵ<EFBFBD><D6B5>
* @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);
**/
void Timer_register_irq_callback(TIM_TypeDef *timer, uint16_t TIM_IT, timer_irq_callback_t tim_irq_callback)
{
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);
}
}
/**------------------------------------------------------------------------
* @brief TIM1ȫ<31><C8AB><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ֶ<EFBFBD>Դ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD>
* @note <20><>ȡTIM1<4D><31>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>SR<53><52>ͨ<EFBFBD><CDA8>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>жϲ<D0B6><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>¡<EFBFBD><C2A1>Ƚ<EFBFBD>1<EFBFBD><31><EFBFBD>Ƚ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD>ж<EFBFBD>Դ<EFBFBD><D4B4>ע<EFBFBD><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϿ<D0B6><CFBF><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD>if<69><66><EFBFBD><EFBFBD>
* <20>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>־λ<D6BE><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>SRд<52><D0B4>~irq_type<70><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE>
* <20><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϡ<D0B6>
* @see <20>жϱ<D0B6>־λ<D6BE><CEBB><EFBFBD><EFBFBD> TIM_IT_UPDATE (0x0001), TIM_IT_CC1 (0x0002), TIM_IT_CC2 (0x0004),
* TIM_IT_TRIGGER (0x0040)
**/
void TIM1_IRQHandler(void)
{
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;
}
/**------------------------------------------------------------------------
* @brief TIM2ȫ<32><C8AB><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ֶ<EFBFBD>Դ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD>
* @note ͬTIM1_IRQHandler<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TIM2<4D>ĸ<EFBFBD><C4B8>ж<EFBFBD>Դ<EFBFBD><D4B4>
**/
void TIM2_IRQHandler(void)
{
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;
}