STM32基本定时器中断

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、STM32定时器的结构?
    • 1. 51定时器的结构
      • 1.1如何实现定时1s的功能?
    • 2. stm32定时器的结构
      • 2.1 通用定时器
  • 二、使用步骤
    • 1.开启时钟
    • 2.初始化定时器
    • 3.中断配置(分组、优先级)
      • 3.1 配置中断源
      • 3.2配置中断优先级
      • 3.3 开启定时器
      • 3.4 中断服务函数
      • 3.5判断中断源, 清除中断源
  • 三、参考初始化函数
    • 3.1写成外设初始化函数,方便main函数调用
    • 3.2中断函数
    • 3.3 中断服务函数加入时分秒
  • 四、测试验证
    • 4.1时钟使能查看
    • 4.2 更新中断状态位
    • 4.3 其他状态和配置
  • 五、拓展
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

定时器有什么用?精准延时,PWM,做一个时钟:年月日,时分秒。时钟最基本的就是1s怎么来?


提示:以下是本篇文章正文内容,下面案例可供参考

一、STM32定时器的结构?

1. 51定时器的结构

在这里插入图片描述

1.1如何实现定时1s的功能?

在这里插入图片描述

  1. 选定时功能
  2. 装初值
  3. 配置定时器中断
  4. 中断里面计数,计数多少次根据定时的需要

2. stm32定时器的结构

在这里插入图片描述

2.1 通用定时器

部分芯片时没有基本定时器的

在这里插入图片描述
有基本定时器的型号
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 时钟来源RCC
  2. 控制器,应该是要使能
  3. 分频器
  4. 装计数初值
  5. 中断

二、使用步骤

1.开启时钟

在这里插入图片描述

代码如下(示例):

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

2.初始化定时器

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

代码如下(示例):

//TIM_TimeBaseInitStruct.TIM_ClockDivision=
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=50000-1;
TIM_TimeBaseInitStruct.TIM_Prescaler= 72-1;
//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct);

3.中断配置(分组、优先级)

3.1 配置中断源

timer6只有溢出中断
在这里插入图片描述

	TIM_ITConfig( TIM6, TIM_IT_Update, ENABLE);

3.2配置中断优先级

	NVIC_InitStruct.NVIC_IRQChannel=TIM6_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;   //0-3NVIC_InitStruct.NVIC_IRQChannelSubPriority=  1;        //0-3NVIC_Init(&NVIC_InitStruct);

3.3 开启定时器

出了GPIO今后每个外设都要单独开启

	TIM_Cmd( TIM6, ENABLE);      //使能

3.4 中断服务函数

在启动文件找到中断向量表,然后完成中断服务函数

