stm32单片机个人学习笔记7(TIM定时中断)

embedded/2024/9/23 17:41:15/

前言

本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。

STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

一、TIM简介

二、定时器类型

三、基本定时器框图

向上的箭头UI表示,计数值等于重装值产生的中断称为“更新中断”,之后会通往NVIC,再配置好NVIC的定时器通道,定时器更新中断就能得到CPU的响应了 

向下的箭头U表示,“更新事件”,其不会触发中断,但能触发内部其它电路的工作

可以将U更新事件映射到TRGO上,然后TRGO就会直接去触发DAC了,实现硬件自动化 

四、通用定时器框图

通用定时器支持向上计数模式和向下计数模式和中央对齐模式

向上计数模式是从0自增,增到重装值(基本定时器仅支持这一模式)

向下计数模式是从重装值自减,减到0

中央对齐模式是先从0自增,增到重装值,再从重装值自减,减到0

ETRF提供外部时钟,就是“外部时钟模式2”

当TRGI当作外部时钟来使用时,就是“外部时钟模式1” ,ITR是来自其它定时器的时钟信号(具体连接关系参考下表),实现定时器的级联

五、定时中断基本结构

六、预分频器时序

预分配缓冲器(影子寄存器) 才是真正起作用的,预分频控制寄存器的供我们读写的,作用是当计数值计到一半时,改变分频系数,其计数频率不会立马发生改变,而是在下一个计数周期才真正改变频率

七、计数器时序

更新中断标志(UIF)需要我们在中断程序中手动清零 

1. 计数器无预装时序

2.计数器有预装时序

有预装就是启用了影子寄存器,作用与分频器的影子寄存器类似,不过这里对应的是重装值 

八、RCC时钟树

九、实例一(定时器定时中断)

1.开启内部时钟

2.设置为内部时钟模式

3.时基单元初始化

4.清除系统启动产生的中断标志位(不然一启动就会产生一个中断事件)

5.中断输出控制 

6.NVIC分组及初始化

7.运行控制(开启计数)

Timer.c 

#include "stm32f10x.h"                  // Device headervoid Timer_Init(void)
{//开启内部时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//设置为内部时钟模式TIM_InternalClockConfig(TIM2);//时基单元初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 1000 - 1;TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//清除系统启动产生的中断标志位TIM_ClearFlag(TIM2, TIM_IT_Update);//中断输出控制TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//NVIC分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC初始化NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);//运行控制TIM_Cmd(TIM2, ENABLE);
}//中断函数
/*
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update)==SET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}
*/

 main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"uint16_t Num;int main(void)
{OLED_Init();Timer_Init();OLED_ShowString(1,1,"Num:");while (1){OLED_ShowNum(1,5,Num,5);OLED_ShowNum(2,5,TIM_GetCounter(TIM2),5);}
}void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update)==SET){Num++;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}

 十、实例二(定时器外部时钟)

思路与实例一基本相同

Timer.c 

#include "stm32f10x.h"                  // Device header/*** @brief  定时器2初始化* @param  无* @retval 无*/
void Timer_Init(void)
{//开启内部时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//初始化GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//设置为外部时钟模式2TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);//时基单元初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//清除系统启动产生的中断标志位TIM_ClearFlag(TIM2, TIM_IT_Update);//中断输出控制TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//NVIC分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC初始化NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);//运行控制TIM_Cmd(TIM2, ENABLE);
}/*** @brief  获取TIM2的计数值* @param  无* @retval 计数值*/
uint16_t Timer_GetCounter(void)
{return TIM_GetCounter(TIM2);
}/*** @brief  定时器2中断函数* @param  无* @retval 无*/
/*
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update)==SET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}
*/

 main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"uint16_t Num;int main(void)
{OLED_Init();Timer_Init();OLED_ShowString(1,1,"Num:");OLED_ShowString(2,1,"CNT:");while (1){OLED_ShowNum(1,5,Num,5);OLED_ShowNum(2,5,Timer_GetCounter(),5);}
}void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update)==SET){Num++;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}

 


http://www.ppmy.cn/embedded/115707.html

相关文章

【Python机器学习】NLP信息提取——值得提取的信息

目录 提取GPS信息 提取日期 如下一些关键的定量信息值得“手写”正则表达式: GPS位置;日期;价格;数字。 和上述可以通过正则表达式轻松捕获的信息相比,其他一些重要的自然语言信息需要更复杂的模式: 问…

【JAVA入门】Day47 - 线程

【JAVA入门】Day47 - 线程 文章目录 【JAVA入门】Day47 - 线程一、并发和并行二、多线程的实现方式2.1 继承 Thread 类的方式2.2 实现 Runnable 接口的方式2.3 利用 Callable 接口实现 三、Thread 类中常见的成员方法四、线程的调度和优先级4.1 抢占式调度4.2 优先级4.3 守护线…

【开源免费】基于SpringBoot+Vue.JS服装商城系统(JAVA毕业设计)

本文项目编号 T 046 ,文末自助获取源码 \color{red}{T046,文末自助获取源码} T046,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

旷视轻量化网络shufflenet算法解读

目录 预备知识 1. 回顾MobileNet V1的核心思想---深度可分离卷积 2.ShuffleNet主要有两个创新点 2.1 分组卷积与11分组卷积 2.2 channel Shuffle(通道重排) 2.3 通道重排过程 3. ShuffleNet网络结构 3.1 ShuffleNet unit 3.2 不同分组数的Shu…

调用系统的录音设备提示:line with format PCM_SIGNED 16000.0 Hz

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 16000.0 Hz, 8 bit, mono, 1 bytes/frame, not supported. 打开 设置->隐私->麦克风->允许应用访问你的麦克风 与 16000Hz没关系 与 16000Hz没关系 与 16000Hz没关系

thinkPHP 8.0.4 安装

windows 上安装最新版 thinkPHP8.0.4 下载phpStudy V8.1:小皮面板安装Composer2.x,Composer是PHP的一个依赖管理工具,主要功能包括依赖管理、版本控制、自动加载、扩展开发以及集成其他工具。安装 php8.0.2 4. 网站-管理-compose&#xff0c…

Qt之QFuture理解

结构 #mermaid-svg-J9J683RG8QjtEqoM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-J9J683RG8QjtEqoM .error-icon{fill:#552222;}#mermaid-svg-J9J683RG8QjtEqoM .error-text{fill:#552222;stroke:#552222;}#merm…

mac m1 electron生产环境使用prisma,sqlite

最近在用electron开发一个适合自己的小应用,技术选型中使用prisma和sqlite在进行数据存储,写这篇文章的目的就是用来记录下遇到的一些问题。 开发环境使用prisma 1、开发环境使用prisma非常的简单,只需要按照教程安装prisma,然后…