【STM32】STM32学习笔记-定时器定时中断 定时器外部时钟(14)

news2024/9/29 21:23:59

00. 目录

文章目录

    • 00. 目录
    • 01. 定时器中断相关API
      • 1.1 TIM_InternalClockConfig
      • 1.2 TIM_TimeBaseInit
      • 1.3 TIM_TimeBaseInitTypeDef
      • 1.4 TIM_ClearFlag
      • 1.5 TIM_ITConfig
      • 1.6 TIM_Cmd
      • 1.7 中断服务函数
      • 1.8 TIM_ETRClockMode2Config
    • 02. 定时器定时中断接线图
    • 03. 定时器定时中断示例
    • 04. 定时器外部时钟接线图
    • 05. 定时器外部时钟示例
    • 06. 程序下载
    • 07. 附录

01. 定时器中断相关API

1.1 TIM_InternalClockConfig

/**
  * @brief  Configures the TIMx internal Clock
  * @param  TIMx: where x can be  1, 2, 3, 4, 5, 8, 9, 12 or 15
  *         to select the TIM peripheral.
  * @retval None
  */
void TIM_InternalClockConfig(TIM_TypeDef* TIMx)
功能:
	设置 TIMx 内部时钟
参数:
    TIMx:x 可以是 23 或者 4,来选择 TIM 外设    
返回值:

1.2 TIM_TimeBaseInit

/**
  * @brief  Initializes the TIMx Time Base Unit peripheral according to 
  *         the specified parameters in the TIM_TimeBaseInitStruct.
  * @param  TIMx: where x can be 1 to 17 to select the TIM peripheral.
  * @param  TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef
  *         structure that contains the configuration information for the 
  *         specified TIM peripheral.
  * @retval None
  */
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
功能:
	根据 TIM_TimeBaseInitStruct 中指定的参数初始化 TIMx 的时间基数单位
参数:
    TIMx:x 可以是 23 或者 4,来选择 TIM 外设
    TIMTimeBase_InitStruct:指向结构 TIM_TimeBaseInitTypeDef 的指针,包含了TIMx 时间基数单位的配置信息    
返回值:

1.3 TIM_TimeBaseInitTypeDef

/** 
  * @brief  TIM Time Base Init structure definition
  * @note   This structure is used with all TIMx except for TIM6 and TIM7.    
  */

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_Period
	TIM_Period 设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x00000xFFFF之间。
TIM_Prescaler
	TIM_Prescaler 设置了用来作为 TIMx 时钟频率除数的预分频值。它的取值必须在0x00000xFFFF之间。
  
/** @defgroup TIM_Counter_Mode 
  * @{
  */
#define TIM_CounterMode_Up                 ((uint16_t)0x0000)
#define TIM_CounterMode_Down               ((uint16_t)0x0010)
#define TIM_CounterMode_CenterAligned1     ((uint16_t)0x0020)
#define TIM_CounterMode_CenterAligned2     ((uint16_t)0x0040)
#define TIM_CounterMode_CenterAligned3     ((uint16_t)0x0060)
    
    
/** @defgroup TIM_Clock_Division_CKD 
  * @{
  */
#define TIM_CKD_DIV1                       ((uint16_t)0x0000)
#define TIM_CKD_DIV2                       ((uint16_t)0x0100)
#define TIM_CKD_DIV4                       ((uint16_t)0x0200)
    
    
TIM_RepetitionCounter 只用在高级定时器中    

1.4 TIM_ClearFlag

/**
  * @brief  Clears the TIMx's pending flags.
  * @param  TIMx: where x can be 1 to 17 to select the TIM peripheral.
  * @param  TIM_FLAG: specifies the flag bit to clear.
  *   This parameter can be any combination of the following values:
  *     @arg TIM_FLAG_Update: TIM update Flag
  *     @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag
  *     @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag
  *     @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag
  *     @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag
  *     @arg TIM_FLAG_COM: TIM Commutation Flag
  *     @arg TIM_FLAG_Trigger: TIM Trigger Flag
  *     @arg TIM_FLAG_Break: TIM Break Flag
  *     @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag
  *     @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag
  *     @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag
  *     @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag
  * @note
  *   - TIM6 and TIM7 can have only one update flag. 
  *   - TIM9, TIM12 and TIM15 can have only TIM_FLAG_Update, TIM_FLAG_CC1,
  *      TIM_FLAG_CC2 or TIM_FLAG_Trigger. 
  *   - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_FLAG_Update or TIM_FLAG_CC1.   
  *   - TIM_FLAG_Break is used only with TIM1, TIM8 and TIM15. 
  *   - TIM_FLAG_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17.   
  * @retval None
  */
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)
功能:
	清除 TIMx 的待处理标志位
