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++;
}
}
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++;
}
}
举报