蓝桥杯—SysTick中断精准定时实现闪烁灯

news2024/11/19 13:44:39

在嵌入式系统中,SysTick_Handler 是一个中断服务例程(Interrupt Service Routine, ISR),用于处理 SysTick 定时器的中断。SysTick 定时器通常用于提供一个周期性的定时中断,可以用来实现延时或者周期性任务。

SysTick_Handler中断的周期不一定是固定的1毫秒,它的周期取决于你对系统定时器配置的时钟源和计数器 reload 值。系统定时器通常使用微控制器的主时钟(Core Clock)作为时钟源,并且可以设置为任意时钟周期的N倍来决定中断频率。

但在蓝桥杯中,通常我们的时钟树配置都是一样的,时钟主频为80MHz,此时的SysTick_Handler 为每1ms触发一次中断。

利用这个特性,我们可以实现精准延时。

我们可以在stm32g4xx_it.c的最后找到SysTick_Handler 这个函数。在其中加入一些标志位可实现不少定时的功能。

注意:在中断中不能执行耗时过长的程序,中断通常用于处理需要立即响应的事件,如外部信号变化、定时器到期等。如果中断处理时间过长,会延迟对后续中断事件的响应,从而影响系统的实时性能。因此,中断处理程序应该设计得尽可能短小精悍,只执行必要的、时间关键的操作,如状态保存、事件标记、简单计算等。如果有需要执行耗时较长的程序,应该在中断处理程序中设置一个标志位,然后放在主函数的while(1)里执行。

SysTick_Handler中的程序

u8 led_cnt =0;
void SysTick_Handler(void)
{
  led_cnt++;
	if(led_cnt>100){//用了简单的逻辑,可以改进
		led_flag=1;
	}
	if(led_cnt>200){
		led_flag=0;
		led_cnt=0;
	}
  HAL_IncTick();
}

使LED1以0.1s闪烁。

LED.c

#include "led.h"

_Bool led_flag=0;
void LED_Control(u8 led_ctrl)
{
	//先熄灭所有LED灯
	HAL_GPIO_WritePin(GPIOC,0xff00,GPIO_PIN_SET);		//让PC8~PC15输出高电平,熄灭LED
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);	//打开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);	//关闭锁存器
	
	//根据led_ctrl来点亮对应的LED
	HAL_GPIO_WritePin(GPIOC,led_ctrl<<8,GPIO_PIN_RESET);//根据led_ctrl输出低电平,点亮LED
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);	//打开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);	//关闭锁存器
}
u8 led_ctrl=0x00;
void LED_Process(void){
	if(led_flag==1){
		led_ctrl |= 0x01;
		LED_Control(led_ctrl);
	}
	else {
		led_ctrl &= ~0x01;
		LED_Control(0x00);
	}
}

LD1-LD8分别对应0xff中从低到高的每一位,十六进制转换为四位二进制后更加清晰:

0xff  ----> 1111 1111 (由高到低依次为 LD8 LD7...LD2 LD1)

想点亮哪个灯只需要将那一位置1,然后换算为16进制即可。 

点亮LED1

led_ctrl |= 0x01;

熄灭LED1

led_ctrl &= ~0x01;

使LED1闪烁

led_ctrl ^= 0x01;//^=是按位异或,可以切换LED的状态,如果是亮则熄灭,如果是熄灭则亮

led.h

#ifndef __LED_H
#define __LED_H
#include "main.h"
extern _Bool led_flag;
void LED_Control(u8 led_ctrl);
void LED_Process(void);
extern u8 led_ctrl;
#endif
while (1)
  {
		LED_Process();
  }

将LED_Process()放入while(1)中即可实现led以0.1s闪烁。

QQ视频20240528205900

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

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

相关文章

AWS联网和内容分发之Transit Gateway

