当前位置: 首页 > article >正文

stm32——EXTI外部中断

NVIC优先级分组

  1. 抢占优先级
    可以进行中断嵌套的优先级,即可以不等上一个中断执行完成就进入下一个中断

  2. 响应优先级
    决定中断发生的顺序,但不可嵌套

程序实现

对射式红外传感计次

#include "stm32f10x.h"                  // Device header
#include "delay.h" 
#include "oled.h"
#include "countsensor.h"uint8_t key_val, key_old, key_up;
int main(){ OLED_Init();CountSensorInit();OLED_ShowString(1, 1, "Count:");while(1){OLED_ShowNum(1, 7, CountSenorGet(), 5);}
}
/*
countsensor.c
*/
#include "stm32f10x.h"                  // Device header
#include "delay.h"uint16_t count_sensor_count;void CountSensorInit(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef gpio_struc;gpio_struc.GPIO_Mode = GPIO_Mode_IPU;gpio_struc.GPIO_Pin = GPIO_Pin_14;gpio_struc.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &gpio_struc);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);EXTI_InitTypeDef exti_init_struc;exti_init_struc.EXTI_Line = EXTI_Line14;exti_init_struc.EXTI_LineCmd = ENABLE;exti_init_struc.EXTI_Mode = EXTI_Mode_Interrupt;exti_init_struc.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_Init(&exti_init_struc); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef nvic_init_struc;nvic_init_struc.NVIC_IRQChannel = EXTI15_10_IRQn;nvic_init_struc.NVIC_IRQChannelCmd = ENABLE;nvic_init_struc.NVIC_IRQChannelPreemptionPriority = 1;nvic_init_struc.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&nvic_init_struc);
}uint16_t CountSenorGet(void){return count_sensor_count;
}void EXTI15_10_IRQHandler(void){// 该中断通道10~15共用,需判断Line14if(EXTI_GetITStatus(EXTI_Line14) == SET){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0){  // 再次检验电平// 1 遮挡时计数 0 拿开时计数count_sensor_count ++;EXTI_ClearITPendingBit(EXTI_Line14);}			}// 注意,该处数据乱跳很正常,光敏电阻变化导致PB14口的高低电平变化// 但是由于存在抖动,电平在很短时间变化多次,从而产生了多次计数
}

旋转编码器计次

#include "stm32f10x.h"                  // Device header
#include "delay.h" 
#include "oled.h"
#include "encoder.h"uint8_t key_val, key_old, key_up;
int16_t num;
int main(){ OLED_Init();EncoderInit();OLED_ShowString(1, 1, "num:");while(1){num += EncoderGet();OLED_ShowSignedNum(1, 5, num, 5);}
}
/*
encoder.c
*/#include "stm32f10x.h"                  // Device headerint16_t encoder_count;void EncoderInit(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef gpio_struc;gpio_struc.GPIO_Mode = GPIO_Mode_IPU;gpio_struc.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;gpio_struc.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &gpio_struc);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);EXTI_InitTypeDef exti_init_struc;exti_init_struc.EXTI_Line = EXTI_Line0 | EXTI_Line1;exti_init_struc.EXTI_LineCmd = ENABLE;exti_init_struc.EXTI_Mode = EXTI_Mode_Interrupt;exti_init_struc.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_Init(&exti_init_struc); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef nvic_init_struc;nvic_init_struc.NVIC_IRQChannel = EXTI0_IRQn;nvic_init_struc.NVIC_IRQChannelCmd = ENABLE;nvic_init_struc.NVIC_IRQChannelPreemptionPriority = 1;nvic_init_struc.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&nvic_init_struc);nvic_init_struc.NVIC_IRQChannel = EXTI1_IRQn;nvic_init_struc.NVIC_IRQChannelCmd = ENABLE;nvic_init_struc.NVIC_IRQChannelPreemptionPriority = 1;nvic_init_struc.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&nvic_init_struc);
}int16_t EncoderGet(void){int16_t temp;temp = encoder_count;encoder_count = 0;return temp;
}void EXTI0_IRQHandler(void){if(EXTI_GetFlagStatus(EXTI_Line0) == SET){  // 检查中断标志if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){encoder_count --;}EXTI_ClearITPendingBit(EXTI_Line0);  // 清除中断标志}
}void EXTI1_IRQHandler(void){if(EXTI_GetFlagStatus(EXTI_Line1) == SET){if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0){encoder_count ++;}EXTI_ClearITPendingBit(EXTI_Line1);}
}

相关文章:

stm32——EXTI外部中断

NVIC优先级分组 抢占优先级 可以进行中断嵌套的优先级,即可以不等上一个中断执行完成就进入下一个中断 响应优先级 决定中断发生的顺序,但不可嵌套 程序实现 对射式红外传感计次 #include "stm32f10x.h" // Device head…...

Python:操作Excel按行写入

