目录

1、标志位函数

2、 初始化的中断的步骤

3、对射式红外传感器计次

(1)接线图

(2)CountSensor.c

(3)main.c

4、旋转编码器计次

(1)接线图(旋转编码器接在PB1、PB0引脚)

(2)Encoder.c

(3)main.c

5、建议


1、标志位函数

//在主程序中查看标志位和清楚标志位,用以下两个函数,能不能触发中断都能读取

FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//获取指定的标志位是否被置1
void EXTI_ClearFlag(uint32_t EXTI_Line);//对置1的标志位进行清除

//有的标志位比较紧急,在置标志位后会触发中断,在中断函数中,查看标志位和清楚标志位,要用以下函数
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);//获取中断标志位是否被置1
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);//清除中断挂起标志位

2、 初始化的中断的步骤

第一步:配置RCC时钟,把涉及外设的时钟都打开
    第二步:配置GPIO,设置为输入模式
    第三步:配置AFIO,选择某个GPIO口连接到EXTI(边缘检测及控制器)
    第四步:配置EXTI(不需要开启时钟,原因不详),选择边沿触发方式和触发响应方式
    边沿触发方式:上升沿、下降沿、或者双边沿,触发响应方式:中断响应和事件响应
    第五步:配置NVIC(内核的外设,不需要开启时钟),给中断选择一个合适的优先级

3、对射式红外传感器计次

(1)接线图

(2)CountSensor.c

#include "stm32f10x.h"                  // Device headeruint16_t CountSensor_Count;void CountSensor_Init(void)
{//第一步:配置RCC时钟,把涉及外设的时钟都打开//第二步:配置GPIO,设置为输入模式//第三步:配置AFIO,选择某个GPIO口连接到EXTI(边缘检测及控制器)//第四步:配置EXTI(不需要开启时钟,原因不详),选择边沿触发方式和触发响应方式//边沿触发方式:上升沿、下降沿、或者双边沿,触发响应方式:中断响应和事件响应//第五步:配置NVIC(内核的外设,不需要开启时钟),给中断选择一个合适的优先级//对射式红外传感器:B14RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;//参考手册中文版中,第八章GPIO有说明说明外设设置什么格式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_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_Falling;//下降沿触发EXTI_Init(&EXTI_InitStructure);//5种分组方式选择其中的一种NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;//在stm32f10x.h中选择,该芯片是MD中等密度的,锁选择STM32F10X_MD即可//stm32的EXTI10到EXTI15都是合并到EXTI15_10_IRQn通道的NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//指定通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//在misc文件中查找NVIC_Priority_Table,查的分组2的抢占优先级和响应优先级的取值范围均为0-3NVIC_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) //中断函数的名字都是固定的
{//因为10-15通道都可以进来,故要判断是不是想要的14通道进来if (EXTI_GetITStatus(EXTI_Line14) == SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0){CountSensor_Count ++;}//中断程序结束后,一定要再调用一下清楚中断标志位的函数,//只有中断标志位置1,程序就会跳转到中断函数//如果不清除中断标志位,就会一直申请中断,//这样程序就会不断响应中断,执行中断函数,程序就会卡死在中断函数中EXTI_ClearITPendingBit(EXTI_Line14);}
}

(3)main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"int main(void)
{OLED_Init();CountSensor_Init();//从第一行,第一列开始写OLED_ShowString(1, 1, "Count:");while (1){//从第一行第7列开始写OLED_ShowNum(1, 7, CountSensor_Get(), 5);}
}

4、旋转编码器计次

(1)接线图(旋转编码器接在PB1、PB0引脚)

(2)Encoder.c

如果把A相的下降沿用作触发中断,在中断时刻读取B相的电平
则正转是高电平,反转是低电平
正转时,A相先出现下降沿,所以刚开始动,就进中断了
反转后,A相先出现下降沿,转到位了,才进入中断

故该实验:A、B相都触发中断
正转:B相下降沿、A相低电平
反转:A相下降沿、B相低电平
这样保证正转和反转都是转到位,才执行数字加减的操作

#include "stm32f10x.h"                  // Device headerint16_t Encoder_Count;void Encoder_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);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);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);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_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;//2的优先级比1低NVIC_Init(&NVIC_InitStructure);
}int16_t Encoder_Get(void)
{int16_t Temp;Temp = Encoder_Count;Encoder_Count = 0;return Temp;
}void EXTI0_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line0) == SET)//set是1的意思{/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){Encoder_Count --;//反转}}EXTI_ClearITPendingBit(EXTI_Line0);}
}void EXTI1_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line1) == SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0){Encoder_Count ++;//正转}}EXTI_ClearITPendingBit(EXTI_Line1);}
}

(3)main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"int16_t Num;int main(void)
{OLED_Init();Encoder_Init();OLED_ShowString(1, 1, "Num:");while (1){Num += Encoder_Get();OLED_ShowSignedNum(1, 5, Num, 5);}
}

5、建议

