第十二届蓝桥杯嵌入式比赛准备(4)— 定时器基础

接下来就是定时器部分的内容。

定时器分为好几种,高级定时器TIM1和TIM8,通用定时器TIM2,TIM3,TIM4,TIM15,TIM16,TIM17,基本定时器TIM6和TIM7。

具体功能与不同可以参考一下数据手册。

一般我们只使用通用定时器。

比赛中一般会使用一个或者两个定时器,一个就很好理解,可能没有定时器的一些其他功能。两个就会涉及到其他功能,例如PWM输出、输入捕获、输出比较等等。

这次先准备基础功能,定时功能。

首先按照之前的配置好LED与按键。

然后点开左侧的Timers,选择时钟为内部时钟。然后配置分频为79分频,预装载值为999,此时定时器为1ms。

计算公式为 

t=\frac{(pre+1)(acc+1)}{80000000},其中80 000 000为系统时钟频率,pre为分频,acc为预装载值。

然后点击NVIC Settings,配置定时器中断,其实就是点一下,选上即可。

然后点击生成工程就配置好TIM2了。

打开工程后,进入到这个头文件中,最下面有一些定时器基础功能的函数。

带IT的就是可以操作中断的,带DMA的就是可以操作DMA的。

由于我们需要使用定时器中断,所以这里选择HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);来开启定时器中断,在最开始定义一次即可,不需要放在while(1)里。要注意写在begin和end中间哟。

现在需要开始写中断函数。

我们可以在stm32g4xxit.c中找到TIM2_IRQHandler();函数,这个就是TIM2的中断函数。但是HAL库帮我们封装好函数了,可以直接在回执函数里面写中断部分,而不用像标准库那样判断标志位。

首先我们需要找到这个函数。这是一个弱定义函数,可以重新写入内容。

这个标蓝色的就是我们需要使用的回执函数。

我们将回执函数写在main.c中。

如图所示,判断定时器的句柄htim的实体是TIM2,然后像这样编写函数即可。

这里是利用定时器每10ms将标志位置1,来处理按键部分。

按键部分如下段代码,相比于延时函数,定时器中断方法更加好,因此推荐使用定时器中断去判断按键。

也可以在定时中断里定义一些其他的东西,比如采样的时候,可以每500ms采集一次;或者可以利用定时器中断控制LED的状态等。

  while (1)
  {
    if(key_flag)
    {
      key_flag = 0;
      key_val = key_read();
      if(key_val == KB1_PRESS)
      {
        LED2_TOGGLE();
      }
      if(key_val == KB2_PRESS)
      {
        LED2_TOGGLE();
      }
      if(key_val == KB3_PRESS)
      {
        LED2_TOGGLE();
      }
      if(key_val == KB4_PRESS)
      {
        
      }
    }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值