【Day14】:STM32辗压Arduino的功能—TIM(上)

计时器 TIMER

今天开始我们要来使用STM32强大的功能之一 TIMER!
STM32F429ZI总共有14个计时器,这14个大致可以分为三种,通用定时器、基本定时器、高级定时器
https://ithelp.ithome.com.tw/upload/images/20210907/20141525NnE3UgDzfy.png
三种的差异在於通用定时器、高级定时器有些会有其他的功能,但我们现在先不详细介绍,先了解TIMER最基本的用法即可。由於这三种的本质上都是同样的东西,因此接下来的操作用哪一个TIMER都没有关系,只是设定的介面会有些微的不同。

计数器 counter

顾名思义就是一个计数的工具,他会从0开始往上数,只要到达设定的上限,他就会归零,并且重新计数。而不同的TIMER支援的counter有所不同,可以看上面的表格,有些可以设定往上数(count-up),或往下数(count-down)或先往上数再往下数(count-down)称作中心对齐模式。

PSC & ARR让你的时钟可快可慢

每一个timer都需要有一个时钟来源,我们暂时先记得timer1、8、9、10、11是来自APB1汇流排,其他的都是来自APB2,而这两个汇流排的频率在预设的情况下都是16MHz,可以在Clock configuration里面看到
https://ithelp.ithome.com.tw/upload/images/20210907/20141525HyigLCFbQI.jpg
接下来我们来介绍几个参数

  1. 分频数(Prescaler)
    而由於STM32的时钟预设是16MHz速度,太快了,我们难以使用,因此也就有了分频系数(Prescalar)的产生,分频就是将原来的频率降低为原来的1/N,而由上表可知STM所有时钟的分频系数皆为1~65536,但这里要注意,设定时的数值为(0~65535),当设为0时分频系数为1,频率不变
  2. 计数周期(counter period)又称为自动重载暂存器Auto reload register(ARR)
    当这个计数器数到这个数字时会自动归零,例如当你设为1000时,counter会从0~999,不会有1000

我们来实际操作看看吧~
首先一样来设定.ioc档

  1. 在Timers的选单里面选TIM2,在Clock source里面选Internal clock
    https://ithelp.ithome.com.tw/upload/images/20210907/20141525ybGs4uDmqw.jpg
  2. 底下参数的配置就调整PSC以及ARR,我们先把PSC设为15999,也就是分频数为16000让时钟的频率由原本的16MHz变为1kHz,而ARR设为10000,只要数到10000,就会归零(不会出现1000这个数字)。
  3. 这样就设定完成了,接下来来写程序
/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  x = __HAL_TIM_GET_COUNTER(&htim2);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

一样要记得设全域变数 x 才能使用现场表达式做监测
这里出现了两个新的函数我们来介绍一下吧

HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)

之後会大量的看到类似这种的函式HAL_XXX_Start,这种函式功能为让某种功能启用,以这里为例,他就是让TIMER开始计数。

__HAL_TIM_GET_COUNTER() 

这个函式的功能就是可以得到TIMER现在数到哪(也就是Counter的值)。而实际上,他不是普通的函式,他是用C语言#define的方式来定义的。定义如下:

#define __HAL_TIM_GET_COUNTER(__HANDLE__)  ((__HANDLE__)->Instance->CNT)

虽然他并不是一般的函式,但我们姑且称他为函式。这个函式在做的事情非常简单,我们会传进去一个__handle__结构的指标变数(htim2),而这个函式就负责找到这个结构变数底下的Instance的CNT变数。
我们可以在现场表达式输入htim2看一下里面的结构有哪些变数,
https://ithelp.ithome.com.tw/upload/images/20210907/20141525D8r8Qdkx0I.jpg

这个程序执行的时候我们就可以看到x不断的从0加到10000(单位为ms),可以试着拿手机的计时器来检验。

上数(count-up)、下数(count-down)、中心对齐(center-aligned)

我们就继续用这支程序来了解counter的其他设定
https://ithelp.ithome.com.tw/upload/images/20210907/201415258oUCdTNMnr.jpg
在这里可以更动计数的模式,用以下的图可以清楚地了解这三种计数模式的差别,由上到下依序为中心对齐、下数、上数
https://ithelp.ithome.com.tw/upload/images/20210907/20141525hblRk6dBLV.png
这三种模式目前对我们来说还没什麽用处,要等讲到PWM输出的时候才能了解意义,现在我们就知道他数的模式有这三种就好。
选项里面的center aligned有1、2、3
可以用上面的小程序来看一下x值的变化。

小结

今天简单的介绍了Timer最基本的使用,明天我们会加入中断的概念,来简单实作微秒级的delay(以前介绍的HAL_Delay()精度只能达到毫秒)


<<:  找LeetCode上简单的题目来撑过30天啦(DAY13)

>>:  Day-16 OS初体验

[前端暴龙机,Vue2.x 进化 Vue3 ] Day9.计算属性 computed

甚麽是计算属性? 甚麽时候用计算属性? 接下来带大家来看看,也会搭配一些例子~ 甚麽是计算属性? c...

Day 09: 机器学习你知多少?

人工智慧? 机器学习? 深度学习? 刚踏入机器学习的学生自然会对这些专有名词感到相当模糊,我们就先来...

Day 1 [Python ML] 30天内容介绍

简介 之前在kaggle上面学习到了很多Python应用在Machine Learning的方法 对...

Day 23 - Vue Router参数路由

昨天我们提到了如何透过Vue-Router切换页面,今天我们来谈谈如何传递参数到路由上。 new V...

Day09表单(HTML)

表单 原本介绍的标签都比较属於呈现给使用者 但是今天要介绍的表单呢就不仅是单单呈现而已 因为他会将使...