将Amazon VPC、AWS账户和本地网络连接到一个网关中。AWS Transit Gateway通过中央枢纽连接Amazon虚拟私有云&#xff08;VPC&#xff09;和本地网络。此连接简化了您的网络&#xff0c;并且结束了复杂的对等关系。Transit Gateway充当高度可扩展的云路由器&#xff0c;每个新的…

HLS入门(Xilinx Vivado 2019.2)——点亮LED仿真

HLS入门——点亮LED仿真 一、HLS简介&#xff08;一&#xff09;什么是HLS&#xff1f;&#xff08;二&#xff09;HLS能做什么&#xff1f;&#xff08;三&#xff09;HLS的使用&#xff08;四&#xff09;HLS的优势&#xff08;五&#xff09;HLS与VHDL/Verilog编程技术的关系…

【机器学习】【深度学习】正则化(Regularization)

概念 正则化&#xff08;Regularization&#xff09;是在机器学习模型中避免过拟合的一种技术。它通过引入一个惩罚项&#xff08;即正则项&#xff09;来限制模型的复杂度&#xff0c;以此来提防模型过度依赖训练数据&#xff0c;捕获数据中的噪音信息而导致过拟合现象。简单…

企业营收分析难?搞定收入认领月底不加班!

在当今日益激烈的市场竞争中&#xff0c;企业的营收分析不仅是衡量经营成果的关键指标&#xff0c;更是指导企业未来发展的重要依据。然而&#xff0c;对于许多企业来说&#xff0c;营收分析的过程往往繁琐且耗时&#xff0c;尤其是月底结账时&#xff0c;大量的数据和复杂的计…

【机器学习300问】95、什么是KNN算法?它和K-means什么关系?

一、KNN算法的定义 KNN&#xff08;K-Nearest Neighbors&#xff09;算法&#xff0c;是一种简单而有效的监督学习方法。它既可以用在分类任务&#xff0c;也可用在回归任务中。KNN算法的核心思想&#xff1a;在特征空间中&#xff0c;如果有一个数据点周围的大多数邻居属于某个…

10. C++异步IO处理库和使用libevent实现高性能服务器

C比较有名的异步IO处理库 libevent 这个主要使用的是epoll。libevthplibuvlibev 我们主要介绍libevent。 libevent重要函数 event_base_new 这个可以对应于epoll_create也就是创建一个实例。还可以初始化libevent所有管理相关的代码。比如说所能用到的队列&#xff0c;栈&a…

OFDM 802.11a的FPGA实现:发射部分的最终实现

目录 1.摘要 2.最终实现的ModelSim仿真 3.Matlab仿真和MoselSim仿真进行对比 4.完整工程 1.摘要 本系统在Xilinx的zynq 7000系列FPGA芯片上实现了一个基于IEEE 802.11a协议的OFDM基带处理发射机的功能。本系统包含了整个发射机的所有功能&#xff0c;包括序列训练符号、Si…

现代信号处理11_Spectral Analysis谱分析(CSDN_20240526)

谱分析与傅里叶变换 对于一个信号&#xff0c;一方面可以从时域上对其进行分析&#xff0c;另一方面也可以从频域上对其进行认识&#xff0c;对信号进行频谱分析能够帮助我们了解能量在频域上的分布。 确定性信号的能量通常是有限的&#xff0c;而平稳随机信号的能量通常是无限…

No input file specified.(‘.user.ini’文件问题宝塔复制到本地,其他情况可跳过)

症状 病因 一般是宝塔直接copy到本地的情况。 宝塔面板中的.user.ini文件是一个重要的配置文件&#xff0c;它主要用于配置PHP运行环境和网站环境。以下是.user.ini文件的主要作用和操作建议&#xff1a; 防止跨目录访问和文件跨目录读取。这是.user.ini文件的主要作用之一&a…

kafka-消费者组-点对点测试

