STM32定时器控制LED闪烁的实现方法

文章目录

  • 一、定时器介绍
  • 二、STM32C配置项目
  • 1.新建工程
  • 2.配置引脚
  • 3.配置SYS
  • 4.配置GPIO
  • 5.配置定时器
  • 6.配置中断
  • 7.时钟配置
  • 8.创建代码
  • 三、修改keil代码
  • 四、实物连线
  • 五、实验效果
  • 六、总结
  • 七、参考资料
  • 一、定时器介绍

    上来说就是用来定时的机器,是存在于STM32单片机中的一个外设。STM32总共有8个定时器,分别是2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM5、TIM6),如下图所示:

    这三种定时器的区别如下:

    STM3 的通用 TIMx (TIM2~TIM5 和 TIM9~TIM14)定时器功能包括:
    1.16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下自动装载计数器(TIMx_CNT),注意:TIM9~TIM14 只支持向上(递增)计数方式。
    2.16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~ 65535 之间的任意数值。
    3.4 个独立通道(TIMx_CH14,TIM9TIM14 最多 2 个通道),这些通道可以用来作为:
    A.输入捕获
    B.输出比较
    C.PWM 生成(边缘或中间对齐模式) ,注意:TIM9~TIM14 不支持中间对齐模式
    D.单脉冲模式输出
    4.可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
    5.如下事件发生时产生中断/DMA(TIM9~TIM14 不支持 DMA):
    A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    C.输入捕获
    D.输出比较
    E.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不支持)
    F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM14 不支持)

    二、STM32C配置项目

    1.新建工程


    2.配置引脚

    3.配置SYS

    4.配置GPIO

    5.配置定时器

    这里我们使用定时器2来实现定时的功能。如图所示,依次点击位置1,选中定时器2;位置2,配置定时器2的时钟源为内部时钟;位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。

    注:分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断。

    6.配置中断

    开启定时器2的中断

    生成定时器2中断优先级配置代码

    7.时钟配置

    8.创建代码


    三、修改keil代码

    生成工程后,打开,添加中断响应之后所需的一些代码。在main.c文件中添加如下内容,位置1:

    注:该函数表示启动相应的定时器,“h”表示HAL库,“tim2”表示定时器2。所以这行代码的意思就是启动定时器2。
    HAL_TIM_Base_Start_IT(&htim2);
    位置2:

    代码如下:

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	static uint32_t time_cnt =0;
    
    	if(htim->Instance == TIM2)
    	{
    		if(++time_cnt >= 100)
    		{
    			time_cnt =0;
    			HAL_GPIO_TogglePin(D1_GPIO_Port,D1_Pin);
    		}
    	}
    }
    

    该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。在函数内部定义了一个静态变量:time_cnt。当它大于等于100的时候,才会执行if里面的代码。也就是说需要发生100次中断,才会让LED的状态翻转。前面已经算过了,一次定时中断的时间是0.005秒,所以100次中断的时间是0.005*100=0.5秒。也就是说每隔0.5秒,LED的状态翻转一次。
    修改后,保存,编译、下载,重新上电。可以看到LED1差不多每隔0.5秒翻转一次,实现了我们想要的效果。

    四、实物连线

    五、实验效果

    VID_20221027_212402

    六、总结

    通过本次实验完成了利用定时器实现LED灯0.5秒周期闪烁,在学习定时器知识的同时也提高了动手能力。

    七、参考资料

    STM32CUBEMX_定时器控制LED闪烁
    STM32-定时器详解

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32定时器控制LED闪烁的实现方法

    发表评论