stm32定时器中断的配置步骤

2023-11-09

stm32定时器中断的配置步骤

1》TIM3 时钟使能

位于低速的APB1总线上(注意:高级定时器是在高速的APB2总线上);

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

2》初始化定时器参数,设置自动重装值, 分频系数,计数方式等

voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

第一个参数:确定是哪个定时器

第二个参数:定时器初始化参数结构体指针

typedef struct	
{
  uint16_t TIM_Prescaler; /* 指定用于分频 TIM 时钟的预分频器值。
                         该参数可以是 0x0000 到 0xFFFF 之间的数字 */
  uint16_t TIM_CounterMode; /* 指定计数器模式。TIM_CounterMode_Up */
  uint16_t TIM_Period; /* 指定要加载到活动中的周期值次更新事件时自动重新加载注册。此参数必须是介于 0x0000 和 0xFFFF 之间的数字。 */
  uint16_t TIM_ClockDivision; /* 指定时钟分频。TIM_CKD_DIV1 */
  uint8_t TIM_RepetitionCounter; 
  /* 指定重复计数器值。每次 RCR 递减计数器达到零,生成更新事件并重新开始计数从 RCR 值 (N)。这意味着在 PWM 模式下,(N+1) 对应于:
- 边沿对齐模式下的 PWM 周期数
- 中心对齐模式下半个 PWM 周期的数量
此参数必须是介于 0x00 和 0xFF 之间的数字。
@note 此参数仅对 TIM1 和 TIM8 有效。 */
} TIM_TimeBaseInitTypeDef;

计数器模式:
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
在这里插入图片描述

TIM3 初始化:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 5000;
TIM_TimeBaseStructure.TIM_Prescaler =7199;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

3》启用或禁用指定的 TIM 中断。

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

参数:
第一个参数:TIMx 其中 x 可以是 1 到 17 以选择 TIMx 外设。 TIM3
第二个参数: 指定要启用或禁用的 TIM 中断源。 TIM_IT_Update
第三个参数: ENABLE 或 DISABLE。

3》设置 NVIC 相关寄存器,设置中断优先级

配置优先级分组

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)

NVIC_PriorityGroup_0:0 位用于抢占优先级,4 位用于子优先级

根据指定初始化 NVIC 外设

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
typedef struct
{
  uint8_t NVIC_IRQChannel;    //指定要启用或禁用的 IRQ 通道。 TIM3_IRQn
  uint8_t NVIC_IRQChannelPreemptionPriority; //指定抢占优先级,0到15之间的值 
  uint8_t NVIC_IRQChannelSubPriority;   //指定子优先级      	  
  FunctionalState NVIC_IRQChannelCmd;       // ENABLE 或 DISABLE 
} NVIC_InitTypeDef;

3》使能 TIM3

启用或禁用指定的 TIM 外设:

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

参数:
第一个参数:TIMx:其中 x 可以是 1 到 17 以选择 TIMx 外设。
第二个参数:ENABLE 或 DISABLE。

3》编写中断服务函数

检查 TIM 中断是否发生:

ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)

@retval TIM_IT 的新状态(SET 或 RESET)

该函数的作用:判断定时器 TIMx 的中断类型 TIM_IT 是否发生中断。
比如,我们要判断定时器 3 是否发生更新(溢出)中断,方法为:
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){}

清除中断标志位

void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)

该函数的作用:清除定时器 TIMx 的中断 TIM_IT 标志位。
比如在 TIM3 的溢出中断发生后,我们要清除中断标志位,方法是:
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );

注:固件库还提供了两个函数用来判断定时器状态以及清除定时器状态标志位的函数 TIM_GetFlagStatus 和 TIM_ClearFlag,他们的作用和前面两个函数的作用类似。只是在 TIM_GetITStatus 函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而TIM_GetFlagStatus 直接用来判断状态标志位。

定时器中断服务函数的实现

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

时钟系统初始化的时候在默认的系统初始化函数 SystemInit 函数里面已经初始化 APB1 的时钟为 2 分频,所以 APB1 的时钟为 36M,而从 STM32 的内部时钟树图得知:当 APB1 的时钟分频数为 1 的时候, TIM2~7 的时钟为 APB1 的时钟,而如果 APB1 的时钟分频数不为 1,那么 TIM2~7 的时钟频率将为 APB1 时钟的两倍。因此, TIM3 的时钟为 72M,再根据我们设计的 arr 和 psc 的值,就可以计算中断时间了。