文章目录 1、点对点测试1.1、获取 kafka-consumer-groups.sh 的帮助信息1.2、列出所有的消费者组1.3、创建消费者1并指定组 my_group11.4、创建消费者2并指定组 my_group11.5、创建消费者3并指定组 my_group11.6、创建生产者发送消息到 my_topic1 主题1.6.1、发送第一条消息rom…

用循环神经网络预测股价

循环神经网络可以用来对时间序列进行预测&#xff0c;之前我们在介绍循环神经网络RNN,LSTM和GRU的时候都用到了正弦函数预测的例子&#xff0c;其实这个例子就是一个时间序列。而在众多的时间序列例子中&#xff0c;最普遍的就是股价的预测了&#xff0c;股价序列是一种很明显的…

【PG16】后 EL 7 时代,PG 16 如何在 CentOS 7 上运行

↑ 关注“少安事务所”公众号&#xff0c;欢迎⭐收藏&#xff0c;不错过精彩内容~ ★ 本文写于 2023-09-29 PostgreSQL 16 Released 9/14, PostgreSQL 16 正式发布。从发布公告^1 和 Release Notes^2 可以看到 PG16 包含了诸多新特性和增强改进。 性能提升&#xff0c;查询计划…

ssm超市管理系统java超市进销存管理系统jsp项目

文章目录 超市进销存管理系统一、项目演示二、项目介绍三、系统部分功能截图四、七千字项目文档五、部分代码展示六、底部获取项目源码和七千字项目文档&#xff08;9.9&#xffe5;带走&#xff09; 超市进销存管理系统 一、项目演示 超市进销存管理系统 二、项目介绍 角色分…

Dynadot API调整一览

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

算法设计第七周(应用哈夫曼算法解决文件归并问题)

一、【实验目的】 &#xff08;1&#xff09;进一步理解贪心法的设计思想 &#xff08;2&#xff09;掌握哈夫曼算法的具体应用 &#xff08;3&#xff09;比较不同的文件归并策略&#xff0c;探讨最优算法。 二、【实验内容】 设S{f1,…,fn}是一组不同的长度的有序文件构…

vue脚手架与创建vue项目

一、前言 vue脚手架的安装与创建vue项目需要先行安装配置node与npm&#xff0c;详情可以看node、npm的下载、安装、配置_node 下载安装-CSDN博客 二、vue脚手架的使用 1、vue与vue脚手架的版本 Vue脚手架&#xff08;Vue CLI&#xff09;是Vue.js官方提供的一个命令行工具&…

打乱一维数组中数据(小练习)

int[] tempArr{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 要求&#xff1a;打乱一维数组的数据&#xff0c;并按照4个一组的方式添加到二维数组中。 package chengyu4; import java.util.Random; public class Test{public static void main(String args[]) {int[] temArr {1…

CM2038A 3W 双通道立体声音频功率放大器芯片IC

功能说明: CM2038A是一双路音频功率放大器&#xff0c;它能够在5V 电源电压下给一个4Ω负载提供THD小于10%、最大平均值为3W的输出功率。另外&#xff0c;在驱动立体声耳机时耳机输入引脚可以使放 大器工作在单边模式。 CM2038A是为提供高保真音频输出而专门设计…

【每日一坑】KiCAD 覆铜区域约束

【每日一坑】 1.螺丝孔周围不想要要铜皮&#xff1b; 2、首先在CTRLshiftK;画一个区域&#xff0c;比如铺一个GND; 3、选择CUTOUT; 4、画线&#xff0c;画好闭合图形&#xff1b;如下图 5、就是这样了&#xff0c;就是还没有画圆或者异形的&#xff1b;

如何制定一个有效的现货黄金投资策略(EEtrade)

制定一个有效的现货黄金投资策略涉及多方面的考量。以下是几个步骤和考虑因素&#xff0c;可以帮助您建立一个坚实的投资策略&#xff1a; 1. 设立清晰的投资目标 决定您投资现货黄金的主要目的。是否是为了短期利润&#xff0c;长期保值增值&#xff0c;还是为了投资组合的多…