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定时器中断的配置步骤 的相关文章

  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 了解 ctags 文件格式

    我使用 Exhuberant ctags 来索引我的 c 项目中的所有标签 c project 是 Cortex M7 微控制器的嵌入式软件 结果是一个标签文件 我正在尝试阅读该文件并理解所写的内容 根据我找到的 ctags 和 Exhub
  • 基于 Windows 8 ARM 的平板电脑上的 VB6

    随着 Windows 8 将支持 VB6 我的问题是 Microsoft 是否在任何地方表示 是或否 VB6 应用程序将在基于 ARM 的平板电脑上运行 如果没有 是否有任何 ARM 模拟器 以便我们可以在 Windows 8 ARM 平板
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • ARM 汇编:从 STDIN 获取字符串

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

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • 了解带有 pc 偏移的 Cortex-M 组件 LDR

    我正在查看这段 C 代码的反汇编代码 define GPIO PORTF DATA R volatile unsigned long 0x400253FC int main void Initialization code while 1
  • 使用arm-linux-gnueabi-gcc为Android交叉编译静态C hello world

    我想使用 arm linux gnueabi gcc 从 C 构建静态 hello world 而不是使用 NDK 独立工具链或 Codesourcery 在Ubuntu中 我做了以下事情 sudo apt get install gcc
  • 当我尝试在 Armv8 程序集中分配数组时,执行冻结

    所以我正在用汇编语言进行编程 这只是一个简单的代码 这样我就可以学习如何分配数组 以便稍后在 NEON 编程中使用它们 ASM FUNC FPE data balign 8 array skip 80 array1 word 10 20 3
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • 更新 MMU 转换表的正确方法是什么

    我在我的 s3c2440 板上启用了 MMU 3G 4G 内存 故障属性 当我没有读 写 3G 4G 内存时一切都很好 所以为了测试页面错误向量 我写入了 0xFF 3G地址 正如我所料 我从FSR中得到了正确的值 所以我在 do page

随机推荐

  • [转]增强型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 初