STM32中断和外部中断

 

NVIC:嵌套中断向量控制器:用于统一分配中断优先级和管理中断

响应式优先级:也可以称为插队式优先级哪个优先级高优先处理哪个

抢占式优先级:优先级高的可以优先被处理,相当于CPU可以暂时中断当前处理的程序,优先处理优先级更高的程序,该程序执行完成后再执行原先没有执行完毕的程序,也可以称之为嵌入式中断优先级

AFIO中断引脚选择:是一个中断引脚选择器可以在前面GPIO外设的16个引脚中选择一个连接到EXTI边沿检测及控制中所以

相同的Pin不能同时触发中断,因为PA0,PB0,PC0通过AFIO选择后只有其中一个可以连接到EXTI的通道0上,PB1,PC1等也只有一个可以接入EXTI上

模拟电子技术与或门基础

旋转编码器讲解

旋转编码器的硬件电路

外部中断寄存器代码

1:接线

#include "stm32f10x.h"                  // Device header


// 编写初始化函数--->模块化的第一步是编写初始化函数
void CountSersor_Init(void){
    /*
	   外部中断配置  
	   1: 配置RCC进涉及的外部中断时钟全部打开
	   2:配置GPIO选择端口为输入模式
	   3: 配置AFIO选择需要使用到的GPIO并连接后面的exit
	   4:配置EXTI选择边沿触发的方式如上升沿,下降沿,或者是双边沿,选择触发响应的方式
	   5:配置NVIC给中断选择一个合适的优先级
	  */
	  

}

AFIO相关函数


             用于复位AFIO外设,调用这个函数会清除AFIO外设
             void GPIO_AFIODeInit(void);
             用于锁定GPIO配置调用这个函数参数指定某个引脚,锁定引脚配置防止意外更改
             void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
             以下的两个函数是用于配置AFIO的事件输出功能
           void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
           void GPIO_EventOutputCmd(FunctionalState NewState);

             这个函数可以用作引脚重映射,第一个参数是重映射的方式,第二个参数是新的状态
             void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
          
  这个函数外部中断需要使用到的函数,调用这个函数可以选择我们的中断引脚
       void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
             和以太网相关外设暂时没有使用到
             void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

EXTI相关函数

NVIC配置

编写中断函数代码实现当遮挡传感器时oled显示屏中的数字加1

中断函数代码

#include "stm32f10x.h"                  // Device header
uint16_t CountSensor_Count;

// 编写初始化函数--->模块化的第一步是编写初始化函数
void CountSersor_Init(void){
	  //1------>todo : 配置RCC进涉及的外部中断时钟全部打开
	  // 开启GPIOB的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	  // 开启AFIO的时钟
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	  // EXPI和NVIC的时钟一直处于打开状态不需要我们手动开启
	  
	  //2------>todo : 配置GPIO选择端口为输入模式
	  GPIO_InitTypeDef GPIO_InitStructure;
	  // 引出结构体模式
	  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU ; // 配置模式
	  GPIO_InitStructure.GPIO_Pin =GPIO_Pin_14 ;
	  GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
	  // 调用GPIO初始化函数,初始GPIOB
	  GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	  // 3:todo ------->  配置AFIO选择需要使用到的GPIO并连接后面的exit
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
	  
	  // 3:todo ------->配置EXTI选择边沿触发的方式如上升沿,下降沿,或者是双边沿,选择触发响应的方式
		EXTI_InitTypeDef Exit_InitStruct;
		// 引出结构体成员
		Exit_InitStruct.EXTI_Line =EXTI_Line14; // 指定需要配置的中断线
		Exit_InitStruct.EXTI_LineCmd =ENABLE; // 开启中断
		Exit_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 模式:中断模式
		Exit_InitStruct.EXTI_Trigger =EXTI_Trigger_Falling ;// 下降沿触发
	  EXTI_Init(&Exit_InitStruct);
		
		// 选择中断分组函数
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
		NVIC_InitTypeDef  NVIC_Initstructure;
		NVIC_Initstructure.NVIC_IRQChannel = EXTI15_10_IRQn;
		NVIC_Initstructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority = 1;
		NVIC_Initstructure.NVIC_IRQChannelSubPriority = 1;
		NVIC_Init(&NVIC_Initstructure);
		
	
}
uint16_t CountSensor_Get(void){
     return CountSensor_Count;
}

