你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMX + Nucleo-F031K6 图文Timer Demo

[复制链接]
fanyao-367090 发布时间:2016-7-24 16:43

在应用中,计时器的重要性就不多说了,这里我们用两种方式实现计时,一种是开一个通用定时器计时,另一种是系统自带的Systick计时器。

配置定时器的步骤可分为

1,选择一个定时器,选择计数时钟源来源

2,将时钟源设定分频系数后作为Timer的计数频率

3,设定计数周期、递增或递减计数。

4,开定时器,计时时间到之后触发中断,做相应处理。

- M2 d9 p  ?& i+ \# r6 B

下面用STM32CubeMX建立一个TIM2的Demo。

% q) a/ a8 I5 O

先用STM32CubeMX新建一个工程。

11.png


* Z. B3 n( L2 S$ C" X. m% a7 E6 g8 ]

可直接根据板子型号找到STM32F031K6这块板

12.png


0 f4 U. j% E6 {3 l1 M% U- S( F

在Pinout选项中,TIM2时钟源选择内部时钟,虽然Timer还有其他功能,但现在我们只做一个计时器。

13.png


+ k- k5 d7 Q' e" m! L& ^4 j

另外可设置RCC选择系统时钟源,系统时钟源默认为HSI,使用内部HRCOSC。

14.png

HES选择Bypass Clock Source 后时钟由外部输入,Nucleo-F031K6的外部时钟输入为另一片STM32芯片的MCO输出,此芯片的时钟为8MHz的晶振,精度和稳定度肯定比RC振荡要好。

15.png


7 E( O5 d+ S$ a

如果选择外部时钟输入,Nucleo-F031K6板上的SB4需要短接,默认是开路的。

16.png

我们这里先使用HSI作为系统时钟。

7 W; f" P7 Z9 s5 s. |: d" B0 @

板子上的绿色LED是PB3高电平驱动的,所以将PB3设置为Output模式,PB4/PB5也设置为输出,可以输出波形,方便测量定时时间。

17.png


9 d9 A  r# {" P

在Clock Configuration选项中,通过PLL将时钟都配置为最大48MHz... 任性^_^

18.png


4 G$ ~% R; H3 g/ i$ ?" H

在Configuration选项中,单击各个模块可以设置具体参数。

19.png

2 T. q+ |2 ^2 ~, i5 H! z

点击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。

20.png

GPIO中可将IO的输出速率设置为High

21.png


5 I8 @9 G8 i) R$ v# K. Q; F% P

NVIC中可将相应的中断开启。

22.png


) L, i. M6 M# p1 {  m

到这里,基本的模块设置都已完成。

生成Code之前在Project->Setting 中设置工程名和目录和编译器类型,

23.png

Project->Generate Code 即可导出工程了。可以直接用编译器打开。

24.png


9 ?: t* G# F% w0 ]8 K5 R

生成的工程先编译一次。

00.png

无误。接下里就是处理Timer中断中的事了,

在使用TIM2之前,先用一下Systick 计时器。

在stm32f0xx_it.C中可以看到 SysTick_Handler()子程序,

25.png


  a6 M. f8 v% d( r

  在HAL_IncTick();右键Go To Defin... 可以找到这个初始化程序。

26.png

在打开的stm32f0xx_hal.c文件中可以看到SysTick已经默认配置为了1ms时基。

27.png

! R* P1 t3 ^- {: Q$ G- a% b

同样Go to Defin... 找到 HAL_SYSTICK_IRQHandler(); 程序

28.png

HAL_SYSTICK_IRQHandler中是一个回调函数,下面是具体的函数内容

这里说到,需要使用这个函数时,需要在用户自己的文件中重新实现即可。所以这个函数可以Copy到main.c中,只要Systick中断后,就会执行这个函数。

我们在这个函数中翻转一个IO ,具体实现程序,HAL库都有提供。

29.png

编译,Download到31K6中,按复位按键。

可以看到输出为1ms翻转一次的波形。

30.png

同样的方法,找到TIM2的中断服务程序,在HAL_TIM_IRQHandler 中有一个TIM Updata event功能的子程序

31.png

再次找到这个回调函数。

32.png

Copy到main.c中。

001.png

在TIM2中断服务程序中再翻转一个IO,编译...No,TIM2中断还没打开,开之...

002.png

编译、Download、复位...

34.png

( Y+ C& Q2 S# e4 i- l

两个1ms翻转输出都出来了...

附件为Source Code 和Necleo-F031k6电路图及此博文的PDF档

STM32CubeMS F031k6 Timer Demo.pdf (1.14 MB, 下载次数: 36)

收藏 2 评论3 发布时间:2016-7-24 16:43

举报

3个回答
stary666 回答时间:2016-7-25 10:19:35
dark_ness 回答时间:2017-4-13 00:02:49
赞,感谢分享。
epochal 回答时间:2017-4-13 07:15:34
谢谢分享!!!
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版