2.3 双摇杆遥控器程序部分--stm32定时器应用

本文介绍了如何在CUBEMX中配置定时器,包括定时器的工作原理、频率计算、预分频和计数设置,以及如何在项目中使用定时器产生中断,提高程序效率。作者强调了定时器在项目中的重要性,并承诺加快更新进度以完成系列教程。
摘要由CSDN通过智能技术生成

一、摘要

  1. 上一章我们通过摇杆和电池的ADC采集学习了ADC的应用,这一章依然是我们本项目的第二大部分–程序部分,我们介绍一个非常关键常用外设定时器,它是我们整个程序的基础,提供系统时基,后面我们逐渐介绍它的用处;
  2. 工作的事情比较忙,所以更新比较慢,非常抱歉,这一章拖了这么久,相信许多同学已经通过自己的学习进度很快了,也欢迎补充你们的想法。

二、定时器介绍

我对于定时器的理解:

  1. 对于定时器,如果你第一次使用,或者不是很熟练,也不用担心,定时器如果讲完的话内容非常多,除了定时,还可以输出PWM,捕获输入波形等等。我也无法保证一次性讲清楚,即使讲完了,也不会一次性都掌握吸收,所以我们这里只讲一个定时器的理解概念,有了这个概念,本次项目就够用了,你也就知道定时器是一个什么样的机制了,如果想深入学习的也有许多主讲定时器的优秀文章视频,可以结合学习;

  2. 如何实现计时的呢?
    它其实是一个计数器,每隔一个计数时间周期计一个数,配置好时间周期和计数个数,他们的乘积就是计时时长;好,请记住我们接下来的目标就是获得计数周期计数个数

  3. 如何配置时间周期?
    时间周期与定时器的频率有关系,频率确定后,其倒数就是时间周期;

  4. 定时器频率(Tclk)来源是哪里呢?
    如下图1所示,黄色箭头路径蓝色箭头路径路径分别是系统时钟频率(这里配置为最高72MHz)走向定时器2、3、4和定时器1;我们对从系统时钟出来到定时器整个总线路径上的时钟变化逐个分析:

    • 我们系统时钟(SYSCLK)出来,首先经过AHB(Advanced High Performance Bus,高性能总线),这里可以选择AHB预分频器(AHB_Prescaler)的值进行(1,2,4,8,16)分频,我们选择1分频,所以从AHB出来频率为:72MHz/1=72MHz
    • AHB出来,我们发现,俩条时钟总线APB1和APB2(Advanced Peripheral Bus,高级外设总线)与其桥接,APB1和APB2分别连接了许多不同的外设,其中定时器2、3、4(Timer2、3、4)挂在APB1上;定时器1(Timer1)挂在APB2上;
    • 选择APB1预分频器(APB1_Prescaler)和APB2预分频器(APB2_Prescaler)的值分别可以进行(1、2、4、8、16)分频,由下图1我们发现从APB1出来最大频率可达36MHz所以我们这里在CUBEMX中配置2分频(默认值),所以从APB2出来的时钟频率为72MHz/2=36MHzAPB2出来最大为72MHz,所以我们可以配置1分频,从APB1出来的时钟频率为72MHz/1=72MHz
    • 如下图2,在到达定时器之前,都有一个自动倍频,他们的倍频条件是APB1预分频器(APB1_Prescaler)和APB2预分频器(APB2_Prescaler)的值,如果为1则进行1倍频,不为1,则2倍频,因为APB1_Prescaler我们选择2分频不为1,所以要进行2倍频,到达定时器2、3、4的频率为36MHz*2=72MHz;APB2_Prescaler我们选择1分频,所以要进行1倍频,到达定时器1(Timer1)的频率为72MHz*1=72MHz;综上,最终到达所有定时器的最大频率 (Tclk)都为72MHz
    • 之后再配置定时器的预分频器,所得出来的频率就是定时器的计时频率了(后面介绍CUBEMX配置部分会讲解配置和计算原理)。

在这里插入图片描述

图1 时钟树



在这里插入图片描述

图2 时钟树

  1. 如何获得计数周期?
    由4我们获得了到达定时器的时钟频率(Tclk),如果觉得上述内容太繁杂可以先不用追究,我们只要知道最后定时器获得的时钟频率为72MHz;如下图3,我们还要配置定时器自己的预分频器PSC(prescaler),再次对时钟频率分频,它是一个16位的数(0~65535),因为没有0分频,所以0表示1分频,1表示2分频,2表示3分频依次类推经过这里会进行(PSC+1)分频,计数频率为Tclk/(PSC+1),计数周期为其倒数(PSC+1)/Tclk;这里我们配置PSC为=71,计数周期 = (71+1)/72MHz = 1us

在这里插入图片描述