1、中断函数不要太长,更不要加时间过长的延迟
2、不要在中断函数调用和主程序相同的硬件,如:同时调用OLED,OLED会显示错误,可以操作中断的变量和标志位,再在主程序里面操作显示

7、江科大stm32视频学习笔记——中断的应用:对射式红外传感器计次旋转编码器计次相关推荐

  1. 14、江科大stm32视频学习笔记——AD单通道和AD多通道代码

    目录 一.程序现象 1.AD单通道 2.AD多通道 二.原理图 三.AD单通道 1.AD.c(单次转换非扫描) 2.改为连续转换非扫描 3.main.c 四.AD双通道(单次转换非扫描) 1.思路 2 ...

  2. 17、江科大stm32视频学习笔记——USART串口协议和USART串口外设

    目录 1.通信接口 2. 硬件电路 3.电平标准 4.串口参数及时序 5.USART简介 6.USART工作 (1)写操作 (2)读操作 (3)帧头和帧尾的添加和除由电路自动执行 (4)硬件数据控制流 ...

  3. STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...

  4. 通过对射式红外传感器计次实验讲解EXTI中断

    目录 前言 一.接线图 二.EXTI中断 1.什么是中断 2.什么是EXTI 3.什么是NVIC 4.NVIC基本结构: 三,配置中断 1.配置中断的流程 2.根据例程详细介绍1.CountSenso ...

  5. 江哥MySQL视频学习笔记--第10章 MySQL存储过程和函数70-MySQL-批量数据处理(掌握)

    需求: 往数据库里存储一万条数据 实现方案: 1.写一万条insert into语句 2.将insert into语句封装到存储过程或者函数中 将来怎么使用? 是配合其它SQL语句使用, 还是单独使用 ...

  6. STM32单片机(五)第二节:EXTI外部中断练习1(对射式红外传感器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分:建议先学习51单片机,其是STM32等高级单片机的基础:这样再学习STM32时才能融会贯通. ☀️ 专栏适 ...

  7. 009 - STM32学习笔记 - 中断

    009 - STM32学习笔记 - 中断 这节的内容,野火的官方视频我反复看了好几次,但是感觉火哥在这块讲解的特别绕,理解起来很吃力,后来在看了一下其他老师的视频,结合一些书本资料和官方手册,才搞清楚 ...

  8. 数据分析与爬虫实战视频——学习笔记(一)(python基础、urllib、超时设置、自动模拟HTTP请求、异常处理、浏览器伪装、代理服务器、新闻爬虫、淘宝登陆和图片爬取)

    未经允许,请勿转载. 连载未完成状态 网址: [数据挖掘]2019年最新python3 数据分析与爬虫实战_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili ...

  9. 影像组学视频学习笔记(43)-标准差、标准误及95%置信区间CI、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/f09d0f97592f 来源:简书,已获授权转载 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(43)主要 ...

最新文章

  1. sudo提升执行权限
  2. CentOS+Nginx+Tomcat+Mysql+PHP 环境搭建及系统部署
  3. windows优化_windows系统优化教程——C盘清理及优化
  4. 数据对象类代码的生成小工具
  5. spyder编辑器报ModuleNotFoundError: No module named ‘pymongo‘,明明已经安装上了pymongo扩展
  6. 奥鹏20春在线作业c语言,电子科20春《C语言(专科)》在线作业3答案
  7. (14)FPGA面试题线与逻辑
  8. DCMTK3.6.0(MD支持库)安装说明
  9. Ubuntu 安装 Clang 编译器
  10. Redis 入门指南(五)管理
  11. java数据采集方案_java--数据采集系统.doc
  12. 计算机桌面分页,你的电脑桌面还会一团糟吗?这款软件可以帮你整理文件
  13. 【强化学习】什么是强化学习算法?
  14. gtx1060+linux+双显卡,ubuntu14.04+GTX1060 重新安装显卡驱动
  15. 分享《Essential Linux Device Drivers》中文版高清电子版
  16. PostgreSQL SQL 语言:全文搜索
  17. 你知道 DNS,那我猜你一定不知道 HTTPDNS
  18. Oracle PL / SQL – UPDATE触发器之前的示例
  19. 面试时如何回答你的缺点是什么?
  20. matlab高程数据点,matlab 对tif数据高程图的处理分析

热门文章

  1. 天线增益的计算公式(详细篇)
  2. Kali Linux 网络扫描秘籍 第一章 起步(二)
  3. 公有云视频服务功能简介
  4. 基于STC89C52单片机的粮仓温湿度无线监测系统简易设计
  5. 发些今年的作品:网络斗地主
  6. Sublime Text3文件栏乱码、文件内容乱码及文字大小的解决方法
  7. 河南省自考本科计算机专业需要考哪几门,河南省计算机网络技术自考本科都有哪些科目?...
  8. LegalAI领域大规模预训练语言模型的整理、总结及介绍(持续更新ing…)
  9. stm32f1+ov7725进行图像处理
  10. python头歌第1关:评委打分