基于STM32G431嵌入式学习笔记——七、定时器定时

10 篇文章 11 订阅
8 篇文章 0 订阅
一、题目引入

在这里插入图片描述上述为第13届蓝桥杯省赛节选内容,为了研究定时器的机理并独立书写计时函数,上述内容简化为以下要求:

①按下B4按键,LD1点亮5s后熄灭
②按下B3按键,LD2以0.1秒为间隔切换亮灭状态

二、基础知识

定时器相关知识可以参考“STM32G4系列微控制器参考手册”
在这里插入图片描述

三、CubeMX配置

关于led、key、lcd的配置不再赘述,详细环境可见前三节内容:
基于STM32G431嵌入式学习笔记——一、LED模块入门
基于STM32G431嵌入式学习笔记——二、LCD模块入门
基于STM32G431嵌入式学习笔记——三、KEY按键入门
若先前已跟随教程配置过,可在配置完毕的环境下继续沿用:
在这里插入图片描述

打开CubeMX中的时钟树
在这里插入图片描述其中右上角,是我们各个部件的时钟频率,均为80MHz
在这里插入图片描述我们做一些简单的计算:
f = 80 M H z = 80 ∗ 1 0 6 H z 表示运行 1 s 的次数即计数量 f=80MHz=80*10^6Hz表示运行1s的次数即计数量 f=80MHz=80106Hz表示运行1s的次数即计数量

如果像题目所说的间隔5s,则需要运行多少次呢?
5 ∗ f = 4 ∗ 1 0 8 次 5*f = 4*10^8次 5f=4108
若以二进制计数,早已超过计数器的16位/32位,因此我们需要让时钟慢一点儿,计数次数少一点儿,即需要将系统时钟进行分频/降频
f = 80 ∗ 1 0 6 H z f=80*10^6Hz f=80106Hz,则 T ≈ 1 0 − 6 s T≈10^{-6}s T106s 1 μ s 1μs 1μs
我们可以将其改变成 T = 1 0 − 3 s T=10^{-3}s T=103s 1 m s 1ms 1ms
这里我们假设使用timer2(自己任选)
在这里插入图片描述在这里进行了第一次降频,从 80 ∗ 1 0 6 H z 80*10^6Hz 80106Hz降低为 80 ∗ 1 0 3 H z 80*10^3Hz 80103Hz(除以1000)
在这里插入图片描述在这里进行了第二次降频,从 80 ∗ 1 0 6 H z 80*10^6Hz 80106Hz降低为 1 ∗ 1 0 3 H z 1*10^3Hz 1103Hz(除以80)
即周期成功变为 1 m s 1ms 1ms,可以理解为计数器计数一次的时间为 1 m s 1ms 1ms
1 s 1s 1s计数器计数次数为1000, 0.1 s 0.1s 0.1s计数器计数次数为100,以此类推。


定时器实现功能的本质是中断,因此我们要配置中断优先级等内容:

在这里插入图片描述配置完毕,生成代码。

四、代码书写
1.打开工程,编译。

在这里插入图片描述

2.函数书写

(1)在主函数调用函数开启定时器中断
在这里插入图片描述函数位于stm32g4xx_hal_tim.c的470行左右
在这里插入图片描述(2)全局变量配置
在这里插入图片描述(3)相关头文件是否齐全
在这里插入图片描述(4)相关功能函数
记得养成好的习惯,将函数写在主函数之下:
在这里插入图片描述

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==TIM2)//是timer2,且过了1ms
  {
    if(led1_flag==1)//led1要用定时器了
    {
      led1_count++;
    }
    if(led2_flag==1)//led2要用定时器了
    {
      led2_count++;
    }
  }
}
void led_proc(void)//led1的控制函数
{
  if(led1_flag==1)
  {
    Control_LED(LED1,ON);
    if(led1_count>=5000)//计数5000,即亮了5s
    {
      led1_flag = 0;
      led1_count = 0;
      Control_LED(LED1,OFF);
    }
  }
}
void bulingbuling(void)//led2的闪烁函数
{
  if(led2_flag==1)
  {
    if(led2_count>=100)//0.1s
    {
      led2_count = 0;
      HAL_GPIO_TogglePin(GPIOC,LED2);//翻转
      HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
    }
  }
  else
  {
    Control_LED(LED2,OFF);
  }
}
void key_proc(void)
{
  char value = Key_Scan();
  switch(value)
  {
    case 3:
      led1_flag = 1;
      break;
    case 4:
      led2_flag = (led2_flag+1)%2;
      break;
  }
}

第一个函数名含有“Callback”,如果基础知识够扎实想必可以想到上一节我们遇到过串口中断的Callback,实际上该函数便是发生时钟中断后处理的函数(中断处理子程序)。
位于5920行左右
在这里插入图片描述
(5)主函数补充
在这里插入图片描述
编译+下载,程序结束。

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32G030是STMicroelectronics(意法半导体)公司推出的一款32位ARM Cortex-M0+微控制器。它具有低功耗、高性能和丰富的外设集成特点,适用于广泛的应用领域。 STM32G030的例程是为了帮助开发人员快速上手和学习如何在该控制器上进行编程而提供的示例代码。这些例程涵盖了不同的功能和应用场景,包括GPIO(通用输入输出)、USART(串行通信)、ADC(模数转换器)和定时器等。 通过阅读和理解这些例程,开发人员可以获得以下优势: 1. 学习如何配置和使用STM32G030的各种外设模块。 2. 掌握使用C编程语言开发嵌入式应用程序的基础知识。 3. 理解各种外设模块的工作原理和功能。 4. 获取与具体应用场景相关的最佳实践。 例程提供了可执行的代码示例,说明了如何初始化和配置外设模块、读取传感器数据、与外部设备进行通信等。开发人员可以根据自己的需求进行修改和扩展,以满足特定应用的要求。 此外,STMicroelectronics还提供了丰富的开发工具和资源,如集成开发环境(如STM32CubeIDE)、参考手册、应用笔记和视频教程等,这些都可帮助开发人员更好地理解和使用STM32G030例程。 总之,STM32G030的例程是一个非常有用的工具,它可以帮助开发人员快速入门,加快产品开发的速度,并提供了丰富的功能和灵活性来满足各种嵌入式应用的需求。 ### 回答2: STM32G030是STMicroelectronics(意法半导体)推出的一款高性能32位微控制器系列产品。它基于ARM Cortex-M0+内核,集成了丰富的外设和功能,适用于各种应用场景。 针对STM32G030芯片,STMicroelectronics提供了一系列的例程,旨在帮助开发者快速入门并熟悉其应用。这些例程覆盖了芯片的各种功能和外设,如引脚控制、时钟配置、IO口输入输出、串口通信、定时器等等。通过学习和了解这些例程,开发者可以更好地理解和使用STM32G030芯片。 例程通常由一段完整的源代码组成,开发者可以根据需要进行修改和调整。通过编译、下载和运行例程,开发者可以测试和验证芯片的性能和功能。此外,例程通常还提供了详细的说明文档,包括各种配置选项的解释和使用方法,帮助开发者更好地理解和使用芯片。 通过使用STM32G030例程,开发者可以快速上手和开发各种嵌入式应用。他们可以借鉴例程中的代码和配置,加速自己项目的开发进程。同时,例程的使用也有助于提高开发者的嵌入式开发能力和对STM32G030芯片的了解程度。 总之,STM32G030例程是STMicroelectronics为开发者提供的一种学习和使用STM32G030芯片的工具。通过学习例程,开发者可以快速入门并掌握芯片的各种功能和外设,进而开展自己的嵌入式项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值