void  EXTI15_10_IRQHandler(void){
   if(EXTI_GetITStatus(EXTI_Line14) == SET){
		    CountSensor_Count++;
	      // 中断程序结束后一定要清除中断程序标志位函数
		    EXTI_ClearITPendingBit(EXTI_Line14);
	 }
}

中断函数头文件

#ifndef __COUNT_SENSOR_H__
#define __COUNT_SENSOR_H__
    /*
	   外部中断配置  
	   1: 配置RCC进涉及的外部中断时钟全部打开
	   2:配置GPIO选择端口为输入模式
	   3: 配置AFIO选择需要使用到的GPIO并连接后面的exit
	   4:配置EXTI选择边沿触发的方式如上升沿,下降沿,或者是双边沿,选择触发响应的方式
	   5:配置NVIC给中断选择一个合适的优先级
	  */
void CountSersor_Init(void);
uint16_t CountSensor_Get(void);

#endif

主函数调用代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CounterSensor.h"

int main(void)
{
  // 初始化oled
	OLED_Init();
	CountSersor_Init();
	// 使用OLED显示字符串
	OLED_ShowString(1,3,"Count:");
	

	while (1)
	{
	   OLED_ShowNum(1, 7, CountSensor_Get(), 5);   
	}
}

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

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

相关文章

EVE-NG桥接虚拟网卡实现与虚拟机通讯

一、知识补充 1、VMware网络连接 在VM中,给我们提供了以下几种连接网络的模式 桥接模式:直接联机物理网络NAT模式:用于共享主机的IP地址仅主机模式:与主机共享的专用网络自定义:特定虚拟网络LAN区段 特别注意的是&am…

一款Mac系统NTFS磁盘读写软件Tuxera NTFS 2023 for Mac

当您获得一台新 Mac 时,它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac,您需要一个附加的 NTFS 驱动程序。Tuxera 的 Microsoft NTFS for Mac 2023是一款易于使用的软件,可以在 Mac 上打开、编辑、复制、移动…

如何查看centos7中启动了几个nginx

在 CentOS 7 中,最常用的几种方法如下: 1. 使用 ps 命令 ps 命令可以用来显示当前系统中正在运行的进程。要查看所有 Nginx 进程,可以使用以下命令: ps -ef | grep nginx这个命令会列出所有包含“nginx”字符串的进程。输出中会…

win11家庭版docker和milvus

docker 1、官网下载docker文件Get Started | Docker,选择download for windows下载。 2、双击打开下载好的文件Docker Desktop Installer.exe,add shortcut to desktop选择√代表同意添加快捷键到桌面,如果不勾选就说明不创建快捷键&#x…

关于安卓ZXing条码识别(二)适配竖屏

背景 不知道如何引入源码的,请看我第一篇文章,安卓源码引入 第一篇文章,粗略讲解了如何引入zxing到安卓的源码中,但是默认是横屏识别。 本文内容,就是如何进行竖屏识别。 环境 win10 as4 jdk8 感谢 博客 实现 …

ptmalloc、tcmalloc与jemalloc对比分析

文章目录 一、内存管理二、ptmalloc系统角度看ptmalloc内存管理用户角度看ptmalloc内存管理线程中内存管理从工作原理来看从作用来看Chunk说明问题 三、tcmalloc系统角度看tcmalloc内存管理用户角度看tcmalloc内存管理tcmalloc的优势 四、jemalloc系统角度看jemalloc内存管理用…

上门按摩服务随心约·专业技师待命中·小程序轻松享健康,博纳软云预约服务小程序定制开发

