参考学习资料 单片机 nucleo_tutorial3.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

NUCLEO教程之三:定个时

好吧,我必须得承认,NUCLEO板子上的外设实在有限,能够玩的不多,所以我还在玩LED。只不过

这次我们用到定时器,让定时器控制LED来闪烁!

定时器的本质就是个计数器,先指定一个计数上限,然后让计数器开始计数,当计数值到达上限或下限

了,它再从头开始计数。只不过,当一轮计数完毕时,我们可以让MCU为我们做点事,比如打开或关

闭一个LED灯。就是这么简单!

实际上这个中间还有点绕,比如我们得指定计数器的工作频率,这就是定时器的预分频器;还有,计数

值到达上或下限时,你让定时器产生一个事件,还是让定时器产生一个中断,你得告诉定时器。然后设

计一个事件处理函数或中断处理函数,在里面完成要MCU完成的操作!就是这么多。

配置定时器的步骤:

1.选一个定时器来操作,有高级也有通用定时器,这里我们选TIM2,这是个通用定时器。

2.设置定时器的计数频率,也就是定时器的预分频器

3.指定计数上限

4.当计数器到达上或下限时,定时器产生事件还是中断

5.打开定时器

创建工程

选择定时器

在“组件及引脚”配置选项卡里,选择“TIM2”,配置如下:

这里只使用了定时器的基本功能,所以只要选择“时钟源”即可,别的功能后面再说。

这里我们还要参考两张图,一张图是TIM2到底挂在哪个APB总线上。

另一张图是TIM2所在的总线的时钟频率,因为后面计数定时器的工作频率时要用到这个数据。

这里可以看出NUCLEOF072RB就只有一个APB总线。

这张图来自STM32CubeMX的“时钟配置”选项卡,从这里看出TIM2在预分频之前的工作频率为

48MHz。

配置定时器

假设我们想让定时器每秒产生一个中断,应该如何计算定时器的预分频及计数值呢?

如果指定预分频器的值为48000,那么APB1的48MHz频率经48000分频之后的工作频率就是

1000,也就是所谓的1KHz。如果再指定计数值为1000的话,恰好就是1秒了。忘记那些计算公式吧,

这样算就很好。

为了加深印象,我们另外再选择一组参数来实现同样的效果。预分频器指定为24000,而计数器指定为

2000,定时器完成一轮计数所花的时间也是1秒。

下面的图显示了如何配置参数

为什么要减1呢,0到999不恰好就是1000个数么?

如果要产生中断的话,还要设置NVIC,如下图

功能代码

好了,生成工程文件后,我们要加入让TIM2工作的代码了,毕竟STM32CubeMX只是一个初始化器。

在main.c里面添加如下代码:

/*USERCODEBEGIN2*/

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET)

HAL_TIM_Base_Start_IT(htim2)

/*USERCODEEND2*/

先点亮LED灯,然后启动TIM2定时器,让它开始计数。

下面来处理中断函数。

首先要说明一个约定,STM32CubeMX使用的是新的HAL库,HAL库对中断及事件的处理采用的是

所谓回调机制。也就是说中断程序的框架已做好,且不能修改。那么如何加入用户代码呢,就是通过所

谓的回调函数来实现的。

打开stm32f0xx_it.c函数,会发现里面有一段这样的代码:

/**

*@briefThisfunctionhandlesTIM2globalinterrupt.

*/

voidTIM2_IRQHandler(void)

{

/*USERCODEBEGINTIM2_IRQn0*/

/*USERCODEENDTIM2_IRQn0*/

HAL_TIM_IRQHandler(htim2)

/*USERCODEBEGINTIM2_IRQn1*/

/*USERCODEENDTIM2_IRQn1*/

}

通过追踪代码,发现HAL_TIM_IRQHandler(htim2)的内容如下:

/**

*@briefThisfunctionhandlesTIMinterruptsrequests.

*@paramhtim:TIMhandle

*@retvalNone

*/

voidHAL_TIM_IRQHandler(TIM_HandleTypeDef*htim)

{

/*Capturecompare1ev

文档评论(0)

工地殿小二 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档