Python按行写入Excel数据,5种实用方法大揭秘! 在日常的数据处理和分析工作中,我们经常需要将数据写入到Excel文件中。Python作为一门强大的编程语言,提供了多种库和方法来实现将数据按行写入Excel文件的功能。本文将详细介绍5种常见的Python按行写入Excel数据的方法,并附上…...

Redis进阶知识

Redis 1.事务2. 主从复制2.1 如何启动多个Redis服务器2.2 监控主从节点的状态2.3 断开主从复制关系2.4 额外注意2.5拓扑结构2.6 复制过程2.6.1 数据同步 3.哨兵选举原理注意事项 4.集群4.1 数据分片算法4.2 故障检测 5. 缓存5.1 缓存问题 6. 分布式锁 1.事务 Redis的事务只能保…...

Python机器学习笔记(二十三 模型评估与改进-网格搜索)

上一次学习了评估一个模型的泛化能力,现在继续学习通过调参来提升模型的泛化性能。scikit-learn中许多算法的参数设置,在尝试调参之前,重要的是要理解参数的含义。找到一个模型的重要参数(提供最佳泛化性能的参数)的取值是一项棘手的任务,但对于几乎所有模型和数据集来说…...

12.vue整合springboot首页显示数据库表-实现按钮:【添加修改删除查询】

vue整合springboot首页显示数据库表:【添加修改删除查询】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系…...

bisheng系列(一)- 本地部署(Docker)

目录 一、导读 二、说明 1、镜像说明 2、本节内容 三、docker部署 1、克隆代码 2、运行镜像 3、可能的错误信息 四、页面测试 1、注册用户 2、登陆成功 3、添加模型 一、导读 环境:Ubuntu 24.04、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景…...

如何用Python批量解压ZIP文件?快速解决方案

