【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

news2024/10/5 21:20:33

文章目录

  • 定时器1_定时中断
  • 定时器2_定时中断
  • 定时器3_定时中断
  • 定时器4_定时中断
  • 定时器5_定时中断

在这里插入图片描述

在这里插入图片描述

高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041):

在这里插入图片描述

定时器1_定时中断

TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。

timer.c

#include "timer.h"
#include "led.h"
//初始化定时器为中断触发
void TIM1_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能

    //定时器TIM1初始化
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

    //中断优先级NVIC设置
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

    TIM_Cmd(TIM1, ENABLE);  //使能TIM1

}
/* 定时器1中断服务程序 */
void TIM1_UP_IRQHandler(void)                                    /* TIM1中断 */
{

        if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)  /* 检查TIM1更新中断发生与否 */
        {
            TIM_ClearITPendingBit(TIM1, TIM_IT_Update);   /* 清除TIM1更新中断标志 */

            LED0 = !LED0;
        }
}



timer.h

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"

void TIM1_Init(u16 arr,u16 psc);

#endif




调用

TIM1_Init(500 - 1, 7200 - 1);//50ms

定时器2_定时中断

timer.c

#include "timer.h"
#include "led.h"
//初始化定时器为中断触发
void TIM2_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能

    //定时器TIM2初始化
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

    //中断优先级NVIC设置
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

    TIM_Cmd(TIM2, ENABLE);  //使能TIM2

}
/* 定时器2中断服务程序 */
void TIM2_IRQHandler(void)                                    /* TIM2中断 */
{

        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  /* 检查TIM2更新中断发生与否 */
        {
            TIM_ClearITPendingBit(TIM2, TIM_IT_Update);   /* 清除TIM2更新中断标志 */

            LED0 = !LED0;
        }
}


timer.h

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"

void TIM2_Init(u16 arr,u16 psc);

#endif




调用

TIM2_Init(500 - 1, 7200 - 1);//50ms

定时器3_定时中断

timer.c

#include "timer.h"
#include "led.h"
//初始化定时器为中断触发
void TIM3_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

    //定时器TIM3初始化
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

    //中断优先级NVIC设置
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

    TIM_Cmd(TIM3, ENABLE);  //使能TIM3

}
/* 定时器3中断服务程序 */
void TIM3_IRQHandler(void)                                    /* TIM3中断 */
{

        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  /* 检查TIM3更新中断发生与否 */
        {
            TIM_ClearITPendingBit(TIM3, TIM_IT_Update);   /* 清除TIM3更新中断标志 */

            LED0 = !LED0;
        }
}




timer.h

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"

void TI3_Init(u16 arr,u16 psc);

#endif




调用

TIM3_Init(500 - 1, 7200 - 1);//50ms

定时器4_定时中断

timer.c

#include "timer.h"
#include "led.h"
//初始化定时器为中断触发
void TIM4_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能

    //定时器TIM4初始化
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

    //中断优先级NVIC设置
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
	
		TIM_Cmd(TIM4, ENABLE);  //使能TIM4

}

/* 定时器4中断服务程序 */
void TIM4_IRQHandler(void)                                    /* TIM4中断 */
{

    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  /* 检查TIM4更新中断发生与否 */
    {
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);   /* 清除TIM4更新中断标志 */

				LED0 = !LED0;
    }
}

timer.h

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"


void TIM4_Init(u16 arr,u16 psc);


#endif


调用

TIM4_Init(500 - 1, 7200 - 1);//50ms

定时器5_定时中断

timer.c

#include "timer.h"
#include "led.h"
//初始化定时器为中断触发
void TIM5_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //时钟使能

    //定时器TIM5初始化
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

    //中断优先级NVIC设置
    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

    TIM_Cmd(TIM5, ENABLE);  //使能TIM5

}
/* 定时器5中断服务程序 */
void TIM5_IRQHandler(void)                                    /* TIM5中断 */
{

    if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)  /* 检查TIM5更新中断发生与否 */
    {
        TIM_ClearITPendingBit(TIM5, TIM_IT_Update);   /* 清除TIM5更新中断标志 */

        LED0 = !LED0;
    }
}


timer.h

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"


void TIM5_Init(u16 arr,u16 psc);


#endif


调用

TIM5_Init(500 - 1, 7200 - 1);//50ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

bochs编译安装

编译命令 ./configure --prefix‘/usr/local/bochs2.7’ --enable-debugger --enable-disasm --enable-iodebug --enable-x86-debugger --with-x --with-x11 make sudo make install 配置文件 bochsrc # configuration file generated by Bochs plugin_ctrl: unmapped1, biosde…

让开源项目从易用到好用 | 亚马逊的开源文化

亚马逊的领导力准则是亚马逊文化的核心,它如同亚马逊的 DNA 融入贯穿每一个重要决策,深深影响着每一位亚麻人、影响着每一位亚马逊的客户、合作伙伴以及每一位亚马逊云科技的构建者。同时,亚马逊的领导力准则对亚马逊与开源的互动方式也产生着…

如何设计一个文件系统?需要考虑哪些因素?

文件系统的实现 在对文件有了基本认识之后,现在是时候把目光转移到文件系统的实现上了。之前用户关心的一直都是文件是怎样命名的、可以进行哪些操作、目录树是什么,如何找到正确的文件路径等问题。而设计人员关心的是文件和目录是怎样存储的、磁盘空间…

