STM32
直播中

ejlwj

8年用户 904经验值
擅长:处理器/DSP
私信 关注
[问答]

stm32L0定时器的配置过程是怎样的?

STM32L0定时器的配置过程是怎样的?

回帖(1)

张玉英

2021-11-24 10:27:02
MCU:stm32L0
主要搞清楚系统时钟,我在上文设置系统时钟为HSE(外部高速时钟),设置为8M。
//SYSCLK=Fs*PLLMUL/PLLDIV;
//Fu***=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++;
    }
}

举报

更多回帖

发帖
×
20
完善资料,
赚取积分