STM32 基本定时器

    小明妈妈跟小明说:“10分钟后,你再不给我去做作业我就揍你!”,接着,小明妈妈看着手表,1秒钟数1下,0,1,2,3,……,599。看看小明有没有做作业,根据情况判断要不要揍他。

    接着,小明妈妈又从0数起,到599,继续看看小明有没有做作业…… ……再数数…… ……

    于是,小明妈妈就是一个每隔10分钟监视一下小明有没有做作业的定时器,手表,就是小明妈妈定时器的时钟,小明妈妈数600个周期后(0~599),触发定时器中断,定时器中断里,判断小明有没有去做作业,没有,就揍他,有,就啥事也不做。

 

   STM32上的定时器,也是跟小明妈妈一样,是通过数数计时的,比如,数1个数是1秒,从0数到599,就是600秒(10分钟)了。

   STM32上的数数,可以正着数,从0~599,也可以倒着数,从599~0,还可以先正着数后倒着数,当然,小明妈妈也是可以的。

   那能不能不数600个数?数别的?可以的,只需要设置就行了。

   还能不能不1秒数一次,长一点或者短一点?也是可以的,只需要设置就行了。

   RM0033告诉我们,STM32F207有8个小明妈妈,TIM1~TIM8,资源非常丰富,当然,它也不仅仅只能用于数数,功能非常强大。

   为什么叫基本定时器呢?因为它们不仅用来计时,还有其他非常强大的功能,如PWM,脉宽测量等等。定时器,只是它的基本功能。

   我们今天,只讲数数功能,数到一定数后,就触发定时器中断,处理事件。换句话说,每隔一段特定的时间,触发特定的事件。

 

   我们就来做一个一秒的定时器吧,每隔1秒打印定时器开启时间。

 

    先打开Stm32CubeMx,新建一个工程,不懂建工程的请参考《STM32CubeMx 创建第一个工程》。

    建完之后,看TIMx(x=1,2,3……),这就是定时器。

    这里面有各种需要设置的地方,Slave Mode、Trigger Source、Clock Source、等等等。

   这是啥?看不懂,怎么办(黑人问号)???


 

    没关系,问一下RM0033,找到相关的部分,看介绍。

    它告诉我们,定时器包含16Bit自动重载计数器,由可编程预分频器组成。抱歉,翻译不是我的特长,大家大概看得懂意思就行啦。它还告诉我们,这些定时器有很多作用,像量输入信号脉冲宽度或者输出波形等等。还讲了脉宽测量的范围,从微秒级到毫秒级的。还说这几个小明妈妈是完全独立的,不过她们可以同步,具体的要参考一下Section 13.3.20

点到13.3.20,定时器可以连在一块,具体参考14.3.15。

 

    点到14.3.15,当一个定时器配置成Master Mode时,它能够复位,开始,停止,或者作为另外一个被配置成Slave Mode的定时器的时钟。

    由此可见,Slave Mode,主要用在两个以上的定时器上,具体有兴趣的朋友可以继续往下看资料,这里就不截图出来。

    它有Reset Mode、GateMode、Trigger Mode、External Clock Mode几种模式。

    我们这章节,不需要用到Slave Mode,所以,就选择 Disable。

 

    Trigger Source 选择,里面有ITR0、1、2、3等项目,怎么选择呢?

    ClockSource 选择,里面有Internal Clock,ETR,怎么选择呢?

    Channel1、2、3、4,以及以下的,如何设置呢?

    先来看一个图:

    图中标的1、2、3,就是Timer的ClockSource。

    图中标的4、5,是定时器的其它功能,如Pwm,脉宽测量等功能,我们这节课暂时不需要关注它。

 

再来看看 Clock selection 的说明:

### STM32 基本定时器使用方法与原理 STM32基本定时器(Basic Timer),也称为 TIM6 和 TIM7,在内部结构上较为简单,主要用于时间测量和产生延时功能。这类定时器不具备输入捕获、输出比较等功能。 #### 定时器工作模式 基本定时器通过计数预装载寄存器中的数值来实现定时操作。当计数器达到自动重装载寄存器中设定的最大值时,会产生更新事件并重新从0开始计数[^1]。 ```c // 初始化TIM6作为基本定时器 void MX_TIM6_Init(void) { __HAL_RCC_TIM6_CLK_ENABLE(); // 使能TIM6时钟 TIM_HandleTypeDef htim6; htim6.Instance = TIM6; htim6.Init.Period = 999; // 自动重装载值设置为999 htim6.Init.Prescaler = 8399; // 预分频系数设为8399, 即APB1频率除以8400 htim6.Init.ClockDivision = 0; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&htim6); // 初始化定时器基类成员函数 } ``` 上述代码配置了一个基于向上计数模式的定时器实例 `htim6` ,其中 Period 参数决定了定时周期长度;Prescaler 则用于调整实际的工作频率。 #### 中断处理机制 为了响应定时溢出中断请求,需编写相应的回调服务程序: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6){ /* 用户自定义的功能 */ } } /* 在启动文件内声明弱函数覆盖默认版本 */ __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){} ``` 每当发生一次满量程溢出后就会触发该ISR入口点执行特定任务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值