参数:
    TIMx:x 可以是 23 或者 4,来选择 TIM 外设
    TIM_FLAG:待清除的 TIM 标志位   
返回值:

1.5 TIM_ITConfig

/**
  * @brief  Enables or disables the specified TIM interrupts.
  * @param  TIMx: where x can be 1 to 17 to select the TIMx peripheral.
  * @param  TIM_IT: specifies the TIM interrupts sources to be enabled or disabled.
  *   This parameter can be any combination of the following values:
  *     @arg TIM_IT_Update: TIM update Interrupt source
  *     @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source
  *     @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source
  *     @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source
  *     @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source
  *     @arg TIM_IT_COM: TIM Commutation Interrupt source
  *     @arg TIM_IT_Trigger: TIM Trigger Interrupt source
  *     @arg TIM_IT_Break: TIM Break Interrupt source
  * @note 
  *   - TIM6 and TIM7 can only generate an update interrupt.
  *   - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1,
  *      TIM_IT_CC2 or TIM_IT_Trigger. 
  *   - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1.   
  *   - TIM_IT_Break is used only with TIM1, TIM8 and TIM15. 
  *   - TIM_IT_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17.    
  * @param  NewState: new state of the TIM interrupts.
  *   This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
功能:
	使能或者失能指定的 TIM 中断
参数:
    TIMx:x 可以是 23 或者 4,来选择 TIM 外设
    TIM_IT:待使能或者失能的 TIM 中断源
    NewState:TIMx 中断的新状态    
返回值:

1.6 TIM_Cmd

/**
  * @brief  Enables or disables the specified TIM peripheral.
  * @param  TIMx: where x can be 1 to 17 to select the TIMx peripheral.
  * @param  NewState: new state of the TIMx peripheral.
  *   This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
功能:
	使能或者失能 TIMx 外设
参数:
    TIMx:x 可以是 23 或者 4,来选择 TIM 外设
    NewState: 外设 TIMx 的新状态   
返回值:

1.7 中断服务函数

参考程序

void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Num ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

1.8 TIM_ETRClockMode2Config

/**
  * @brief  Configures the External clock Mode2
  * @param  TIMx: where x can be  1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
  * @param  TIM_ExtTRGPrescaler: The external Trigger Prescaler.
  *   This parameter can be one of the following values:
  *     @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF.
  *     @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2.
  *     @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4.
  *     @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8.
  * @param  TIM_ExtTRGPolarity: The external Trigger Polarity.
  *   This parameter can be one of the following values:
  *     @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active.
  *     @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active.
  * @param  ExtTRGFilter: External Trigger Filter.
  *   This parameter must be a value between 0x00 and 0x0F
  * @retval None
  */
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter)
功能:
	配置TIMx外部时钟模式2 
参数:
    TIMx:x可以是23或者4,来选择TIM外设
    TIM_ExtTRGPrescaler:外部触发预分频
    TIM_ExtTRGPolarity:外部时钟极性    
    ExtTRGFilter:外部触发滤波器。该参数取值在0x00xF之间。        
返回值:

02. 定时器定时中断接线图

在这里插入图片描述

03. 定时器定时中断示例

timer.h

#ifndef __TIMER_H__
#define __TIMER_H__


#include "stm32f10x.h"                  // Device header


void timer_init(void);


#endif


timer.c

#include "timer.h"


void timer_init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	//1. 开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	//2. 开启定时器2内部时钟
	TIM_InternalClockConfig(TIM2);
	
	//3. 初始化定时器
	TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //高级定时器使用
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
	
	//4. 清除中断标志
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	
	//5. 使能中断
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	//6. 设置NVIC
	NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);

	//7. 使能定时器
	TIM_Cmd(TIM2, ENABLE);
}

main.c

#include "stm32f10x.h"

#include "delay.h"
#include "oled.h"
#include "timer.h"


