个人觉得ST的库函数用起来还是挺不错的,之前都是使用自己写的函数,容易改出错,以下是验证过的,TIM1定时100微妙中断一次。
void TIM1_TimeBaseInit(u16 TIM1_Prescaler,
TIM1_CounterMode_TypeDef TIM1_CounterMode,
u16 TIM1_Period,
u8 TIM1_RepetitionCounter)
{
/* Check parameters */
assert_param(IS_TIM1_COUNTER_MODE_OK(TIM1_CounterMode));
/* Set the Autoreload value */
TIM1->ARRH = (u8)(TIM1_Period >> 8);
TIM1->ARRL = (u8)(TIM1_Period);
/* Set the Prescaler value */
TIM1->PSCRH = (u8)(TIM1_Prescaler >> 8);
TIM1->PSCRL = (u8)(TIM1_Prescaler);
/* Select the Counter Mode */
TIM1->CR1 = (u8)(((TIM1->CR1) & (u8)(~(TIM1_CR1_CMS | TIM1_CR1_DIR))) | (u8)(TIM1_CounterMode));
/* Set the Repetition Counter value */
TIM1->RCR = TIM1_RepetitionCounter;
}
void TIM1_Cmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONALSTATE_OK(NewState));
/* set or Reset the CEN Bit */
if (NewState != DISABLE)
{
TIM1->CR1 |= TIM1_CR1_CEN;
}
else
{
TIM1->CR1 &= (u8)(~TIM1_CR1_CEN);
}
}
void TIM1_ITConfig(TIM1_IT_TypeDef TIM1_IT, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_TIM1_IT_OK(TIM1_IT));
assert_param(IS_FUNCTIONALSTATE_OK(NewState));
if (NewState != DISABLE)
{
/* Enable the Interrupt sources */
TIM1->IER |= (u8)TIM1_IT;
}
else
{
/* Disable the Interrupt sources */
TIM1->IER &= (u8)(~(u8)TIM1_IT);
}
}
void TIM1_TimerInit(u16 Timer1Time)
{
assert_param(IS_TIM1TIMERTIME_OK(Timer1Time));
TIM1_DeInit();//复位TIM1所有参数
TIM1_TimeBaseInit(TIM1_PRESCALER_16,TIM1_COUNTERMODE_DOWN,Timer1Time,0);
//TIM1的预分频器基于一个由16位寄存器
//选择16分频 16M/16=1M 周期为1us
TIM1_Cmd(ENABLE);//使能计时器
TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE);//使能TIM1中断
}
初始化时,调用
TIM1_TimerInit(100);//定时中断100微妙一次
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』