void TIM6_IRQHandler()
{if(TIM_GetITStatus( TIM6, TIM_IT_Update)){TIM_ClearITPendingBit(TIM6, TIM_IT_Update);num++;if(num==20){num=0;//led取反}}
}

3.5判断中断源, 清除中断源

在这里插入图片描述

三、参考初始化函数

3.1写成外设初始化函数,方便main函数调用

void timer6()
{/*1.开启APB1时钟   72MHz2.配置定时器6    TimeInit()  72预分配,0-65535     1000000us/50000us =CNT=20         定时时间/中断溢出时间=计数值3.中断配置       分组,优先级 。开启中断源4.中断服务函数   计数值, 1us  ,计数20次后让一个LED取反*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);//TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period=50000-1;TIM_TimeBaseInitStruct.TIM_Prescaler= 72-1;//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct);//开启中断:TIM_ITConfig( TIM6, TIM_IT_Update, ENABLE);TIM_Cmd( TIM6, ENABLE);      //使能NVIC_InitStruct.NVIC_IRQChannel=TIM6_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;   //0-3NVIC_InitStruct.NVIC_IRQChannelSubPriority=  1;        //0-3NVIC_Init(&NVIC_InitStruct);}

3.2中断函数

void TIM6_IRQHandler()
{if(TIM_GetITStatus( TIM6, TIM_IT_Update)){TIM_ClearITPendingBit(TIM6, TIM_IT_Update);num++;if(num==20){num=0;//led取反}}
}

3.3 中断服务函数加入时分秒

void TIM6_IRQHandler()
{if(TIM_GetITStatus( TIM6, TIM_IT_Update)){TIM_ClearITPendingBit(TIM6, TIM_IT_Update);num++;if(num==20){num=0;//led取反GPIOA->ODR^=0x0100;         //   异或,相同为0,不同为1 //拿0 去异或,原来是0,还是0;原来是1,还是1。既可以保持不变//拿1 去异或,原来是0,变成1;原来是0,变成1。起到取反的作用second++;one_second_flag=1;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24){hour=0;}}}}}
}

四、测试验证

在中断服务函数设定断点

在这里插入图片描述

4.1时钟使能查看

在这里插入图片描述

4.2 更新中断状态位

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

4.3 其他状态和配置

**加粗样式**

五、拓展

串口: 时钟

  1. 通过串口获取时分秒
  2. 通过串口修改时间

在这里插入图片描述

总结

深入浅出,从51单片机定时结构到stm32定时结构引导讲解了,STM32如何实现定时1s的原理,并工程实现

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

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

相关文章

Linux文本编辑器vim使用和配置详解

vim介绍 ​ vim是Linux的一款文本编辑器,可以用来编辑代码,而且支持语法高亮,还可以进行一系列配置使vim更多样化。也可以运行于windows,mac os上。 ​ vim有多种模式,但目前我们只介绍绝大多数场景用的到的模式&…

SpringBoot整合数据库版本管理工具Liquibase,赶紧整起来!

SpringBoot整合数据库版本管理工具Liquibase 背景一、什么是数据库版本管理工具?数据库版本管理工具主要特性什么是数据库版本管理工具Flyway和Liquibase对比及选型 二、Liquibase整合步骤1.引入pom依赖2.配置application.yml3.新建master.xml(用于配置你…

什么是 DevOps

DevOps是一套融合软件开发(Dev)和 IT 运营(Ops)的实践,旨在缩短应用程序开发周期并确保以高软件质量持续交付,通过采用 DevOps 实践,您可以帮助组织更可靠、更快速、更高效地交付软件。 什么是…

pytorch 中 nn.Conv2d 解释

1. pytorch nn.Con2d 中填充模式 torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_mode‘zeros’, deviceNone, dtypeNone) 1.1 padding 参数的含义 首先 ,padd N, 代表的是 分别在 上下&…

Android Studio布局

线性布局 水平或竖直排列子元素的布局容器 相对布局 可针对容器内每个子元素设置相对位置(相对于父容器或同级子元素的位置) 网格布局 找了下面这篇文章连接可以参考(不再赘述) GridLayout(网格布局) | 菜鸟教程 (runoob.com) …

零基础搭建Nextcloud私有云盘并通过内网穿透实现远程访问

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

Apache HttpClient库编写的Scala程序

Apache HttpClient库编写的Scala下载器程序,用于下载图片。代码如下: import org.apache.http.HttpHost import org.apache.http.client.HttpClients import org.apache.http.client.methods.HttpHead import org.apache.http.impl.client.CloseableHtt…

【Solidity】Remix在线环境及钱包申请

好久没有学习区块链方面的知识了,目前通过自学大致掌握了Fabric联盟链的搭建,链码编写、部署,api调用,可以独立开发出一些基于fabric的应用,感觉开发出去中心化的应用还是很有意思的,因为他与之前开发的ssm…

Android Studio的Java项目种运行main()的方法

首先随便在项目里面建一个类 public class TestSocket {public static void main(String[] args) {System.out.println("hahah");}}直接运行时会直接报错的 在项目的 .idea 添加代码 <option name"delegatedBuild" value"false"/> 再…

微信小程序获取剪切板的内容到输入框中

xml代码 <navigation-bar title"Weixin" back"{{false}}" color"black" background"#FFF"></navigation-bar> <view><input placeholder"请输入内容" name"content" type"text" …

蓝桥杯每日一题2023.11.2

题目描述 等差素数列 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题我们需要求出最小的公差并且长度为10&#xff0c; 1.确保序列开始为素数 2.确定枚举的个数 注意&#xff1a;序列中数只是d的变化&#xff0c;可以通过此计算将开始数字后9个数字都计算出来&#xff0c;d是…

[极客大挑战 2019]Knife 1(两种解法)

题目环境&#xff1a; 这道题主要考察中国菜刀和中国蚁剑的使用方法 以及对PHP一句话木马的理解 咱们先了解一下PHP一句话木马&#xff0c;好吗&#xff1f; **eval($_POST["Syc"]);** **eval是PHP代码执行函数&#xff0c;**把字符串按照 PHP 代码来执行。 $_POST P…