STM32学习和实践笔记(21):定时器中断实验

通用定时器配置步骤如下:

第一步:使能定时器时钟

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

第二步:初始化定时器参数,包含自动重装值,分频系数,计数方式等

voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

typedef struct

{

  uint16_t TIM_Prescaler;         //定时器预分频器

  uint16_t TIM_CounterMode;       //计数模式

  uint32_t TIM_Period;            //定时器周期

  uint16_t TIM_ClockDivision;     //时钟分频

  uint8_t TIM_RepetitionCounter;  //重复计数器

} TIM_TimeBaseInitTypeDef;

了解结构体成员功能后,就可以进行配置,例如

  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

  TIM_TimeBaseInitStructure.TIM_Period=1000;   //自动装载值

  TIM_TimeBaseInitStructure.TIM_Prescaler=35999; //分频系数

  TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

  TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式

  TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);

  定时器定时时间计算公式如下:

Tout= ((per)*(psc+1))/Tclk;

公式中对应的各参数在框图上的位置如下所示:


 

per(Period)就是自动重装里需要装入的数值

PSC就是分频系数。

ClockDivision是指输入滤波通道后面的那个预分频器,是对输入信号进行分频的,一般设为1

TCLK是外设总结时钟的两倍,也就是36M*2=72MHZ

自动重装计数器装入初值,然后以CK_CNT的频率从0开始计数,当计到大于初值时,就产生事件或者溢出中断。

Tout= ((per)*(psc+1))/Tclk

=((1000)*(35999+1))/72MHZ =500ms

反过来,根据已知的需要定时多长时间,也可以算出需要装入的初值是多少。

第三步:设置定时器中断类型,并使能

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

第四步:设置定时器中断优先级,使能定时器中断通道

NVIC初始化库函数是NVIC_Init()

第五步:开启定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

第六步:编写定时器中断服务函数

TIM4_IRQHandler

ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);

if(TIM_GetITStatus(TIM4,TIM_IT_Update))

  {

  ...//执行TIM4更新中断内控制

  }

void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

固件库中还有两个函数是用来读取状态标志位以及清除中断标志位,函

数分别为TIM_GetFlagStatusTIM_ClearFlag

以上6步,通过下面这个实验来熟悉和验证:

main.c

#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "timer.h"/*	本实验所要实现的功能是:通过TIM4的更新中断控制D2指示灯间隔
500ms秒状态取反,主函数控制D1指示灯不断闪烁。
程序框架如下:
(1)初始化TIM4,并使能更新中断等
(2)编写TIM4中断函数
(3)编写主函数
*/int main()
{u8 i=0;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组LED_Init();TIM4_Init(1000,36000-1); //因为分频系数不能为0,会自动加1,所以这里先减1。这里定时为500mswhile(1){i++;if(i%20 ==0){led1=!led1;//LED1闪,用来指示主程序循环是否运行}delay_ms(10);}
}

timer.c

#include "timer.h"
#include "led.h"void TIM4_Init(u16 period,u16 prescaler)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//结构体变量声明NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟TIM_TimeBaseInitStructure.TIM_Period=period;   //装入函数传过来的自动装载值TIM_TimeBaseInitStructure.TIM_Prescaler=prescaler; //装入函数传过来的分频系数TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//1分频(没有分频)TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式:从0开始计数到自动重载值后溢出产生中断TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);//初始化TIM4各参数:自动重装值、分频系统、计数方式等TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//设置定时器中断类型(溢出更新中断),并使能TIM_ClearITPendingBit(TIM4, TIM_IT_Update);//清除之前可能存在的溢出标志//设置定时器中断优先级,使能定时器中断通道NVIC_InitStructure.NVIC_IRQChannel=	TIM4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_ClearITPendingBit(TIM4, TIM_IT_Update);TIM_Cmd(TIM4, ENABLE);//开启定时器}void TIM4_IRQHandler(void)//中断服务函数,注意函数内容根据功能自行编写但这个函数名是约定好的
{if(TIM_GetITStatus(TIM4, TIM_IT_Update)==1)//判断是否产生溢出中断{led2=!led2;}TIM_ClearITPendingBit(TIM4, TIM_IT_Update);//清除溢出标志
}

timer.h

#ifndef _timer_H
#define _timer_H#include "system.h"void TIM4_Init(u16 period,u16 prescaler);#endif

烧写到开发板上,实验是成功的。

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

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

相关文章

YJW-10000微机控制电液伺服压剪试验机

一、项目概述 YJW-10000微机控制电液伺服压剪试验机采用油缸下置式、四立柱结构,机架刚度强度高,变形小,满足公路、铁路桥梁板式、盆式、球型支座的检测要求,试验空间无级可调,方便不同高度的试验需求。采用试金自主研…

怎样快速插入数据

