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

ops/2024/9/22 23:26:24/

前言

本篇文章属于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);//配置EXTIEXTI_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;遮挡时,灯灭,发送1EXTI_Init(&EXTI_InitStructure);//配置NVICNVIC_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 headerint16_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);//配置EXTIEXTI_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);//配置NVICNVIC_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.ppmy.cn/ops/114466.html

相关文章

适用于QF的存档系统

存档系统 今天分享一个适用于QF的存档系统 这个系统的优点为 1、轻量化,总共代码不超过400行 2、自动化,基于QF框架,自动注入值 缺点: 1、不能序列化Unity内部类型,如Vector 2、需要给能被序列化的类加上【Seri…

【python】修改字典的内容

person {"name": "John", "age": 30, "city": "New York"} print("最开始的信息:",person)def process_person_info(person):# 检查对象中是否包含所有必要的键if name in person and age in person …

如何有效检测住宅IP真伪?

在当今的互联网时代,住宅IP(即家庭用户通过宽带服务提供商获得的IP地址)在跨境电商、广告投放、网络安全等多个领域扮演着重要角色。然而,随着网络环境的复杂化和欺诈行为的增多,如何有效检测和辨别住宅IP的真伪成为了…

第三十七条:不要以序号作为索引,使用EnumMap代替

我们有时可能会看到使用ordinal方法来索引数组或者列表的代码。例如,考虑到下面这个简单的类,用于表示一种植物: public class Plant {enum LifeCycle {ANNUAL, PERENNIAL, BIENNIAL}final String name;final LifeCycle lifeCycle;public Pl…

开源 AI 智能名片链动 2+1 模式 O2O 商城小程序在社群活动中的应用与时机选择

摘要:本文探讨了开源 AI 智能名片链动 21 模式 O2O 商城小程序在社群经济中的重要性,着重分析了如何借助该小程序适时举办大型活动以维持和引爆社群活跃度。通过对活动时机选择的研究,强调了针对社群用户量身定制活动时机的必要性&#xff0c…

Foundation 折叠列表

Foundation 折叠列表 引言 在网页设计和开发中,折叠列表是一种常见且实用的界面元素,它允许用户展开和收起内容以节省空间并提高用户体验。Foundation 是一个流行的前端框架,它提供了一套强大的工具和组件来帮助开发者快速构建响应式和现代化的网页。本文将详细介绍如何在…

最优化理论与自动驾驶(十一):基于iLQR的自动驾驶轨迹跟踪算法(c++和python版本)

最优化理论与自动驾驶(四):iLQR原理、公式及代码演示 之前的章节我们介绍过,iLQR(迭代线性二次调节器)是一种用于求解非线性系统最优控制最优控制最优控制和规划问题的算法。本章节介绍采用iLQR算法对设定…

分享一个 在线拍卖系统 商品竞拍平台Java、python、php三个技术版本(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…