图3 定时器预分频器

  1. 如何配置计数个数呢?
    如下图4所示,我们配置自动重寄存器ARR(AutoReloadRegister)的值加一(因为从0开始算)就是计数的个数,那么定时器时间就是计数周期乘以计数个数(ARR+1),即为(ARR+1)(PSC+1)/Tclk;我们这里配置ARR为4999,则T=1us * (4999+1) = 5ms;
    在这里插入图片描述
图4 定时器自动重装值

  1. 其他的配置
  • 如下图5所示,计数模式(Counter Mode),表示计数器计数的方式,如UP表示从0向上计数,计数到arr的值后结束;Down表示从ARR向下计数,计数到0结束;数;我们这里选择UP模式

在这里插入图片描述

图5 定时器计数模式

  • 如下图6所示,自动重装载可以选择是否使能,Enable表示允许上面的计数值溢出(计数完成,计数arr次)后重新装载计数值,进入下一次计数;Disable则表示不允许重装计数;这也是为什么ARR叫自动重装寄存器;对应我们的配置就是计数4999次也就是5ms之后,重新计时下一个5ms,一直循环;

在这里插入图片描述

图6 定时器自动重使能

好,这大致是对定时器简单的理解和计算,有了这些理解我们接下来就可以在CubeMX里进行定时器的配置了

三、CUBEMX配置定时器

  1. 图7中就是我们的时钟配置,符合上述过程中的配置,最终到达定时器的时钟都是72MHz;注:如果是第一次配置,在HCLK(MHz)框中输入72,按回车就好啦
    在这里插入图片描述
图7 CubeMX时钟树配置页

  1. 每个定时的基础用法相同,我们这里使用定时器2(TIM2),循环定时5ms并且产生中断,通过以下问题我们来理解我们对定时器的配置
    根据上面的介绍,以及我们的需求,我们很容易完成以下配置,以及图中的五个步骤:
    • 预分频系数(PSC):71;
    • 计数方式:UP;
    • 自动重装值:4999;
    • 自动重装:使能;
    • 定时计算公式:T = (ARR+1)(PSC+1)/Tclk;
    • 带入公式:T = (4999+1) * (71+1) / 72MHz = 5ms;
      在这里插入图片描述
图8 定时器配置

  1. 配置中断

在这里插入图片描述

图8 定时器中断配置

  1. 更新代码:
    在这里插入图片描述

打开Keil工程,点击是,重新编译没问题就完成配置了;
在这里插入图片描述

四、定时器程序

  1. 打开Keil,我们可以发现定时器的初始化函数已经自动加入到main函数中:

在这里插入图片描述

  1. 开启定时器
    如下图中,我们使用中断,所以我们复制下面的启动定时器函数:
    在这里插入图片描述
    复制到main函数中:
    在这里插入图片描述

定时器开启函数:

HAL_TIM_Base_Start_IT(&htim2);
  1. 中断回调函数,与我们51单片机中中断服务函数一样,定时器产生中断后执行这里的程序;
    依旧打开之前的头文件可以找到中断回调函数,该函数是一个弱定义函数我们将他复制到mian.c文件中
    在这里插入图片描述
    因为它是一个弱定义函数,所以我们可以在这里重新定义:
    在这里插入图片描述
    将上一章我们的DMA_ADC开启函数写入这个函数:
    在这里插入图片描述

中断回调函数:

 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_Value,50);//启动DMA搬运ADC.	
}

while中运行以下程序:
在这里插入图片描述

死循环代码:

HAL_Delay(20);//延时
ADC1_Value_average();//计算ADC五个通道各采集十次的平均值
printf("%d,%d,%d,%d\r\n",left_x,left_y,right_x,right_y);//将俩个摇杆四个方向的数据打印出来
  1. 代码测试
    编译烧录程序,打开串口助手,我们发现可以收到数据,测试成功
    在这里插入图片描述

五、结语

  • 与上一章不同的是,上一章介绍串口时是将ADC开启函数写道while中延时20ms执行一次,并计算平均值,然后打印到串口;
  • 这一次ADC开启函数在定时器中断回调函数中执行,每5ms中断后执行一次,我们不需要再占用while(1)的运行时间;后面会继续介绍定时器在本项目中的作用,定时器和中断的有效利用可以提高我们整个程序的运行效率;
  • ok,定时器的介绍就到这里,非常感谢你的阅读,希望可以给你带来一点点帮助,如果有不正确的地方或者读起来很费劲的地方欢迎各位在评论区、或者私信指出,我们下一章再见
  • 再次对各位读者说声抱歉,工作之后,我对博客写作的时间分配太少了,更新的如此慢,我会加快更新的速度,抓紧完成遥控器这个专栏;
  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宏定义_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值