实现现象
定时器每隔1s,就在OLED显示屏上加1.
实现步骤
(一)HAL库设置
1.配置时钟
主要是配置时钟。时钟这里还是老配置。
接着是配置时钟树。
因为我们是采用TIM2定时器,而且想让频率为72MHZ,那就要红圈地方为72MHZ.
为了让红圈为72MHZ,那就要选择PLL时钟也就是锁相环倍频输出。如下图红线所示。
为了让PLL为72MHZ,那就要选择外部时钟,且设置为8MHZ,放大9倍。
然后就配置完成了,下图是完成图:
2.配置OLED引脚
因为我现在在使用C8T6芯片,所以为了便于将OLED长期固定在一个地方,以后就将OLED的SCK设置为PB8、SDA设置为PB9。这两个引脚也是什么都不用改,只需要记住是低电平推挽输出就可以了。
3.配置TIM2
也是只需要改3个地方。预分频器为7200,计数模式为向上计数,自动重装寄存器设为10000.
详情请查看我之前写的固件库TIM部分。
因为我们这是要触发一个中断事件,就是计数每到1万次就触发一次中断,然后进入中断执行程序。
这里可以和EXTI对比理解:EXTI是外部触发中断,TIM是内部触发中断。
然后使能NVIC。
(二)编写代码
1.插入OLED函数
这就不细讲了。
2.TIM.c函数
TIM函数是直接以TIM命名的。
对于TIM.c函数,我们只需要改一个地方,那就是在初始化里面添加使能,告诉STM32我要使用TIM2了给我打开它。
HAL_TIM_Base_Start_IT(&htim2);
然后,除非是要变动预分频器和计数器的计数值,不然就不动它。因为函数都已经自动初始化完了。
3.编写定时器中断函数
现在就直接打开中断函数,因为我们是用的定时中断。
这个函数就是TIM2的定时中断函数,只要计数器计数到设定值,就执行这个函数。所以我们想要实现什么东西,直接在这里面弄就行了。
当然,一般都是直接用虚函数编写内容。因为这个函数内容就只有一行代码,而这一行代码又要执行一个虚函数,所以我们直接弄虚函数即可。
虚函数是HAL_TIM_PeriodElapsedCallback,这个函数在HAL_TIM_IRQHandler里面有。
如上图,虚函数代码意思为:只要中断一次,就记一次数。
我们在虚函数里面做了一个判断,这个判断是必须的,因为这个虚函数是供所有TIM定时器服务的,就是说只要是任意一个定时器中断了,就会执行这个函数。所以要在这里做一个判断,看看是哪个定时器来的中断。
htim->Instance ==TIM2
这个式子不用知道原理,直接拿来判断就是。
这个函数就是用来返回数字。
然后就完成了!