1、30万条数据插入插入数据库验证 1.1、表结构: CREATE TABLE t_user (id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户id,username varchar(64) DEFAULT NULL COMMENT 用户名称,age int(4) DEFAULT NULL COMMENT 年龄,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT…

基于binlog实现数据加工处理

场景举例: 为了查询方便性,目前订单中存在好多冗余字段,例如用户昵称,但是当昵称对应表变化时候,好多同学可能就直接在修改昵称的地方手 动调用订单接口更新昵称,但这样不仅代码结构混乱而且耦合严重 使用说明: 下面…

如何设置微信自动回复?教你快速上手!

自动回复对于需要在微信上洽谈业务的人来说,无疑是非常实用的一个功能。 下面就一起来看看微信管理系统的机器人自动回复都有哪些设置吧! 1、自动通过好友 只要有新的好友请求发送到你的微信账号,系统会自动通过该请求,无需手动…

vue flvjs 播放视频

写在前面: 之前使用过vodiejs插件播放过mp4视频格式的视频; 此次需要使用flvjs插件播放rtsp视频格式的视频; 因为视频的数据格式不同,所以对应的插件不同。 思维导图: 参考链接:rtmp、rtsp、flv、m3u8、 …

【活动汇总】纽约大学AI Meets Science;第十六届生物信息学和生物医学技术国际会议;Bio-IT World2024

HyperAI超神经将网罗海内外 AI for Science 垂类会议,并整理会议信息与链接,一键直达官方主页,不错过任何一场重量级活动! 未来活动预告: 4 月 26 日,纽约大学「AI Meets Science」会议 5 月 16 日&#…

Linux制作docker镜像

一、制作镜像 1.在/home/data/images目录下编写Dockerfile文件 Dockerfile:是制作镜像的文件 vi Dockerfile FROM java:8 ENV JAVA_HOME/usr/lib/jvm/jdk1.8.0_181 ENV PATH$PATH:$JAVA_HOME/bin ENV LC_ALLen_US.utf8 ENV LANGen_US.utf8 ENV LANGUAGEen_US.utf…

锁 synchronized和lock

Synchronized 原理: 方法级的同步是隐式, 即无需通过字节码指令来控制的, 它实现在方法调用和返回操 作之中。JVM 可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法 。当方法…

uiautomation 监控 Discord客户端的聊天记录 附python代码

一个Python脚本,用于监控和抓取Discord客户端的聊天记录。它使用了`uiautomation`库来模拟用户界面操作, 定义了一个名为`discord`的类,它初始化了几个变量,包括一个用于控制UI自动化的`UiaAPI`对象,以及一个用于存储会话项目的列表`SessionItemList`。 通过UI自动化获取名…

深度学习与目标检测:从卷积神经网络到YOLOv8概念介绍

深度学习与目标检测:从卷积神经网络到YOLOv8的深入探索 随着人工智能技术的迅猛发展,深度学习和计算机视觉领域取得了举世瞩目的成果。在目标检测这一关键任务中,卷积神经网络(CNN)和YOLO系列模型发挥着至关重要的作用…

Redis中的Lua脚本(六)

Lua脚本 清空repl_scriptcache_dict字典 每当主服务器添加一个新的从服务器时,主服务器都会清空自己的repl_scriptcache_dict字典,这是因为随着新从服务器的出现,repl_scriptcache_字典里面记录的脚本已经不再被所有从服务器载入过&#xf…

使用 pytorch训练自己的图片分类模型

如何自己训练一个图片分类模型,如果一切从头开始,对于一般公司或个人基本是难以实现的。其实,我们可以利用一个现有的图片分类模型,加上新的分类,这种方式叫做迁移学习,就是把现有的模式知识,转…

leetcode77--组合

1. 题意 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 2. 题解 1. 回溯减枝 class Solution { public:vector<int> temp;vector<vector<int>> ans;void dfs(int cur, int n, int k) {// 剪…

流量分析利器arkime的学习之路(二)---API接口

前文回忆 《流量分析利器arkime的学习之路(一)---安装部署》 概述 注意点 Arkime对所有API调用都使用摘要身份验证,因此请确保在库或curl命令中启用摘要身份验证。学习如何进行API调用的最简单方法是打开浏览器的javascript控制台,观察Arkime UI正在进行的调用,它使用…

向表内INSERT数据出现ORA-00600 ktspgfb-inc2错误的分析处理

业务高峰期&#xff0c;业务维护人员反馈某业务卡主&#xff0c;发来报错一看&#xff0c;是ORA-00600...的&#xff0c;心理一下就紧张起来&#xff1b;当前版本的ORA-00600错误&#xff0c;基本分为了2类&#xff0c;要么没啥影响&#xff1b;如果对业务有影响了&#xff0c;…

强化学习的重要概念:环境、模型、策略和它们的关系

在强化学习中&#xff0c;环境&#xff08;Environment&#xff09;、模型&#xff08;Model&#xff09;和策略&#xff08;Policy&#xff09;是三个核心概念&#xff0c;它们之间的关系可以描述如下&#xff1a; 环境&#xff08;Environment&#xff09;&#xff1a; 环境是…

<component> <slot> <template>三者之间的区别与使用

学习目标&#xff1a; 目标 1、了解组件的含义 2、了解 的含义及用法 3、了解 的含义及用法 4、了解 的含义及用法 学习内容&#xff1a; 内容&#xff1a; 什么是组件&#xff1f; 组件的出现&#xff0c;就是为了拆分Vue实例的代码量&#xff0c;能够让我们以不同的组件&am…

deque的插入和删除

函数原型 两端插入操作 push_back(elem) //向容器尾部添加一个数据push_front(elem) //向容器头部插入一个数据pop_back() //删除容器最后一个数据 pop_front() //删除第一个容器第一个数据 …

点云数据处理的库

PCL、Open3D和OpenGL都是用于点云数据处理的常用库&#xff0c;它们各有优劣&#xff0c;具体如下&#xff1a; PCL&#xff08;Point Cloud Library&#xff09; PCL是一个非常流行的开源点云数据处理库&#xff0c;它支持从各种传感器&#xff08;如激光雷达、Kinect&#xf…

Python实战 | 只需“4步”入门网络爬虫(小白也会)

文章目录 Python实战 | 只需“4步”入门网络爬虫&#xff08;小白也会&#xff09;1&#xff1a;确定目标网站和数据2&#xff1a;安装必要的库3&#xff1a;编写爬虫代码4.目标网站的URL5.发送HTTP请求并获取响应内容6.使用BeautifulSoup解析HTML内容7.查找包含新闻标题和链接…