数字孪生和GIS融合会为城市交通带来哪些便利?

数字孪生和GIS的融合对于城市交通领域带来了诸多便利,从智能交通管理到出行体验的提升,为城市交通带来了全新的发展机遇。 首先,数字孪生技术与GIS的结合可以实现智能交通管理。通过GIS建立城市交通网络的数字孪生模型,可以实时模…

程序员找工作难!拿到外包公司的 offer 我应该去么?

引言 前一阵子有一个帖子引起了非常广泛的讨论,描述的就是一个公司的外包工作人员,加班的时候因为吃了公司给员工准备的零食,被公司的HR当场批评!这个帖子一发出来,让现在测试行业日益新增的外包公司备受关注。那么外包公司和非外…

Qt开发1--QCustomPlot的第一个示例

本文记录了在Linux上使用QCustomPlot进行一个基本绘制所需的完整过程,包括如何使用qtcreator,编辑ui以及编写相应的C代码。以下是详细步骤: 1、使用qtcreator启动开发环境: [blctrlmain-machine qt]$ qtcreator 启动后&#xf…

GBDT精讲

GBDT算法的流程 首先GBDT是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或回归的算法。 GBDT通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的梯度(如果损失函数是平方损失函数…

Quiz 4: Functions | Python for Everybody 配套练习_解题记录

文章目录 课程简介Quiz 4: Functions 单选题(1-9)编程题Exercise 4.6 课程简介 Python for Everybody 零基础程序设计(Python 入门) This course aims to teach everyone the basics of programming computers using Python. 本课…

JAVA2

文章目录 前言 前言 创建,编译java(每4修改一次就要重新编译!) 第一个程序: 解决中文乱码问题: 效果: 总结:

管理类联考——英语——趣味篇——词根词汇——按频次分类——高频词汇——List1

优化原书记忆方法,轻松搞定考研单词 摒弃了传统的以字母顺序排序的方法,结合近20年考研真题,通过电脑搜索等方法对核心词进行科学统计,将核心词有机地分为高频词汇、常考词汇、中频词汇、低频词汇等4大部分,同时还补充…

一个三极管和稳压管构成的简易稳压电源

一个三极管和稳压管构成的简易稳压电源 先看电路 原理分析: 实际使用中可以加入合适的滤波电容。 上面的电路原理看着比较简单,但还是有不少要注意的地方。 来看看仿真电路的结果: 可以看到,输出的电压并不是我们想要的结果&am…

高压线路距离保护程序逻辑原理(五)

六、系统振荡的判断与振荡闭锁程序逻辑框图 (一)系统振荡概述 电力系统的振荡大致可以分为两种情况:一种是静稳破坏引起系统振荡,另一种是由于系统内故障切除时间过长,导致系统的两侧电源之间的不同步而引起的系统振…

【单片机】MSP430单片机,1.3寸 IIC OLED ,显示驱动

文章目录 main.coled.holedfont.h main.c #include <msp430.h> #include "OLED.h"int main( void ) {WDTCTL WDTPW WDTHOLD; /* Stop WDT */if ( CALBC1_8MHZ 0xFF ) /* If calibration constant erased */{while ( 1 ); /* do n…

C++ DAY4

1.思维导图 2.运算符重载 #include <iostream> using namespace std;class Person { private:int age;int *p; public://1.无参构造Person():p(new int(89)){age 18;}//2.有参构造Person(int age,int num){this->age age;this->pnew int(num);}//3.拷贝构造函数…

数据库中的日期函数DM和mysql都通用,计算年月日时分秒,获取日期之间相差的值

select MINUTE(date) from t_test; year month day hour minute second --对应年月日时分秒 select date from t_test select MINUTE(createtime),to_char(sysdate(),yyyy-MM-dd) select TIMESTAMPDIFF(minute,date,now()),date from t_test DateUtil.between(new Date(),ne…

小程序底层技术机制解读:版本更新与底层运行原理

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言小程序版本更新机制…

Day.3 LeetCode刷题练习(反转链表)

题目&#xff1a; 例子&#xff1a; 分析题目&#xff1a; 分析题目&#xff0c;因为是一个单链表所以不能找到尾后往前改变&#xff0c;所以不妨换个思路从前往后进行修改链表链接关系 用到三个指针 指针cur指向所要改变的节点链接关系、指针prev指向所要改变节点的前一个节点…

白盒测试入门概念

白盒测试的度量 根据待测产品的内部实现细节来设计测试用例白盒测试的执行手段是可以涵盖单元测试、集成测试使用代码覆盖率作为白盒测试的主要度量指标 代码覆盖率常见概念 语句覆盖&#xff1a;每行代码都要覆盖至少一次判定覆盖&#xff1a;判定表达式的真假至少覆盖一次…

CSS文字阴影渐变动画效果

最近项目中需要一些简单的动画效果&#xff0c;就写了一个文字渐变的动画效果,纯CSS动画.文字加了一点阴影效果,看起来有发光哒感觉~ 效果如下图 大家可以自己拷贝代码亲自试一试 代码看下面 html <div class"son"> Particia </div>css .son {color…

SpringBoot2+Vue2实战(七)springboot集成jwt

一、集成jwt JWT依赖 <!-- JWT --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version></dependency> UserDto import cn.hutool.core.annotation.Alias; import …