如何用Python批量解压ZIP文件?快速解决方案 文章目录 **如何用Python批量解压ZIP文件?快速解决方案**代码结果详细解释 话不多说,先上干货!!! 代码 import os import zipfiledef unzip_file(dir_path: str…...

DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成

《DriveGenVLM: Real-world Video Generation for Vision Language Model based Autonomous Driving》2024年8月发表,来自哥伦比亚大学的论文。 自动驾驶技术的进步需要越来越复杂的方法来理解和预测现实世界的场景。视觉语言模型(VLM)正在成…...

JavaScript 中的五种继承方式进行深入对比

文章目录 前言JavaScript 五种继承方式对比原型链继承构造函数继承组合继承寄生组合继承ES6 class extends 继承五种继承方式对比表前言 对 JavaScript 中的五种继承方式进行深入对比:原型链继承、构造函数继承、组合继承、寄生组合继承、以及 ES6 的 class extends。 内容将…...

企业标准信息公共服务平台已开放标准通编辑器访问入口

标准通 数字化标准编辑器 专业、高效、便捷 企业标准信息公共服务平台 近日,企业标准信息公共服务平台已开放标准通编辑器访问入口,可进入官网指定版块使用! 核心功能亮点 解决企业痛点 传统标准编制,需反复核对格式、逐条…...

[Linux]安装吧!我的软件包管理器!

一、常见安装方式 在 Linux 中,有 3 种常见的软件安装方式: (1)yam、apt (2).rpm 安装包安装 (3)源码安装 二、什么是软件包 在 Linux 下安装软件,通常的办法是下载…...

Spring Boot 与 RabbitMQ 的深度集成实践(三)

高级特性实现 消息持久化 在实际的生产环境中,消息的可靠性是至关重要的。消息持久化是确保 RabbitMQ 在发生故障或重启后,消息不会丢失的关键机制。它涉及到消息、队列和交换机的持久化配置。 首先,配置队列持久化。在创建队列时&#xf…...

进阶-数据结构部分:1、数据结构入门

飞书文档https://x509p6c8to.feishu.cn/wiki/HRLkwznHiiOgZqkqhLrcZNqVnLd 一、存储结构 顺序存储 链式存储 二、常用数据结构 2.1、栈 先进后出 场景: 后退/前进功能:网页浏览器中的后退和前进按钮可以使用栈来实现。在浏览网页时,每次…...

React 19中useContext不需要Provider了。

文章目录 前言一、React 19中useContext移除了Provider&#xff1f;二、使用步骤总结 前言 在 React 19 中&#xff0c;useContext 的使用方式有所更新。开发者现在可以直接使用 作为提供者&#xff0c;而不再需要使用 <Context.Provider>。这一变化简化了代码结构&…...

Json schema校验json字符串(networknt/json-schema-validator库)

学习链接 json-schema官网 - 英文 jsonschemavalidator 可在线校验网站 networknt的json-schema-validator github地址 networknt的json-schema-validator 个人gitee地址 - 里面有md文档说明和代码示例 JSON Schema 入门指南&#xff1a;如何定义和验证 JSON 数据结构 JS…...

交易所开发:构建功能完备的金融基础设施全流程指南

交易所开发&#xff1a;构建功能完备的金融基础设施全流程指南 ——从技术架构到合规安全的系统性解决方案 一、开发流程&#xff1a;从需求分析到运维优化 开发一款功能完备的交易所需要遵循全生命周期管理理念&#xff0c;涵盖市场定位、技术实现、安全防护和持续迭代四大阶…...

Windows_Vs2022 C#语言开发环境构建

Windows_VisualStudio2022 C#语言开发环境构建 一、C#语言简介历史背景语言特点应用领域开发工具未来发展方向 二、Visual Studio 2022&#xff08;一&#xff09;开发语言支持&#xff08;二&#xff09;主要功能&#xff08;三&#xff09;适用场景&#xff08;四&#xff09…...

Axure疑难杂症:统计分析页面引入Echarts示例动态效果

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:统计分析页面引入Echarts示例动态效果 主要内容:echart示例引入、大小调整、数据导入 应用场景:统计分析页面…...

展锐Android14及更新版本split_build编译方法

更改split_build.py文件内容后按照下面方法编译&#xff1a; zip -r sys/vendor/sprd/release/split_build.zip sys/vendor/sprd/release/split_build/ rm -r sys/vendor/sprd/release/split_build/ cp -r vnd/vendor/sprd/release/split_build/ sys/vendor/sprd/release/cd s…...

青少年ctf平台应急响应-应急响应2

题目&#xff1a; 当前服务器被创建了一个新的用户&#xff0c;请提交新用户的用户名&#xff0c;得到的结果 ssh rootchallenge.qsnctf.com -p 30327 这个命令用于通过 SSH 协议连接到指定的远程服务器。具体解释如下&#xff1a; ssh&#xff1a;这是在 Unix-like 系统中…...

k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标

k8s监控方案实践补充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics获取资源状态指标 文章目录 k8s监控方案实践补充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics获取资源状态指标一、Metrics Server简介二、kube-state-metrics实战部署1. 创…...

WEB安全--SQL注入--Oracle注入

一、Oracle知识点了解 1.1、系统变量与表 版本号&#xff1a;SELECT * FROM V$VERSION 用户名&#xff1a;USER、SYS_CONTEXT(USERENV,SESSION_USER) 库名&#xff1a;ALL_USERS、USER_USERS、DBA_USERS 表名&#xff1a;ALL_TABLES、DBA_TABLES、USER_TABLES 字段名&…...

基于SpringBoot的小型民营加油站管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

每日一道leetcode(新学数据结构版)

208. 实现 Trie (前缀树) - 力扣&#xff08;LeetCode&#xff09; 题目 Trie&#xff08;发音类似 "try"&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动…...

深入掌握MyBatis:连接池、动态SQL、多表查询与缓存

文章目录 一、MyBatis连接池1.1 连接池的作用1.2 MyBatis连接池分类 二、动态SQL2.1 if标签2.2 where标签2.3 foreach标签2.4 SQL片段复用 三、多表查询3.1 多对一查询&#xff08;一对一&#xff09;3.2 一对多查询 四、延迟加载4.1 立即加载 vs 延迟加载4.2 配置延迟加载 五、…...

Bootstrap 5 容器与网格系统详解

一、容器 - Bootstrap的基础构建块 Bootstrap需要容器元素来包裹网站内容&#xff0c;提供两种主要选择&#xff1a; .container - 固定宽度并支持响应式布局.container-fluid - 100%宽度&#xff0c;占据全部视口 1. 固定宽度容器 .container创建固定宽度的响应式页面&…...

Java反射机制详解:原理、应用与实战

一、反射机制概述 Java反射(Reflection)是Java语言的一个强大特性&#xff0c;它允许程序在运行时(Runtime)获取类的信息并操作类或对象的属性、方法等。反射机制打破了Java的封装性&#xff0c;但也提供了极大的灵活性。 反射的核心思想&#xff1a;在运行时而非编译时动态获…...

技术架构缺乏灵活性,如何应对变化需求?

技术架构缺乏灵活性会导致企业在面临市场变化、用户需求演化或新技术出现时难以及时响应&#xff0c;直接影响产品更新速度与竞争力。要有效应对变化需求&#xff0c;需要从引入模块化架构设计、推动微服务拆分、加强架构治理与决策机制、构建中台与平台化能力等方面系统推进。…...

【AI时代】Java程序员大模型应用开发详细教程(上)

目录 一、大模型介绍 1. 大模型介绍 1.1 什么是大模型 1.2 技术储备 1.3 大模型的分类 2. 入门案例 3.Token的介绍 二、提示词工程 1. 好玩的提示词案例 1.1 翻译软件 1.2 让Deepseek绘画 1.3 生成数据 1.4 代码生成 2. 提示词介绍 3. Prompt Engineering最佳实…...

虚拟网络编辑器

vmnet1 仅主机模式 hostonly 功能&#xff1a;虚拟机只能和宿主机通过vmnet1通信&#xff0c;不可连接其他网络&#xff08;包括互联网&#xff09; vmnet8 地址转换模式 NAT 功能&#xff1a;虚拟机可以和宿主通过vmnet8通信&#xff0c;并且可以连接其他网络&#xff0c;但是…...