上位机图像处理和嵌入式模块部署(f103 mcu定时器配置)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        在mcu开发过程当中,有一种开发模式用的比较多,那就是中断+while(1)。这里面的中断,又是以定时器中断最为普遍。很多时候我们使用mcu,恰恰是看中了它的实时性。比如说,在运动控制中,如果以24ms作为一个周期,那么第一个6ms、第二个6ms、一直到最后一个6ms,每一个6ms做的事情都是不一样的。

        所以,对于实时性很强的操作,我们就直接在中断里面完成对应的工作。那些实时性一般的代码就放到后台来做。以前、后台的角度来说,中断处理类似于前台,while(1)类似于后台。前台如果说是处理业务,那么后台处理什么呢,通常就是日志输出、看门狗检测、数据统计等等,这都是可以放在后台来做的。今天,我们就来看看在mcu下面,定时器是怎么做的。

1、查看main函数

        首先还是查看main函数,看看如果要使用定时器,需要做些什么,

int main(void)
{
    SystemClock_Config();
	LED_GPIO_Config();
	SysTick_Init();

	while(1)                            
	{
	  LED1_ON; 
	  Delay_us(1000);
	  LED1_OFF;
	  Delay_us(1000);
	}
}

        main函数比较简单,除了mcu设置、gpio设置之外,看到一个新的配置,那就是SysTick_Init。剩下来的代码就比较简单了,从名字上就可以看出,这是一个LED1点亮和熄灭的功能。代码过程当中采用了延时函数,并且这个延时函数应该和今天谈到的定时器有关。

2、定时器初始化

        前面看到了定时器初始化函数,下面就看看SysTick_Init是怎么实现的。

void SysTick_Init(void)
{
	if (HAL_SYSTICK_Config(SystemCoreClock / 1000))
	{ 
		/* Capture error */ 
		while (1);
	}
}

        代码还是比较简单的,主要就是设置一下定时周期。后面的1000除数,表示设置的定时器周期是多少,假设1s的频率是SystemCoreClock,那么除以1000,代表定时中断的周期是1ms。

3、延时判断

        LED1点亮和熄灭的时候,使用到了函数Delay_us。那我们看下,这个函数是怎么实现的,

void Delay_us(__IO u32 nTime)
{ 
	TimingDelay = nTime;	

	while(TimingDelay != 0);
}

        代码不复杂,就是把参数nTime赋值给TimingDelay,接下来看TimingDelay什么时候变成0。因为没有看到其他地方对TimingDelay进行处理,所以应该是中断代码对TimingDelay进行了修改。

4、定时器中断

        直接到stm32f1xx_it.c下面寻找对应的定时器中断函数,

void SysTick_Handler(void)
{
  TimingDelay_Decrement();
}

        通过内容,发现定时器中断函数里面,直接调用了TimingDelay_Decrement子函数,继续分析,

void TimingDelay_Decrement(void)
{
	if (TimingDelay != 0x00)
	{ 
		TimingDelay--;
	}
}

        看到这个函数之后,其实就大致明白怎么回事了。原来在TimingDealy_Decrement进行了设置,只要TimeingDelay不等于0,那么每次中断的时候就会进行递减1的处理。不过因为我们定时器的精度是1ms,所以如果延时只有1ms,那么其实是不准的。

        但是如果延时的精度要求不高,比如今天使用的1s延时,那就没啥问题。

5、不变的LED1修改

        为了验证实验效果,这里通过LED1闪烁的方法进行验证,所以第一步就是需要把pin的位置修改为pc13,接下来就是烧录版本、按下复位键,如果看到led发生了闪烁,那代表一切ok;否则就要好好检查下硬件接线和软件代码了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电机控制系列模块解析(22)—— 零矢量刹车

一、零矢量刹车 基本概念 逆变器通常采用三相桥式结构,包含六个功率开关元件(如IGBT或MOSFET),分为上桥臂和下桥臂。每个桥臂由两个反并联的开关元件组成,上桥臂和下桥臂对应于电机三相绕组的正负端。正常工作时&…

利用EAS自动生成数据模型和sql脚本

EAS适用于敏捷开发中小系统,这节主要讲解EAS对应的模型和数据库脚本输出应用。 在这个应用程序中,用户可自定义实体模型和枚举模型,只要选择相应的实体或者枚举进行右击添加即可。 解决方案参数设定,在解决方案的设定中可设置项目名称、通用语言,命名空间和输出位置。 连…

Ollama| 搭建本地大模型,最简单的方法!效果直逼GPT

很多人想在本地电脑上搭建一个大模型聊天机器人。总是觉得离自己有点远,尤其是对ai没有了解的童鞋。那么今天我要和你推荐ollama,无论你是否懂开发,哪怕是零基础,只需十分钟,Ollama工具就可以帮助我们在本地电脑上搭建…

智能合作:多AI协同助力传统工作流

背景介绍 红杉资本2024 AI AGENT大会上吴恩达再次介绍了AI四大设计模式即: 反思(Reflection);工具使用(Tool use);规划(Planning);多智能体协作(Multi-agent collaboration)&#…

