stm32f407探索者开发板(二十三)——定时器中断实验

news2024/12/23 4:56:46

文章目录

  • 一、通用定时器知识回顾
    • 1.1 时钟的选择
    • 1.2 内部时钟的选择
    • 1.3 计数器模式
  • 二、常用寄存器和库函数配置
    • 2.1 计数器当前值寄存器CNT
    • 2.2 预分频寄存器TIMx_PSC
    • 2.3 自动重装载寄存器(TIMx_ARR)
    • 2.4 控制寄存器1(TIMx_CR1)
    • 2.5 DMA中断使能寄存器(TIMx_DIER)
    • 2.6 定时器参数初始化
    • 2.7 定时器使能函数
    • 2.8 定时器中断使能函数
    • 2.9 状态标志位获取和清除
  • 三、手把手写定时器中断实验
    • 3.1 步骤
    • 3.2 程序要求
    • 3.3 timer.c

一、通用定时器知识回顾

在这里插入图片描述

1.1 时钟的选择

计数器时钟可以由下列时钟源提供:(这里,我们选第一个)
内部时钟(CK_INT)
②外部时钟模式1:外部输入脚(TIx)
③外部时钟模式2:外部触发输入(ETR)(仅适用TIM2,3,4)
④内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

1.2 内部时钟的选择

在这里插入图片描述
如果APB1的分频系数不是1,则通用定时器的时钟等于APB1时钟的2倍
如果APB1的分频系数是1,则通用定时器的时钟等于APB1时钟。

1.3 计数器模式

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

二、常用寄存器和库函数配置

2.1 计数器当前值寄存器CNT

在这里插入图片描述
在这里插入图片描述
对数值进行加减

2.2 预分频寄存器TIMx_PSC

在这里插入图片描述
在这里插入图片描述

对时钟进行预分频

2.3 自动重装载寄存器(TIMx_ARR)

在这里插入图片描述
在这里插入图片描述
对计数器自动重装载(数值)

2.4 控制寄存器1(TIMx_CR1)

在这里插入图片描述
确定向上还是向下计数器

2.5 DMA中断使能寄存器(TIMx_DIER)

在这里插入图片描述

·位0·进行使能中断

2.6 定时器参数初始化

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

typedef struct
{
  uint16_t TIM_Prescaler;       //预分频系数
  uint16_t TIM_CounterMode;     //设置模式(向上向下)
  uint16_t TIM_Period;          //自动装载值
  uint16_t TIM_ClockDivision;  //
  uint8_t TIM_RepetitionCounter; //高级定时器
} TIM_TimeBaseInitTypeDef; 

主要是前面三个,下面是范例

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

2.7 定时器使能函数

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

2.8 定时器中断使能函数

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

2.9 状态标志位获取和清除

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

三、手把手写定时器中断实验

3.1 步骤

使能定时器时钟
RCC_APB1PeriphClockCmd();
初始化定时器,配置ARR,PSC
TIM_TimeBaseInit();
开启定时器中断,配置NVIC
NVIC_Init();
使能定时器
TIM_Cmd();
编写中断服务函数
TIMx_IRQHandler();

3.2 程序要求

通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)。
Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk

3.3 timer.c

#include "timer.h"
#include "led.h"
void TIM3_Init(u16 arr,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
	NVIC_InitTypeDef NVIC_InitStruc;
	
	TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV2;
	TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStrue.TIM_Period=arr;
	TIM_TimeBaseInitStrue.TIM_Prescaler=psc;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定时器时钟
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
	
	NVIC_InitStruc.NVIC_IRQChannel=TIM3_IRQn;
	NVIC_InitStruc.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruc.NVIC_IRQChannelPreemptionPriority=0X01;
	NVIC_InitStruc.NVIC_IRQChannelSubPriority=0X03;
	NVIC_Init(&NVIC_InitStruc);
	
	TIM_Cmd(TIM3,ENABLE);
}


void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
	{
		LED1=!LED1;
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
	}
}

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

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

相关文章

基因净化车间装修设计方案SICOLAB

基因净化车间的设计方案应该根据实际需求进行定制,以下是一些规划建设要点和洁净设计要注意的事项:一、净化车间规划建设要点:(1)基因车间的面积应该根据实验项目的规模进行规划,包括充足的操作区域和足够的…

华为OD机试题,用 Java 解【DNA 序列】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

自动化测试selenium

目录 一、为什么引入自动化测试? 二、为什么选择selenium作为自动化测试工具? 三、环境部署 四、什么是驱动?驱动的工作原理? 五、selenium的基础语法 元素定位 元素操作 点击元素 模拟键盘输入 清除对象输入的文本…

vue-draggable浏览器拖拽event事件对象拖动时 DragEvent path undefined

场景: 在做组件拖拽过程中,需要获取到触发元素冒泡过程中的所有元素,所以使用了event.path属性。在Chrome下正常运行,但是在FireFox下测试时发现,完犊子,失效了,通过问题排查,发现了…

开源运维监控工具WGCLOUD - 功能概述及架构介绍(理论篇)

一、项目简介 开源运维监控系统WGCLOUD,基于springboot和golang开发,可以监控各种设备(物理机,云主机,虚拟机等都可以,安卓也可以)。 二、实现功能 支持windows和redHat、centos、ubuntu、deb…

ASEMI低压MOS管20N06参数,20N06体积,20N06大小