在现代社会,随着生活节奏的加快,人们对健康与放松的需求也日益增长。传统的按摩服务虽然能够带来身心的舒缓,但往往受限于时间和地点,使得许多人难以享受到这一服务。然而,随着科技的进步,上门按摩服务小程…

打印机项目需求

打印机项目需求 工作情况如下 我拿着一张带有二维码的纸张对准“打印机的摄像头”“打印机的摄像头”解析我的二维码假如解析后的二维码内容是:24030924发送一个http请求:https://…/getMessage?code24030924外部服务器会返回一个json数据{‘地址’:‘…

VBA(学习笔记)

1. 数据类型 变量定义:Dim 变量名 As 数据类型 变量赋值:变量名 值 1.1 数值型 1.1.1 整数 (1) Byte:1字节(0~255) (2) Integer:2字节(-32768~32767) (3) Long:4…

MongoDB官网查看 MongoClient 驱动API 文档的详细步骤

目录 MongoDB官网查看 MongoClient 驱动API 文档的详细步骤1、先进入[mongodb的官网](https://www.mongodb.com/zh-cn),点击【服务器文档】2、点击这个 [MongoDB Documentation](https://www.mongodb.com/docs/) 文档。3、然后点开【Java】的驱动文档4、先查看同步的…

数字化转型导师坚鹏:科技创新产业发展研究及科技金融营销创新

科技创新产业发展研究及科技金融营销创新 课程背景: 很多银行存在以下问题: 不清楚科技创新产业的发展现状? 不知道科技金融有哪些成功的案例? 不知道科技金融如何进行营销创新? 课程特色: 以案例…

C++_lambda表达式

目录 前言-lambda表达式的介绍: 1、lambda表达式的作用 2、lambda表达式的优势 2.1 用lambda构建lambda变量 3、lambda表达式的类型 4、捕捉列表说明 4.1 传值捕捉 4.2 mutable 4.3 传引用捕捉 4.4 混合捕捉 5、lambda的大小 结语 前言-lambda表达…

C语言-写一个简单的Web服务器(一)

基于TCP的web服务器 概述 C语言可以干大事,我们基于C语言可以完成一个简易的Web服务器。当你能够自行完成web服务器,你会对C语言有更深入的理解。对于网络编程,字符串的使用,文件使用等等都会有很大的提高。 关于网络的TCP协议在…

python编程从入门到实践答案二

python编程从入门到实践 第五章 if语句1.条件测试:2.更多的条件测试:3.外星人颜色#1:4. 外星人颜色#2:5. 外星人颜色#3:6. 人生的不同阶段:7. 喜欢的水果:8. 以特殊方式跟管理员打招呼&#xff…

探索CSS预处理器:Sass、Less与Stylus

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Python】进阶学习:列表推导式如何使用两个for循环

【Python】进阶学习:列表推导式如何使用两个for循环 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到…

Linux多线程之线程互斥

(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、互斥 1.线程间的互斥相关背景概念 2.互…

canvas实现水印逻辑分析

目录 效果图一、相关文档二、分析三、实现1、将水印文字转为水印图片2、给刚生成的水印图片加入旋转以及间隔(1)旋转位移(2)间隔位移(3)最后使用toDataURL导出为png图片 3、将生成的水印图片依次排布在需要…

Python实现一个简单的主机-路由器结构(计算机网络)

说明 本系统模拟实现了一个路由器与两个主机节点。该路由器将接收原始以太网帧,并像真正的路由器一样处理它们:将它们转发到正确的传出接口,处理以太网帧,处理 IPv4 分组,处理 ARP分组,处理 ICMP 分组&…

Crow 编译和环境搭建

Crow与其说是编译,倒不如说是环境搭建。Crow只需要包含头文件,所以不用编译生成lib。 Crow环境搭建 boost(可以不编译boost,只需要boost头文件即可)asio (可以不编译,直接包含头文件。不能直接…