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…

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

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

vue flvjs 播放视频

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

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

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

Redis中的Lua脚本(六)

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

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

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

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

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

【golang学习之旅】Go 的基本数据类型

系列文章 【golang学习之旅】报错:a declared but not used 目录 系列文章总览布尔型(bool)字符串型(string)整数型(int、uint、byte、rune)浮点型(float32、float64)复…

【C++】——类与对象引入和认识

创作不易,多多支持! 前言 有了上一篇博客的基础以后,就正式进入C类和对象的领域了,如果看完本篇文章对你有用,还请多多支持!!😘😘 一 面向过程和面向对象 1.面向过程 …

单链表实现通讯录

不过多赘述了 顺序表的增删查改-CSDN博客https://blog.csdn.net/bkmoo/article/details/137566495?spm1001.2014.3001.5502 使用顺序表实现通讯录-CSDN博客https://blog.csdn.net/bkmoo/article/details/137676561?spm1001.2014.3001.5502这里没有使用文件操作只是简单的使…

全程免费的ssl证书申请——七步实现网站https

全程免费的ssl证书申请步骤如下: 1 准备工作 首先确定好需要的证书类型,如单域名证书、通配符证书和多域名证书,准备好需要安装证书的域名。 2 选择CA 选择提供免费证书的服务商——JoySSL,并访问其官方网站,创建一…

3d软件哪个适合新手学?3D动画渲染怎么好

在不同的行业领域,3D建模和动画的需求各异,因此所需的3D软件工具也会有所不同。对于刚开始接触3D设计的新手来说,软件的易操作性、丰富的学习资源以及与自己专业领域相关的功能是选择时的重要考虑因素。以下是几款适合初学者入门的3D软件推荐…

【智能算法应用】灰狼算法(GWO)在低照度图像增强中的应用

目录 1.算法原理2.数学模型3.结果展示4.参考文献 1.算法原理 【智能算法】灰狼算法(GWO)原理及实现 2.数学模型 对于低照度图像的增强方式可以采用非线性变换函数来对图像的灰度值进行变化,对于不同环境下质量不同的图像,可以将…

YOLOv8+PyQt5输电线路缺陷检测(目前最全面的类别检测,可以从图像、视频和摄像头三种路径检测)

1.效果视频:YOLOv8PyQt5输电线路缺陷检测(目前最全面的类别检测,可以从图像、视频和摄像头三种路径检测)_哔哩哔哩_bilibili 资源包含可视化的输电线路缺陷检测系统,可识别图片和视频当中出现的五类常见的输电线路缺陷…

python:pyqt5案例(简易浏览器)

1、上接pyqt5基础https://blog.csdn.net/weixin_73011353/article/details/138051734https://blog.csdn.net/weixin_73011353/article/details/138051734 2、基本模块 # 定义一个名为BrowserWindow的类,继承自QMainWindow class BrowserWindow(QMainWindow):def _…

美国电子电器产品FCC认证讲解

美国FCC认证简介 FCC全称是Federal Communications Commission,中文为美国联邦通信委员会。于1934年由CommunicationACT建立,是美国政府的一个独立机构,直接对国会负责。FCC通过控制无线电广播、电视、电信、卫星和电缆来协调和国际的通信。涉…

Axure琐碎细节

文章目录 琐碎细节注释预览编写原型图的时候可以把颜色改为灰色标尺竖直文字左对齐Axure中的文字怎么添加元件层级问题如何找到各种各样的形状,比如三角形了 五角星了 十字架了给按钮设置简单的交互动作通过锁来等比例缩放 琐碎细节 注释 有时候我们需要给我们的元…

阿里云操作日记

昨天买了一个超级便宜的阿里云服务器,2核2G,3M固定带宽,40G ESSD Entry云盘,搭载一个简单的系统,就想到了docker轻量级,易于管理 其实docker很好用,第一步就是安装docker 一、docker安装与端口…

盲返模式:电商领域的新玩法与商业创新

大家好,我是微三云周丽,今天给大家分析当下市场比较火爆的商业模式! 小编今天跟大伙们分享什么是什么是盲返模式? 随着互联网的深入发展,电商行业正面临着前所未有的机遇与挑战。在这个竞争激烈的市场环境中&#xff…