centos下安装kibana7.12.1版本并进行相关配置

1、下载与es版本对应的安装包 wget https://artifacts.elastic.co/downloads/kibana/kibana-7.12.1-linux-x86_64.tar.gz 2、解压压缩包 tar -zxvf kibana-7.12.1-linux-x86_64.tar.gz 3、进入到config目录下修改kibana.yml cd /home/soft/kibana-7.12.1-linux-x86_64/config v…

Excel查找匹配函数(VLOOKUP):功能与应用解析

文章目录 概述VLOOKUP函数语法查询并返回单列结果查找并返回多列结果MATCH函数VLOOKUPMATCH 从右向左逆向查找:INDEX函数INDEXMATCH 函数匹配方式查找匹配注意事项函数名称错误: #NAME?值错误:#VALUE!引用错误:#REF!找不到数据:#…

C++学习/复习4--与类相关的概念/默认成员函数/运算符重载/Date类实现案例

一、类和对象 1.本章概要 2.C中的结构体(struct与class) 升级为类 (1)类及成员函数的两种定义方式 声明与定义分离 (2)权限 注意1:struct/class在权限上的区别 (3)封装 (4&#x…

告诉老板,AI大模型应该这样部署!

导语 随着大语言模型创新的快速步伐,企业正在积极探索用例并将其第一个生成式人工智能应用程序部署到生产中。 随着今年LLM或LLMOps的部署正式开始,企业根据自己的人才、工具和资本投资结合了四种类型的LLM部署方法。请记住,随着新的 LLM 优…

[数据结构] -- 双向循环链表

🌈 个人主页:白子寰 🔥 分类专栏:C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分82)&#…

Java实现图书系统

首先实现一个图书管理系统,我们要知道有哪些元素? 1.用户分成为管理员和普通用户 2.书:书架 书 3.操作的是: 书架 目录 第一步:建包 第二步:搭建框架 首先:完成book中的方法 其次:完成BookList 然后:完成管理员界面和普通用户界面 最后:Main 第三步:细分方法 1.退…

十二、shell编程之awk

12.1 什么是awk 虽然sed编辑器是非常方便自动修改文本文件的工具,但其也有自身的限制。通常你需要一个用来处理文件中的数据的更高级工具,它能提供一个类编程环境来修改和重新组织文件中的数据。这正是awk能够做到的。 awk程序是Unix中的原始awk程序的…

JVM(三)

在上一篇中,介绍了JVM组件中的类加载器,以及相关的双亲委派机制。这一篇主要介绍运行时的数据区域 JVM架构图: JDK1.8后的内存结构: (图片来源:https://github.com/Seazean/JavaNote) 而在运行时数据区域中&#…

Redis第18讲——Redis和Redission实现延迟消息

即使不是做电商业务的同学,也一定知道订单超时关闭这种业务场景,这个场景大致就是用户下单后,如果在一定时间内未支付(比如15分钟、半小时),那么系统就会把这笔订单给关闭掉。这个功能实现的方式有很多种&a…

Windows远程连接命令?

Windows操作系统提供了多种远程连接命令,使用户可以通过网络连接到远程计算机,并在远程操作系统上执行操作。远程连接命令可方便实现远程工作、故障排查和系统维护等任务。本文将介绍几种常见的Windows远程连接命令及其基本使用方法。 远程连接命令 Win…

面向对象编程的奥秘:封装与继承

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、封装的魅力 封装的应用 封装示例 二、继承的力量 继承的应用 继承示例 三、总结 一…

OpenWrt U盘安装使用 详细教程 x86/64平台 软路由实测 系列一

1 官方稳定 版:OpenWrt 23.05 OpenWrt Downloads #根据实际情况选择 PC支持uefi,选择版本:https://downloads.openwrt.org/releases/23.05.3/targets/x86/64/openwrt-23.05.3-x86-64-generic-ext4-combined-efi.img.gz 2 rufus 制作U盘启动 3 制作好的U盘,接入主…

Maven多环境打包配置

一、启动时指定环境配置文件 在启动springboot应用的jar包时,我们可以指定配置文件,通常把配置文件上传到linux服务器对应jar包的同级目录,或者统一的配置文件存放目录 java -jar your-app.jar --spring.config.location/opt/softs/applicat…

新能源汽车的电驱热管理

前言 新能源汽车的电驱热管理是指维持电动汽车电池、电机和电控系统在适宜的工作温度范围内,保障车辆高效、安全、稳定运行的技术方案。随着新能源汽车的快速发展和普及,电驱热管理技术也日益成为关注焦点。本文将从电池、电机和电控系统三个方面介绍新…

Linux--线程的认识(一)

线程的概念 线程(Thread)是操作系统中进行程序执行的最小单位,也是程序调度和分派的基本单位。它通常被包含在进程之中,是进程中的实际运作单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线…

【leetcode面试经典150题】-80. 删除有序数组中的重复项 II

【leetcode面试经典150题】-80. 删除有序数组中的重复项 II 1 题目介绍2 个人解题思路2.1 代码2.2 思路 3 官方题解 1 题目介绍 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组…