在应用中,计时器的重要性就不多说了,这里我们用两种方式实现计时,一种是开一个通用定时器计时,另一种是系统自带的Systick计时器。 配置定时器的步骤可分为 1,选择一个定时器,选择计数时钟源来源 2,将时钟源设定分频系数后作为Timer的计数频率 3,设定计数周期、递增或递减计数。 4,开定时器,计时时间到之后触发中断,做相应处理。
下面用STM32CubeMX建立一个TIM2的Demo。
先用STM32CubeMX新建一个工程。
0
|
|
|
|
可直接根据板子型号找到STM32F031K6这块板
|
|
|
|
|
在Pinout选项中,TIM2时钟源选择内部时钟,虽然Timer还有其他功能,但现在我们只做一个计时器。
|
|
|
|
|
另外可设置RCC选择系统时钟源,系统时钟源默认为HSI,使用内部HRCOSC。
|
|
|
|
|
HES选择Bypass Clock Source 后时钟由外部输入,Nucleo-F031K6的外部时钟输入为另一片STM32芯片的MCO输出,此芯片的时钟为8MHz的晶振,精度和稳定度肯定比RC振荡要好。
|
|
|
|
|
如果选择外部时钟输入,Nucleo-F031K6板上的SB4需要短接,默认是开路的。
我们这里先使用HSI作为系统时钟。
|
|
|
|
|
板子上的绿色LED是PB3高电平驱动的,所以将PB3设置为Output模式,PB4/PB5也设置为输出,可以输出波形,方便测量定时时间。
|
|
|
|
|
在Clock Configuration选项中,通过PLL将时钟都配置为最大48MHz... 任性^_^
|
|
|
|
|
在Configuration选项中,单击各个模块可以设置具体参数。
|
|
|
|
|
点击TIM2,因为TIM2是在APB总线上,所以要按照APB的时钟设置参数,现在APB是48MHz, 配置TIM2为1ms时基,先将TIM2的计时时钟分频为1MHz,再计数1000,得到的计数频率即为1Khz。具体Prescaler = (48 000 000H/1 000 000)-1 = 47,Counter Period = 1000 - 1 = 999. 计数方向为Up。
|
|
|
|
|
GPIO中可将IO的输出速率设置为High
|
|
|
|
|
NVIC中可将相应的中断开启。
|
|
|
|
|
到这里,基本的模块设置都已完成。 生成Code之前在Project->Setting 中设置工程名和目录和编译器类型,
|
|
|
|
|
[size=0.83em]23.png (49.27 KB, 下载次数: 0)
下载附件
[color=rgb(153, 153, 153) !important]昨天 16:36 上传
Project->Generate Code 即可导出工程了。可以直接用编译器打开。
|
|
|
|
|
生成的工程先编译一次。
无误。接下里就是处理Timer中断中的事了, 在使用TIM2之前,先用一下Systick 计时器。 在stm32f0xx_it.C中可以看到 SysTick_Handler()子程序,
|
|
|
|
|
在HAL_IncTick();右键Go To Defin... 可以找到这个初始化程序。
在打开的stm32f0xx_hal.c文件中可以看到SysTick已经默认配置为了1ms时基。
|
|
|
|
|
同样Go to Defin... 找到 HAL_SYSTICK_IRQHandler(); 程序 [size=0.83em]28.png (27.02 KB, 下载次数: 0)
下载附件
[color=rgb(153, 153, 153) !important]昨天 16:37 上传
HAL_SYSTICK_IRQHandler中是一个回调函数,下面是具体的函数内容 这里说到,需要使用这个函数时,需要在用户自己的文件中重新实现即可。所以这个函数可以Copy到main.c中,只要Systick中断后,就会执行这个函数。
|
|
|
|
|
我们在这个函数中翻转一个IO ,具体实现程序,HAL库都有提供。
编译,Download到31K6中,按复位按键。
|
|
|
|
|
可以看到输出为1ms翻转一次的波形。
|
|
|
|
|