当前位置: 首页 > article >正文

STM32-笔记16-定时器中断点灯

一、实验目的

        使用定时器 2 进行中断点灯,500ms LED 灯翻转一次。

二,定时器溢出时间计算

Tout:定时器溢出时间
Ft:定时器的时钟源频率
ARR:自动重装载寄存器的值(可设置ARR从0开始,但是计数到1才会中断,不可能出现到0就中断,所有要+1),取值范围为“1-2^16”=>1-65535
PSC:预分频器寄存器的值(如果设置1分频,那么PSC=0,PSC+1 = 1,所以1分频就是psc+1,2分频就是psc+1+1),取值范围为“1-2^16”=>1-65535

 Ft/(psc+1) = 分频之后的时钟频率,而周期等于频率的倒数,所以1个计数周期,也就是1个计数的时间等于(psc+1)/Ft

(ARR+1) = 需要记多少个数

个数*时间 = (ARR+1)*(psc+1)/Ft = 定时器溢出时间

注意:一般情况下,我们喜欢把(psc+1)设置成Ft的倍数,所以当Ft是72(MHZ)时,(psc+1)=7200(注意取值范围哦)

例如,要定时 500ms,则:Ft=72M;PSC=7199(喜欢设置成倍数),则:ARR=4999;

倒推:72M = 72000 000

(5000*7200)/72000 000 = 5/10 = 0.5s = 500ms

三、定时器中断实验配置步骤

        msp 函数是对 MCU 相关的硬件进行初始化设置,通常被设计用于处理特定硬件外设或功能的底层初始化工作

四、开始配置

复制项目文件03-流水灯,重命名为17-定时器中断点灯

在Drivers\BSP目录下,新建文件夹timer,timer.c和timer.h

加载文件

编译

编译

代码:

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "timer.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    led_init();//初始化led灯
    timer_init(5000-1,7200-1);
//    led1_ON();
//    led1_OFF();
    while(1)
    { 
     
    }
}

timer.c

#include "timer.h"
#include "led.h"

TIM_HandleTypeDef timer_handle = {0};//定义结构体

//定时器初始化函数
void timer_init(uint16_t arr,uint16_t psc)//把ARR和PSC当作参数传进来
{
    timer_handle.Instance = TIM2; //选择使用的定时器
    timer_handle.Init.Prescaler = psc; //PSC
    timer_handle.Init.Period = arr; //ARR
    timer_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//配置成向上的,默认向上的
    timer_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;  //自动重装载,默认自动重装载
    
    HAL_TIM_Base_Init(&timer_handle);
    HAL_TIM_Base_Start_IT(&timer_handle);//设置使能更新中断,和启动计数器
}

//msp函数
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        __HAL_RCC_TIM2_CLK_ENABLE();
        HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//设置优先级
        HAL_NVIC_EnableIRQ(TIM2_IRQn);//设置使能中断
    }
}

//中断服务函数 
void TIM2_IRQHandler(void)
{
    //一般还会调用一个公共处理的服务函数
    HAL_TIM_IRQHandler(&timer_handle); 
    
}
//更新中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        led1_Toggle();
    }
}

timer.h

#ifndef  __TIMER_H__
#define __TIMER_H__


#include "sys.h"

void timer_init(uint16_t arr,uint16_t psc);

#endif


http://www.kler.cn/a/458309.html

相关文章:

  • overleaf中出现TeX capacity exceeded PDF object stream buffer=5000000的原因和解决方案
  • pandas df 如何 输出数据到 sqlite3
  • Android studio-SDK无法安装的问题
  • LeetCode:3083. 字符串及其反转中是否存在同一子字符串(哈希 Java)
  • VM虚拟机配置ubuntu网络
  • 机器人C++开源库The Robotics Library (RL)使用手册(三)
  • 小程序配置文件 —— 16 项目配置文件和配置 sass
  • 拉取docker run hello-world失败
  • 【每日学点鸿蒙知识】渐变效果、Web组件注册对象报错、深拷贝list、loadContent数据共享、半屏弹窗
  • 【连续学习之VCL算法】2017年论文:Variational continual learning
  • 【开源框架】从零到一:AutoGen Studio开源框架-UI层环境安装与智能体操作全攻略
  • 【MySQL篇】事务的认识以及四大特性
  • “Gold-YOLO:基于聚合与分发机制的高效目标检测新范式”
  • 反向传播算法:神经网络的学习秘诀
  • 防火墙原理介绍大全
  • 最新SQL Server 2022保姆级安装教程【附安装包】
  • 面试知识点汇总_04
  • fpga系列 HDL:ModelSim显示模拟波形+十进制格式数值(临时方法和设置持久化的默认值)
  • 数字图像相关DIC技术用于机械臂自动化焊接全场变形测量
  • YOLOv11模型改进-模块-引入多尺度大核注意力Multi-scale Large Kernel Attention