编辑-Z ASEMI低压MOS管20N06参数: 型号:20N06 漏极-源极电压(VDS):60V 栅源电压(VGS):20V 漏极电流(ID):20A 功耗(PD&#xff0…

【设计模式】 工厂模式介绍及C代码实现

【设计模式】 工厂模式介绍及C代码实现 背景 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来…

宝塔搭建实战php悟空CRM前后端分离源码-vue前端篇(二)

大家好啊,我是测评君,欢迎来到web测评。 上一期给大家分享了悟空CRM server端在宝塔部署的方式,但是由于前端是用vue开发的,如果要额外开发新的功能,就需要在本地运行、修改、打包重新发布到宝塔才能实现功能更新&…

Kubernetes之job

job job用于执行一次性任务,如数据处理、分析、测试、运算等需求,运算完成后,也就结束了,不用一直计算下去。 创建一个job后,会创建一个pod,如果pod执行成功了,则此job结束,若此pod…

Linux 配置NFS与autofs自动挂载

目录 配置NFS服务器 安装nfs软件包 配置共享目录 防火墙放行相关服务 配置NFS客户端 autofs自动挂载 配置autofs 配置NFS服务器 nfs主配置文件参数(/etc/exports) 共享目录 允许地址1访问(选项1,选项2) 循序地…

fastadmin:如何点击按钮弹出存在的指定页面的弹窗

样式&#xff1a;方法一&#xff1a;直接使用超链接进行操作{:url(popup/purchase/itemno)}&#xff1a;表示地址信息btn-dialog&#xff1a;表示弹窗<a href"{:url(popup/purchase/itemno)}" title"跳转第三方" class"btn btn-success btn-dialog…

Kali安装配置vulhub

一、vulhubVulhub是一个基于docker和docker-compose的漏洞环境集合&#xff0c;进入对应目录并执行一条语句即可启动一个全新的漏洞环境&#xff0c;主要利用于漏洞复现。Vulhub的官方地址为www.vulhub.org。二、搭建vulhub靶场2.1 开启kali虚拟机2.2 安装docker先更新一下软件…

第四届国际步态识别竞赛HID2023已经启动,欢迎报名

欢迎参加第四届HID 2023竞赛&#xff0c;证明您的实力&#xff0c;推动步态识别研究发展&#xff01;本次竞赛的亮点&#xff1a;总额人民币19,000元奖金&#xff1b;最新的SUSTech-Competition步态数据集&#xff1b;比上一届更充裕的准备时间&#xff1b;OpenGait开源程序帮您…

系统发育树初步剖析

什么是系统发育树如何看系统发育树并确定哪些物种最相关1. 要点 系统发育树是表示生物体之间进化关系的图表。系统发育树是假设的&#xff0c;而不是确定的事实。系统发育树中的分支模式反映了物种或其他群体如何从一系列共同祖先进化而来的关系。在树中&#xff0c;如果两个物…

1301:大盗阿福

经典的dp打家劫舍问题状态设计dp[i][0]&#xff1a;在前i个店铺中选&#xff0c;且不选第i家的最大和dp[i][1]&#xff1a;在前i个店铺中选&#xff0c;且选第i家的最大和状态转移dp[i][0] max(dp[i-1][1], dp[i-1][0];第i家店不选&#xff0c;那么我们可以选第i-1个店 也可以…

Vue3的新特性变化,上手指南!

文章目录一、Vue3相比Vue2&#xff0c;更新了什么变化&#xff1f;二、Proxy 代理响应式原理三、组合式 API (Composition API)setup()函数:ref()函数reactive()函数组合式 setup 中使用 Props 父向子传递参数计算属性watch&#xff08;数据监视&#xff09;watchEffect&#x…

C语言数据结构初阶(2)----顺序表

目录 1. 顺序表的概念及结构 2. 动态顺序表的接口实现 2.1 SLInit(SL* ps) 的实现 2.2 SLDestory(SL* ps) 的实现 2.3 SLPrint(SL* ps) 的实现 2.4 SLCheckCapacity(SL* ps) 的实现 2.5 SLPushBack(SL* ps, SLDataType x) 的实现 2.6 SLPopBack(SL* ps) 的实现 2.7 SLP…

“XXX.app 已损坏,打不开。您应该将它移到废纸篓”,Mac应用程序无法打开或文件损坏的处理方法(2)

1. 检查状态 在sip系统完整性关闭前&#xff0c;我们先检查是否启用了SIP系统完整性保护。打开终端输入以下命令【csrutil status】并回车&#xff1a; 你会看到以下信息中的一个&#xff0c;用来指示SIP状态。已关闭 disabled: System Integrity Protection status: disabl…

学习 Python 之 Pygame 开发魂斗罗(四)

学习 Python 之 Pygame 开发魂斗罗&#xff08;四&#xff09;继续编写魂斗罗1. 创建子弹类2. 根据玩家方向和状态设置子弹发射的位置(1). 站立向右发射子弹(2). 站立向左发射子弹(3). 站立朝上发射子弹(4). 蹲下发射子弹(5). 向斜方发射子弹(6). 奔跑时发射子弹(7). 跳跃时发射…

ARM uboot 源码分析8 - uboot的环境变量

一、uboot 的环境变量基础 1、环境变量的作用 (1) 让我们可以不用修改 uboot 的源代码&#xff0c;而是通过修改环境变量&#xff0c;来影响 uboot 运行时的一些数据和特性。譬如说&#xff0c;通过修改 bootdelay 环境变量&#xff0c;就可以更改系统开机自动启动时倒数的秒…