STM32的通用定时器中断编程

news2024/11/26 21:24:37

如果遇到需要单片机产生严格时序的场景(比如DAC输出特定模拟信号,GPIO口控制模拟开关),延时函数可能就无法胜任了。最近在工作时公司上级教会了我使用“门票”思维(中断标志位)编写单片机裸机程序,今天写一篇简单的验证实验报告来记录一下。这里我设计了一个简单的实验,单片机开发板上有LED0和LED1,我们让LED0亮500ms之后熄灭,随后LED1亮100ms之后熄灭,以此循环。

1.首先设定挂载定时器的时钟总线频率,我这里使用了默认的16M。

1e1616742a9d4e1da52adc6104ab1aac.png

2.使能定时器并且设置定时器的预分频系数计数周期(自动重装载计数器的值)

5b6e21c409894bcea49d77a52003c19c.png

3.使能中断函数并且调整中断优先级

63b876a9356242d780e7e272f630544b.png

4.生成代码验证实验

 (1)在定时器初始化函数中开启定时器7中断

/* TIM7 init function */
void MX_TIM7_Init(void)
{

  /* USER CODE BEGIN TIM7_Init 0 */

  /* USER CODE END TIM7_Init 0 */

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM7_Init 1 */

  /* USER CODE END TIM7_Init 1 */
  htim7.Instance = TIM7;
  htim7.Init.Prescaler = 3999;
  htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim7.Init.Period = 199;
  htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim7) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM7_Init 2 */
   HAL_TIM_Base_Start_IT(&htim7);//开启定时器7中断
  /* USER CODE END TIM7_Init 2 */

}

(2)在stm32f4xx_it.c中找到这个中断处理函数

d1eadf0db63c4f6991a6c9fecf140b11.png

(3)跳转定义查看函数底层逻辑,找到中断回调函数

1067e76ec54e49e6892aa54a25f36b5b.png

(4)跳转定义,发现属于虚函数可以进行重写

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}

(5)在stm32f4xx_it.c的代码沙盒段内进行虚函数重写,并且定义所需全局变量

/* USER CODE BEGIN EV */
uint8_t g_timTick=0;               //定时器中断节拍
uint8_t g_timSwitch=0;             //定时器中断“门票”
/* USER CODE END EV */
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM7){                              //涉及到多个定时器中断的时候检查就很有必要了
		const uint8_t increment=1;                         //计数步长为常量1
    g_timTick = (g_timTick + increment) % 5;               //5:1的GPIO口时序
	}
	g_timSwitch++;                                         //回调函数发放门票
}
/* USER CODE END 1 */

(6)在stm32f4xx_it.中声明全局变量

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "main.h"            //防止uint8_t无法被编译器识别
/* USER CODE END Includes */

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */

/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */
extern uint8_t g_timTick;          
extern uint8_t g_timSwitch;
/* USER CODE END EC */

(7)主函数编写功能函数

			if(g_timSwitch){
		  g_timSwitch--;                             //进入主循环则收回门票,防止CPU重复判断
			if(g_timTick==0){
			  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);	
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);	
			}else{
			  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);	
		    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
			}	
		}

(8)下载验证

9c315ac46ed8438eaa04645774a4329c.jpeg

观察到单片机开发板的LED灯进行频闪,试验成功。不过从波形上来看会有较大的误差,因为只有500ms的时序是用中断严格实现的。想要精准控制原理就是上述的那些,感兴趣的同学可以自己试一试。

补档:高级定时器的内部时钟计时操作

从模式选择触发模式(Reset Mode),触发源选择内部触发(ITRx即Internal Trigger Input),时钟源选择内部时钟,其他和通用定时器基本相同。最后请大家注意每一个操作的timer挂载的始终总线(APB1之类的)。

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

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

相关文章

预制舱变电站高压室巡检机器人系统

一、背景 预制舱变电站高压室由于空间狭小、设备紧凑,传统的巡检方式往往需要人工进入高压室进行巡检,不仅存在安全风险,而且巡检效率低下,难以满足日益增长的电力设备运维需求。 二、预制舱高压室巡检机器人系统 预制舱高压室巡…

QT MQTT (二)编译与集成

一、QT MQTT 提供 MQTT 客户端服务的 Qt 专用库基于标准化发布 / 订阅协议,用于在设备和组件之间可靠地共享数据。MQTT 是为保证状态正确性、满足高安全标准和交换最小数据而设计的协议,因此被广泛应用于各种分布式系统和物联网解决方案中。 Qt开发MQT…

【SAP Abap】一条SQL语句实现支持报表项配置的财务报表

【SAP Abap】一条SQL语句实现支持报表项配置的财务报表 1、业务背景2、配置项特殊处理3、实现方式(Hana Studio SQL语句)4、实现方式(Abap OpenSQL语句)5、总结 1、业务背景 在财务三大报表之外,业务需要使用类似的科…

[创业之路-121] :制造业企业的必备管理神器-ERP-企业唯一的盈利入口:销售管理

目录 一、ERP销售管理:卖产品 1.1 概述 1.2 核心功能 1. 客户管理: 2. 销售订单管理:最重要的功能**** 3. 销售发货管理: 4. 销售退货管理: 5. 销售统计分析: 二、用友ERP销售管理 2.1 概述 2.2…

UniApp 开发微信小程序教程(一):准备工作和环境搭建,项目结构和配置