计算公式如下:
Tout= ((arr+1)*(psc+1))/Tclk;
其中:
Tclk: TIM3 的输入时钟频率(单位为 Mhz)。
Tout: TIM3 溢出时间(单位为 us)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32定时器中断的配置步骤 的相关文章

  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 了解 ctags 文件格式

    我使用 Exhuberant ctags 来索引我的 c 项目中的所有标签 c project 是 Cortex M7 微控制器的嵌入式软件 结果是一个标签文件 我正在尝试阅读该文件并理解所写的内容 根据我找到的 ctags 和 Exhub
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • AOSP 的“午餐”组合是什么意思?我需要选择什么?

    我是 Android 设备 ROM 开发的新手 无论如何 我现在正在为具有 64 位处理器的中国设备构建 AOSP 我按照 source android com 上的菜单进行操作 当我运行 午餐 命令时 终端显示 午餐菜单 选择一个组合 我
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点
  • Qemu flash 启动不起作用

    我有一本相当旧的 2009 年出版 嵌入式 ARM Linux 书 其中使用u boot and qemu 的用法qemu与u boot书中对二进制的解释如下 qemu system arm M connex pflash u boot b
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 交叉编译armv5,但它创建v7二进制文件

    我设法为arm926ej s创建了一个目标文件我在 qemu 上使用 Debian Arm arm linux gnueabi gcc 4 4 static O c mcpu arm926ej s hello c o hello root
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • ARM 汇编:从 STDIN 获取字符串

    我目前正在学习 CS 课程 我们刚刚开始在 Raspberry Pi 上使用 ARM Assembly 事实证明这相当困难 想知道是否有人可以提供帮助 我当前的任务是从 stdin 获取一个字符串 使用 scanf 并计算其中的字符数 然后
  • 将 C 函数与 ARM 汇编结合使用

    我见过人们在代码中使用 C 库中的 printf 的示例 如下所示 data balign 4 hello asciz Hello n text global main func main main ldr r0 hello msg bl
  • 使用arm-linux-gnueabi-gcc为Android交叉编译静态C hello world

    我想使用 arm linux gnueabi gcc 从 C 构建静态 hello world 而不是使用 NDK 独立工具链或 Codesourcery 在Ubuntu中 我做了以下事情 sudo apt get install gcc
  • 在LPC2148 ARM处理器上创建中断向量的汇编代码

    我最近刚刚开始使用 LPC2148 ARM 处理器 我试图理解一些有关创建中断向量的汇编代码 这是代码 Runtime Interrupt Vectors Vectors b start reset start ldr pc undf un
  • 在 Intel 机器 (Mac) 上构建 ARM 架构的 Docker 镜像

    我希望能够从我的 Mac 构建 ARM 的 Docker 映像 我知道我可以使用 QEMU 在 Mac 上运行 ARM 容器 但我不知道如何为 ARM 构建 现在这有点复杂 我相信在不久的将来 docker 会让这一切变得更容易 基本上 您

