stm32L0(二) 定时器配置

MCU:stm32L0

主要搞清楚系统时钟,我在上文设置系统时钟为HSE(外部高速时钟),设置为8M。

//SYSCLK=Fs*PLLMUL/PLLDIV;
//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));
//SYSCLK = 
//Fs 8M 
//Fvco: 8M
//SYSCLK: 系统时钟频率 8*8/2=32
//PLLMUL:倍频 8
//PLLDIV:分频系数 2 

以上配置,设置AHB为 32M,AHB1为4M,AHB2为32M

通用定时器时钟为AHB1时钟的2倍,8M。

可以由如下公式计算定时时间,假设定时时间为10s,设置计数值(Period)为9999,

则计数频率为(计数值+1)/(计数值)=1000Hz

分频系数(Prescaler )为定时器时钟(8M)/计数频率 = 分频系数+1,为7999。

配置定时器代码如下:

TIM_HandleTypeDef TIM2_Handler;      //定时器句柄 


void TIM2_Init(void)            //定时10s
{
    TIM2_Handler.Instance = TIM2;
    TIM2_Handler.Init.Prescaler = 7999;
    TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
    TIM2_Handler.Init.Period = 9999;
    TIM2_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&TIM2_Handler);
    
    HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE   
    
}


//定时器底册驱动,开启时钟,设置中断优先级
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM2)
    {
        __HAL_RCC_TIM2_CLK_ENABLE();            //使能TIM3时钟
        HAL_NVIC_SetPriority(TIM2_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
        HAL_NVIC_EnableIRQ(TIM2_IRQn);          //开启ITM3中断   
    }
}

//定时器2中断服务函数
void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM2_Handler);
}


uint16_t sec_10 = 0;

//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim==(&TIM2_Handler))
    {
//        LED1=!LED1;        //LED1反转    
        sec_10++;
    }
}
 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值