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

stm32单片机个人学习笔记6(EXTI外部中断)

前言

本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。

STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

一、 stm32中断

二、NVIC基本结构

 三、NVIC优先级分组

四、EXTI简介 

五、EXTI基本结构

 六、AFIO复用IO口

七、EXTI框图

 

八、旋转编码器介绍

不同方向转动编码器会产生如下波形

九、实例一(对射式红外传感器计次)

1. 写初始化函数

(1)配置时钟(GPIO口和AFIO口的)(EXTI和NVIC的时钟自动是开启的,其中因为NVIC是内核的外设,RCC管的是内核外的外设) 

(2)配置GPIO口

(3)配置AFIO外部中断引脚选择

(4)配置EXTI,EXTI初始化

(5)配置NVIC

2.中断函数

去启动文件找中断函数的函数名

CountSensor.c 

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

uint16_t CountSensor_Count;

void CountSensor_Init(void)
{
	//开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	//配置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_Init(GPIOB, &GPIO_InitStructure);
	
	//配置AFIO外部中断引脚选择
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
	
	//配置EXTI
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//不遮挡时,灯亮,发送0;遮挡时,灯灭,发送1
	EXTI_Init(&EXTI_InitStructure);
	
	
	//配置NVIC
	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)
	{
		Delay_ms(500);
		CountSensor_Count++;
		EXTI_ClearITPendingBit(EXTI_Line14);
	}
}

 

十、实例二(旋转编码器计次)

1. 写初始化函数

同上

2.两个中断函数来判断旋转的方向

 Encoder.c

 

#include "stm32f10x.h"                  // Device header

int16_t Encoder_Count;

/**
  * @brief  旋转编码器初始化
  * @param  无
  * @retval 无
  */
void Encoder_Init(void)
{
	//开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	//配置GPIO口
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	//配置AFIO外部中断引脚选择
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
	
	//配置EXTI
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_InitStructure);
	
	
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; 
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; 
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  获取计数值
  * @param  无
  * @retval Temp,计数值
  */
int16_t Encoder_Get(void)
{
	int16_t Temp;
	Temp = Encoder_Count;
	Encoder_Count = 0;
	return Temp;
}

/**
  * @brief  PB0口中断函数
  * @param  无
  * @retval 无
  */
void EXTI0_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line0) == SET)
	{
		if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
		{
			Encoder_Count--;
		}
		
		EXTI_ClearITPendingBit(EXTI_Line0);
	}
}

/**
  * @brief  PB1口中断函数
  * @param  无
  * @retval 无
  */
void EXTI1_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line1) == SET)
	{
		if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)
		{
			Encoder_Count++;
		}
		
		EXTI_ClearITPendingBit(EXTI_Line1);
	}
}

 


http://www.kler.cn/a/322203.html

相关文章:

  • 【RabbitMQ 项目】客户端:消费者模块
  • WEB3.0是什么?
  • 「JavaScript深入」聊一聊 new操作符具体干了什么?
  • Springboot Mybatis操作数据库
  • 高精度图像尺寸测量仪(闪测仪)测量内径深度
  • CSS的弹性盒子模型(Flex box)
  • 【Hive】学习路线:架构、运维、Hsql实战、源码分析
  • 如何将Excel表格嵌入Web网页在线预览、编辑并保存到自己服务器上?
  • 大数据毕业设计选题推荐-安顺旅游景点数据分析系统-Hive-Hadoop-Spark
  • docker-compose up -d 和 docker run -d your_image_name 的区别
  • 原生app云打包,更换图标,和名称。PDA的安装正式包
  • web入门
  • Codeforces Round 972 (Div. 2) A~E
  • 事务 Atomicity Consistency Isolation Durability
  • 七大机器学习常用库一次讲清楚(TensorFlow|Scikit-Learn|NumPy|Keras|PyTorch|LightGBM||NLTK)
  • 局域网广域网,IP地址和端口号,TCP/IP 4层协议,协议的封装和分用
  • html+css(如何用css做出京东页面,静态版)
  • SQL关键字的优先级执行顺序:深入理解SQL查询的构造
  • Debian安装mysql遇到的问题解决及yum源配置
  • 常用前端框架对比和选择