随机推荐

  • [转]增强型N沟道mos管(如si2300)开关条件

    增强型N沟道mos管 如si2300 开关条件 增强型N沟道mos管的S source源极 和 D drain漏极 导通条件取决与Vgs 即栅极和源极间的电压压差 只有当 Vgs gt 2 5V 也就是 Vg G极电压 Vs S极电压 gt
  • Qt类中使用函数指针数组

    接上文例子 将其改成函数指针数组 class Widget public QWidget public int add int x int y int mul int x int y int Widget func p 2 int x in
  • RN 使用第三方组件之react-native-image-picker(拍照/从相册获取图片)

    首先给个github地址 https github com react community react native image picker 英文不行的看下面这个笔记 该插件可以同时给iOS和Android两个平台下使用 但是需要配置下各
  • 京东如何处理数据中心网络对应用性能的影响

    随着现代数据中心规模的不断扩张 网络拓扑和路由转发变得越来越复杂 传统的数据中心使用大型机和小型机 网络规模相对较小 普通的机框式交换机就能满足网络的需求 随着CLOS集群架构的普及 标准的x86服务器集群以低成本和高扩展性逐渐取代大型机和
  • 解决:Failed to connect to repository : Error performing command: git.exe ls-remote -h xxxxxxx HEAD...

    在jenkins新建工程 配置源码管理时 发现输入gitlab的Repository URL 总会抛出一个错误 后来在网上各种百度 终于找到了一篇比较靠谱的文章 顺着文章的提示 去Manage Jenkins Global Tool Con
  • linux 新建文件夹命令

    今天学习了几个命令 是创建 删除文件和文件夹的 在linux里 文件夹是目录 下面说下我学习的命令 创建文件夹 mkdir 一 mkdir命令使用权限 所有用户都可以在终端使用 mkdir 命令在拥有权限的文件夹创建文件夹或目录 二 mkd
  • 集成学习-Voting

    一 什么是集成学习 集成学习是使用一系列学习器进行学习 并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法 一般情况下 集成学习中的多个学习器都是同质的 弱学习器 上面的描述来自百度百科 看定义的话知道
  • Qt关于QProcess使用startDetached函数问题

    最近项目编写自动升级程序使用进程通讯 网上查看大部分资料都使用QProcess类 再使用函数startDetached过程发现一种很奇怪现象 父进程通过startDetached调用子进程 原则上父进程和子进程脱离关系 关闭父进程不会关闭子
  • PyQt5无法导入QtCore问题解决

    今天安装PyQt 执行下面语句的时候出现问题 python3 configure py pyqt PyQt5 搞了一下午 吐血 具体 import PyQt5 完全ok 但是 from PyQt5 import QtCore 就出错 就这个
  • 07:MYSQL----多表查询

    目录 1 多表查询概述 2 多表查询分类 3 内连接 3 外连接 4 自连接 5 联合查询 union union all 6 子查询 1 多表查询概述 select from emp dept emp 表中有6条数据 dept表中有5条数
  • STM32外部中断 中断优先级讲解及配置

    1 概念 对于几乎所有的微控制器 中断都是一种常见的特性 中断一般是由硬件 如外设和外部输入引脚 产生的事件 它会引起程序流偏离正常的流程 如给外设提供服务 转去执行其他的流程 CPU在正常执行程序的过程中 由于内部 外部事件的触发或程序的
  • QT 创建可复用查找、替换对话框

    目录 1 查找对话框的实现 2 Qt中的调色板 palette 3 替换对话框的实现 目标 开发一个可以在不同项目间复用的查找替换对话框 1 查找对话框的实现 查找对话框需求分析 查找文本框中的指定字符串 能够指定查找方向 支持大小写敏感查
  • 随机生成6位的字符串验证码,要求包含数字,大小写字母

    package com cheng import java util Random import java util Scanner public class Demo04 static Scanner sc new Scanner Sys
  • c++类型推导

    类型推导 现代c 类型推导分为三个 一个为模板函数的形参推演 一个为auto的类型推导 一个decltype的类型推导 auto的类型推导是以模板函数的类型推导为基础的 模板函数类型推导 推导过程 模板函数的类型推导 是通过调用表达式即实参
  • openGL之API学习(七十七)glDrawElements

    通过索引方式来绘制几何图元 如果要 glDrawArrays 和 glDrawElements 正确进行绘制的话 必须在之前 调用带有相应参数的 glEnableClientState 方法 glDrawArrays使用的是顶点 而glDr
  • 查看linux centos ftp服务,Centos7开启FTP服务

    一 查看并安装vsftpd 执行以下命令进行查看 vsftpd v 如果没有安装的话就执行以下命令进行安装 yum y install vsftpd 二 配置vsftpd 2 1 取消匿名登陆 修改vsftpd conf文件 vi etc
  • huggingface ,Trainer() 函数是 Transformers 库中用于训练和评估模型的主要接口,Trainer()函数的参数如下:

    model required 待训练的模型 必须是 PyTorch 模型 args required TrainingArguments 对象 包含训练和评估过程的参数 例如训练周期数 学习率 批量大小等 train dataset opt
  • Linux用户空间和内核空间的内存互访

    Linux用户空间和内核空间的内存互访 标签 虚拟内存 安全性 Linux 用户 2012 11 13 15 55 Linux 内存 在 Linux 中 用户内存和内核内存是独立的 在各自的地址空间实现 地址空间是虚拟的 就是说地址是从物理
  • 在导入NVIDIA的apex库时报错 ImportError cannot import name ‘UnencryptedCookieSessionFactoryConfig‘ from

    在导入NVIDIA的apex库时报错 ImportError cannot import name UnencryptedCookieSessionFactoryConfig from pyramid session unknown loc
  • stm32定时器中断的配置步骤

    stm32定时器中断的配置步骤 1 TIM3 时钟使能 位于低速的APB1总线上 注意 高级定时器是在高速的APB2总线上 RCC APB1PeriphClockCmd RCC APB1Periph TIM3 ENABLE 时钟使能 2 初