文章目录 一、准备工作和环境搭建1. 安装 HBuilderX步骤: 2. 注册微信开发者账号步骤: 3. 创建 UniApp 项目步骤: 二、项目结构和配置1. UniApp 项目结构2. 配置微信小程序修改 manifest.json修改 pages.json 3. 添加首页文件index.vue 示例&…

Lynred在欧洲防务展上将展出新品——“HOT”红外传感器Seegnus。

Lynred在即将举办的巴黎欧洲防务展上将展出其令人瞩目的新品——“HOT”红外传感器Seegnus。这款专为战术视觉设计的大型阵列传感器,以其紧凑的封装和高分辨率的中波红外成像能力,无疑将为航空航天、国防和商业市场带来革命性的突破。 Seegnus传感器拥有…

【经典算法】LeetCode 8. 字符串转换整数 (atoi)(Java/C/Python3/Go实现含注释说明,Easy)

作者主页: 🔗进朱者赤的博客 精选专栏:🔗经典算法 作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名) ❤️觉得文章还…

蔚来汽车AI算法工程师,如何理解注意力?

大家好啊,我是董董灿。 今天分享一个上海蔚来汽车的AI算法岗位面试经验总结帖,面试岗位为算法工程师。 这次面试提到的问题,除了与实习相关内容和反问之外,面试官总共问了8个问题,主要集中在深度学习基础概念的理解上…

裁员裁到大动脉,是一种什么体验!

大家好啊,我是董董灿。 降本增效是每个当老板的人都喜欢挂在嘴边的口头禅,尤其是行业不景气,公司发展遇到瓶颈的时候。 大部分公司降本增效的手段其实非常相似,比较容易实施的手段也就那几种。 要么搞设备自动化和流程自动化&a…

Ubuntu 22.04.1 安装ubuntu有道词典时错误发生

1. Ubuntu环境版本 Linux lipan-Precision-T1700 6.5.0-26-generic #26~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Mar 12 10:22:43 UTC 2 x86_64 x86_64 x86_64 GNU/Linux 2. 有道词典 下载ubuntu系统的deb安装包。 网易有道翻译-支持文本翻译、文档翻译、AIBox英文写作、智…

LoRa126X系列LoRa模块:专为物联网设计而生

LoRa126X是思为无线研发的一款应用于物联网应用的LoRa 前端模块系列,采用 Semtech 公司的 SX1262和SX1268 芯片。该系列模块具有小体积、低功耗,高灵敏度等特点,并且严格遵循无铅工艺生产和测试流程,符合 RoHS 和 Reach 环保标准。…

重学java 80.Junit单元测试

我总是着急的解释我自己,却忘了厚爱无需多言 —— 24.6.21 一、Junit介绍 1.概述 Junit是一个单元测试框架,可以代替main方法去执行其他的方法 2.作用 可以单独执行一个方法,测试该方法是否能跑通 3.注意 Junit是第三方工具,所以使用之前需要导入jar包 二、J…

HTML和CSS基础(一)

前言 HTML(HyperText Markup Language)是一种用于创建网页的标准标记语言。它由各种标签组成,这些标签定义了网页的结构和内容。HTML的早期形式诞生于1989年,由CERN的物理学家Tim Berners-Lee发明,最初用于在科学家之…

Laravel - excel 导入数据

在Laravel中,可以使用maatwebsite/excel这个库来处理Excel文件的导入。 1.用命令行窗口打开项目根目录,使用 Composer 安装 maatwebsite/excel composer require maatwebsite/excel --ignore-platform-reqs 在你的config/app.php文件中注册服务提供者&…

二轴机器人大米装箱机:推动行业持续发展

随着科技的不断发展,机器人技术已经深入到各行各业,为传统生产带来了巨大的变革。其中,二轴机器人大米装箱机以其独特的技术特点和应用价值,正在引领大米包装行业的新潮流。 二轴机器人大米装箱机采用了先进的机械臂设计&#xff…

初阶 《数组》 2. 二维数组的创建和初始化

2. 二维数组的创建和初始化 2.1 二维数组的创建 //数组创建 int arr[3][4]; char arr[3][5]; double arr[2][4];2.2 二维数组的初始化 //数组初始化 int arr[3][4] {1,2,3,4}; int arr[3][4] {{1,2},{4,5}}; int arr[][4] {{2,3},{4,5}};//二维数组如果有初始化&#xff…

Wine 安装GDI

如上发图,安装的时候可能出现错误: Cannot find cabextract. Please install it (e.g. sudo apt-get install cabext 解决方案: 终端执行: sudo apt-get update sudo apt-get install cabextract

使用 MLRun 和 MinIO 设置开发机器

MLOps 之于机器学习,就像 DevOps 之于传统软件开发一样。两者都是一组旨在改善工程团队(开发或 ML)和 IT 运营 (Ops) 团队之间协作的实践和原则。目标是使用自动化来简化开发生命周期,从规划和开发到部署和…

来聊聊redis文件事件驱动的设计

写在文章开头 近期团队安排变得比较紧急,关于redis系列的更新相对放缓一些,而我们今天要讨论的就是redis中关于事件模型的设计,我们都知道redis通过单线程实现高效的网络IO处理,本文会从源码的角度来讲解一下redis中文件事件驱动…

国内怎样使用GPT4 turbo

GPT是当前最为熟知的大模型,它优越的性能一直遥遥领先于其它一众厂商,然而如此优秀的AI在中国境内却是无法正常使用的。本文将告诉你4种使用gpt4的方法,让你突破限制顺利使用。 官方售价是20美元/月,40次提问/3小时,需…