int16_t num;

 int main(void)
 {		 
	//初始化
	OLED_Init();

	 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	 timer_init();
	
	 OLED_ShowString(1, 1, "num:");
	
	while (1)
	{
		OLED_ShowNum(1, 5, num, 5);
	}
	 
	 return 0;
 }

 
 void TIM2_IRQHandler(void)
 {
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		num ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
	 
 }

04. 定时器外部时钟接线图

在这里插入图片描述

05. 定时器外部时钟示例

timer.h

#ifndef __TIMER_H__
#define __TIMER_H__


#include "stm32f10x.h"                  // Device header


void timer_init(void);


#endif


timer.c

#include "timer.h"


void timer_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	//1. 开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
		
	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);
	
	
	//2. 配置TIMx外部时钟模式2 
	TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0xf);
                            
	//3. 初始化定时器
	TIM_TimeBaseInitStruct.TIM_Period = 10 - 1;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 1 - 1;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //高级定时器使用
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
	
	//4. 清除中断标志
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	
	//5. 使能中断
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	//6. 设置NVIC
	NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);

	//7. 使能定时器
	TIM_Cmd(TIM2, ENABLE);
}


main.c

#include "stm32f10x.h"

#include "delay.h"
#include "oled.h"
#include "timer.h"


int16_t num;

 int main(void)
 {		 
	//初始化
	OLED_Init();

	 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	 timer_init();
	
	 OLED_ShowString(1, 1, "num:");
	
	while (1)
	{
		OLED_ShowNum(1, 5, num, 5);
		OLED_ShowNum(2, 5, TIM_GetCounter(TIM2), 5);
	}
	 
	 return 0;
 }

 
 void TIM2_IRQHandler(void)
 {
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		num ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
	 
 }

 

06. 程序下载

09-定时器定时中断.rar

10-定时器外部时钟.rar

07. 附录

参考: 【STM32】江科大STM32学习笔记汇总

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

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

相关文章

每日算法打卡:数的范围 day 7

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例:输出样例: 题目分析示例代码 原题链接 789. 数的范围 题目难度:简单 题目描述 给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。 对于每个查询&#…

数字孪生在虚拟现实(VR)中的应用

数字孪生在虚拟现实(VR)中的应用为用户提供了更深入、沉浸式的体验,同时通过数字孪生技术模拟真实世界的物理实体。以下是数字孪生在VR中的一些应用,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发…

12月笔记

#pragma once 防止多次引用头文件,保证同一个(物理意义上)文件被多次包含,内容相同的两个文件同样会被包含。 头文件.h与无.h的文件: iostream是C的头文件,iostream.h是C的头文件,即标准的C头文…

电话号码信息收集工具:PhoneInfoga | 开源日报 No.137

sundowndev/phoneinfoga Stars: 11.2k License: GPL-3.0 PhoneInfoga 是一个用于扫描国际电话号码的信息收集框架,它允许用户首先收集基本信息 (如国家、地区、运营商和线路类型),然后使用各种技术来尝试找到 VoIP 提供商或识别所有者。该工具与一系列必…

[MySQL]视图索引以及连接查询案列

目录 1.视图 1.1视图是什么 1.2视图的作用 1.3操作 1.3.1创建视图 1.3.2视图的修改 1.3.3删除视图 1.3.4查看视图 2.索引 2.1什么是索引 2.2为什么要使用索引 2.3索引的优缺点 2.3.1优点 2.3.2缺点 2.4索引的分类 3.连接查询案列 4.思维导图 1.视图 1.1视图是什么 视图…

代码随想录-刷题第四十九天

121. 买卖股票的最佳时机 题目链接:121. 买卖股票的最佳时机 思路:动态规划五步曲 dp[i][0] 表示第i天持有股票所得最多现金,dp[i][1] 表示第i天不持有股票所得最多现金。 一开始现金是0,那么加入第i天买入股票,现金…

深入了解 RDD

深入了解 RDD 案例 明确需求: 在访问日志中,统计独立IP数量 TOP10 查看数据结构: IP,时间戳,Http,Method,Url…… 明确编码步骤 取出IP,生成一个只有IP的数据集简单清洗统计IP出现…

Tomcat Notes: Deployment File

This is a personal study notes of Apache Tomcat. Below are main reference material. - YouTube Apache Tomcat Full Tutorial,owed by Alpha Brains Courses. https://www.youtube.com/watch?vrElJIPRw5iM&t801s 1、Tomcat deployment1.1、Two modes of …

