小白跟做江科大32单片机之对射式红外传感器计次

原理部分

1中断示意图,中断会打断主函数的执行,终端执行完成之后再返回主函数继续执行

2.STM32中断

这些灰色的是内核中断

这些白色的是普通中断

3.NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级

4.抢占优先级是表示可以直接插队让CPU执行,相当于急诊

响应优先级就是看谁的优先级高,等待CPU执行完当前任务之后就立马执行优先级最高的,相当于平时较重的疾病

5.EXTI框图,最终有两个选择,第1个表示事件响应:触发别的外设操作。第2个表示中断:引脚电平触发中断

6.主要看此结构,打通一条GPIO到NVIC的中断通路就可以使用中断

7.旋转编码器电路图


实验过程

1.按照江科大老师给的电路链接图进行连接

2.在hardware中新建sensor.c和sensor.h文件夹

3.sensor.h代码如下

#ifndef _SENSOR__H

#define _SENSOR__H

void SENSOR_Init(void);

uint16_t turn(void);

#endif

4.sensor.c代码如下

#include "stm32f10x.h"

uint16_t CountSensor_Count;

void SENSOR_Init(void)

{

//使用各个外设前必须开启时钟,否则对外设的操作无效

//中断只需开始B口和AFIO即可,EXTI和NVIC无需开启时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO的时钟

/*GPIO初始化*/

GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO模式,赋值为上拉输出模式

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //GPIO引脚,赋值为第1,2号引脚

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz

GPIO_Init(GPIOB, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数

//函数内部会自动根据结构体的参数配置相应寄存器

//实现GPIOB的初始化

/*AFIO选择中断引脚*/

//将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚

//AFIO这个函数在GPIO那个里面

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);

/*EXTI初始化*/

//这个在library中找一下

EXTI_InitTypeDef EXTI_InitStruct;

EXTI_InitStruct.EXTI_Line=EXTI_Line14; //选择哪个口

EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; //中断

EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising; //这个需要搜索一下EXTI_Trigger,现在是上升沿触发

EXTI_InitStruct.EXTI_LineCmd=ENABLE; //中断打开

EXTI_Init(&EXTI_InitStruct);

//NVIC在初始化之前需要指定中断优先级分组

/*NVIC中断分组*/

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/*NVIC初始化*/

NVIC_InitTypeDef NVIC_InitStruct;

NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn; //选择配置NVIC的EXTI15_10线,因为那个14号线过来的在10-15以内

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; //这个是自己给的,值越低优先级越高

NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;

NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStruct);

}

uint16_t turn(void)

{

return CountSensor_Count;

}

//中断函数不需要声明,但一定是这个函数名

void EXTI15_10_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line14)==SET) //判断是否是外部中断14号线触发的中断

{

if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)

{

CountSensor_Count ++; //计数值自增一次

}

EXTI_ClearITPendingBit(EXTI_Line14); //清除外部中断14号线的中断标志位

//中断标志位必须清除

//否则中断将连续不断地触发,导致主程序卡死

}

}

最后中断函数的设置参考这个,红色的一般用于主函数中,蓝色的一般用于sensor中

5.main.c代码如下:

#include "stm32f10x.h" // Device header

#include "OLED.h"

#include "sensor.h"

int main()

{

OLED_Init();

SENSOR_Init();

OLED_ShowString(1, 2, "RED_LED:");

while (1)

{

OLED_ShowNum(2, 2, turn(), 5);

}

}

6.实验结果

注意

ctrl+alt+空格可以出现代码提示

相关推荐
Mortal_hhh27 分钟前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
深圳市青牛科技实业有限公司40 分钟前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比2 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie2 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
鹿屿二向箔2 小时前
STM32外设之SPI的介绍
stm32
西瓜籽@2 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^138287988725 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张6 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
m0_739312878 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章9 小时前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频