第一章我给大家讲解了关于STM32最基本的GPIO知识,这一章我给大家讲接一下定时器的知识。
什么是定时器?,它是类似于秒表样的东西,它是一个单片机用来计时的工具。
什么是中断?,中断好比你在做一件事情突然被另外一件事情打断,然后去做另外一件事情。等另外一件事情做完了以后,又回来做之前做的事情。比如我在炒菜突然开水壶开了,那么我就去先把火关了以后再回来炒菜。
我们可以通过定时器中断去做一些什么操作呢?,我们可以通过定时器去做一些规律性或者周期性活动。比如定时采集电压值、获取温湿度等一些需要实时监测的值。
下面我给大家来介绍一下定时器的内部配置。
一、准备工作
这里我们要想配置定时器并验证需要的准备工作如下:
1、MDK for ARM(KEIL5)或者IAR FOR ARM(这个是软件必备开发平台)
2、一块STM32最小系统开发板(这个是验证软件的平台)
3、这里最好有一本关于STM32学习的书籍(这里就不推荐了,网上有一大把)
4、万用表(测试硬件是否正常工具)
二、具体的操作
1、工程建立
这里我们需要一个根据自己的开发板配套的基础工程。工程建立就不多说了可以参考我的STM32CUBUMX工程建立博客,或者用其它的Demo例程。定时器配置参考例程
2、定时器初始化配置
下面我给大家分享一部分代码。
htim1.Instance = TIM1;
htim1.Init.Prescaler = 7200-1;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 10000-1;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
从上面代码我们可以看到HAL库里面的定时器1(TIM1)配置,首先
1)htim1.Instance = TIM1;
这句话是外设设备选择定时器1。
2)htim1.Init.Prescaler = 7200-1;
这里是设置定时器的分频系数,这里取决於单片机的时钟线给定时器分配的时钟。我们单片机配置的是72M主频,这里我们要把定时器分频为10K的时钟频率,这样方便我们计算定时器的具体定时时间。
3)htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
这里设定的是定时器的计数模式,TIM_COUNTERMODE_UP这个是指向上计数。
4)htim1.Init.Period = 10000-1;
这里是设置的定时器向上计数的最大值。这里设置的10K,意思是计数10k才触发一次中断,而定时器时钟也是10K,所以这里定时的时间是1秒钟。
5)htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
这里也是设置时钟分频系数,我们这里填写TIM_CLOCKDIVISION_DIV1是代表不分频。
6)htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
这里设置的是定时器自动重装他的上限值,因为每定时完成一次中断他的htim1.Init.Period会清零,如果想要不停地产生1S的定时器中断,这里必须设置成TIM_AUTORELOAD_PRELOAD_ENABLE使能定时器自动重装。
3、定时器使用
定时器是以中断的方式去使用的代码如下:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim1.Instance)
{
LED ^= 1;
}
}
这里是给大家粘贴了HAL库里面的定时器中断。
我这里中断处理是将LED这个变量异或去反,这里大家可以去自己设定想要的功能哦。
4、总结
总的来说,定时器配置在STM32里面比较的简单易懂。希望大家认真读懂我写的文章,玩转STM32还是没问题的!~
有问题欢迎加 QQ:380390633,乐意给大家答疑~