数据结构与算法教程,数据结构C语言版教程!(第二部分、线性表详解:数据结构线性表10分钟入门)九

第二部分、线性表详解:数据结构线性表10分钟入门 线性表,数据结构中最简单的一种存储结构,专门用于存储逻辑关系为"一对一"的数据。 线性表,基于数据在实际物理空间中的存储状态,又可细分为顺序表&#xff…

Java 基础知识点1 (含面试题)

本次Java 知识点主要是关于SE的相关基础,同时也包含了数据结构中的一些API,例如Set,List,Map等,最后也附上了相关重要的面试题,可供大家学习与参考! 目录 重要知识点数据结构API面试题 重要知识点 Java 是一门面向对象…

linux下超级程序!在linux界面实现类图像化界面的操作体验!

linux下超级程序!在linux界面实现类图像化界面的操作体验! 本期带来一个超级程序!在linux界面实现类图像化界面的操作体验。具体功能代码如下: 1500行完整代码想要完成部署,只需在本地创建一个LinuxGJ.sh的文件,然后…

传感数据分析——高通滤波与低通滤波

传感数据分析——高通滤波与低通滤波 文章目录 传感数据分析——高通滤波与低通滤波前言一、运行环境二、Python实现总结 前言 对于传感信号而言,我们可以提取其中的高频信息和低频信息,低频信息往往是信号的趋势,高频信息往往是一些突变或异…

构建自己的私人GPT

创作不易,请大家多鼓励支持。 在现实生活中,很多人的资料是不愿意公布在互联网上的,但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢?于是我们构建自己或公司的私人GPT变得非常重要。 一、本地部署…

win10下vscode+cmake编译C代码操作详解

0 工具准备 1.Visual Studio Code 1.85.1 2.cmake 3.24.01 前言 当我们只有一个.c文件时直接使用vscodeCode Runner插件即可完成编译,如果我们的工程很复杂包含多个.c文件时建议使用cmake来生成对应的make,指导编译器完成编译,否则会提示各…

数字图像处理(图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波)

数字图像处理(图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波) 目录 1 图像灰度变换 1.1 灰度线性变换 1.2 图像二值化 1.3 负象变换 1.4 灰度非线性变换 1.5 程序设计流程图 2 图像直方图及均衡 2.1 直方图 2…

无心剑七绝《高斯黎曼》

七绝高斯黎曼 高耸云端四海惊 斯人伟绩震豪英 黎霞璀璨通灵处 曼妙方程万世名 2024年1月6日 平水韵八庚平韵 《七绝高斯黎曼》是无心剑所作的一首以数学家为主题的七言绝句。全诗巧妙地将两位杰出的数学家——高斯(Carl Friedrich Gauss)与黎曼&#…

大模型机器人原理解析:如何从RT/RT2、Berkeley Gello到发展到斯坦福Mobile ALOHA、Google家务机器人

前言 23年7月,我在朋友圈评估Google的RT2说道: “大模型正在革新一切领域啊,超帅,通过大模型不仅能理解“人话”,还能对“人话”进行推理,并转变为机器人能理解的指令,从而分阶段完成任务。回…

express框架

目录 一、express介绍二、express 使用2.1 express下载2.2 express初体验 三、express 路由3.1 路由的使用3.2 获取参数3.3 获取路由参数 四、express响应设置五、express中间件5.1 什么是中间件5.2 中间件的作用5.3 中间件的类型5.3.1 定义全局中间件5.3.2 多个全局中间件5.3.…

协程池与新脚本语言

今天的主人公名为——Melang。 这是一款使用C语言开发的“新”的脚本语言,然而其已经默默问世了6年之久。 下面笔者就带你走进Melang world。 What is Melang Melang是一款协程并发脚本语言。它是一款解释型,而非编译型语言。 在Melang中&#xff…

html中的form表单以及相关控件input、文本域、下拉select等等的详细解释 ,点赞加关注持续更新~

文章目录 表单创建表单forminput 标签input标签的value属性设置input标签格式单选框多选框上传文件下拉菜单文本域设置文本域格式label 标签按钮 表单 作用&#xff1a;收集用户信息。 使用场景&#xff1a; 登录页面注册页面搜索区域 创建表单form <form action".…