实验内容:使用基本定时器,实现LED灯以1S间隔进行亮灭切换。
一、原理图
二、 CubeMX配置
Step1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。
Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。
Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)
Step4.配置时基以及定时器中断。
到这里关于定时器参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。
三、添加功能代码
首先在主函数中开启定时器,并使能定时器中断(更新中断),并在while(1)循环中添加一个判断语句,在定时器中断1000次以后,进行LED灯电平的翻转,并将中断计数清零。
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM6_Init();
__HAL_TIM_CLEAR_IT(&htim6,TIM_IT_UPDATE);//清除中断标志位,防止一使能定时器就进入中断
HAL_TIM_Base_Start_IT(&htim6);//开启定时器,并使能定时器中断(更新中断)
while (1)
{
if(cnt==1000)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
cnt=0;
}
}
}
回调函数,主要是用来计录定时器中断的次数,与while(1)循环中的判断语句相呼应。从而实现定时器计时1S,LED灯状态切换一次的效果。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
cnt++;//记录定时器中断的次数
}
定时器注意要点在于时基的配置。 这里我们先了解几个参数和概念。
定时器的定时时间等于计数器的中断周期乘以中断的次数。
定时器的时钟:TIMxCLK
计数器时钟:CK_CNT
预分频数:PSC
定时器周期:
ARR(
注意:这里的周期指的不是时间而是计数个数!!!计数器能计数的最大数值,有时候这里很容易混淆
)
计数器的时钟频率等于定时器的时钟频率除以预分频数:
TIMxCLK/(PSC+1)
计数器计一个数的时间等于计数器时钟频率的倒数:
(PSC+1)/TIMxCLK
产生一次中断的时间(中断周期)则等于计一个数的时间乘以计数的个数(定时器周期
): (ARR+1)*(PSC+1)/TIMxCLK
如果在中断服务程序里面设置一个变量 time
,用来记录中断的次数,那么就可以计算出我们需要的定时时间等于:
time*(ARR+1)*(PSC+1)/TIMxCLK