STM32学习—— 第五章 第二节 EXTI外部中断 对射性红外传感器计数&旋转编码器

学习来源:[5-2] 对射式红外传感器计次&旋转编码器计次_哔哩哔哩_bilibili

1· 接线

(1)STM32

(2)OLED屏

(3)对射性红外传感器

(4)仿真烧录器

2·准备工作

以之前OLED屏程序,为基础,可通过oled屏显示,更为直观。

(资料下载:https://jiangxiekeji.com/download.html)

1·.c文件,修改后如下:

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

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	
	/*OLED显示*/
	
	OLED_ShowString(1, 3, "HelloWorld!");	//1行3列显示字符串HelloWorld!
	
	while (1)
	{
		
	}
}

传感器功能的封装:CountSensor.c文件、CountSensor.h文件

2·起架构

CountSensor.c文件

#include "stm32f10x.h"                  // Device header


void CountSensor_Init(void)
{
	
	
	
}


CountSensor.h文件

#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_H




#endif

3·初始化

想要 EXTI外部中断,把如下打通路就行

第一步:配置RCC时钟、AFIO时钟

( 基本每个程序,都要做的第一步,时钟打开,外设才能工作 )

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

注意:由于GPIOB是APB2的外设,开时钟时候,选择APB2;由于参数是宏定义的,就算不对应,也不会报错,不好发现的错误,一定要细心。

注意nvic外设,时钟是一直打开的,EXIT作为独立外设,按理说要开启时钟的,但是手册上没有EXIT控制时钟的寄存器,目前不开启能用,应该是自动唤醒了,有时间可以去研究一下。。。

分清哪些需要开时钟:内核的外设,肯定不用开启时钟,譬如NVIC,它和CPU住在一起的,而RCC就是管内核之外的外设,所以RCC管不着NVIC。。。

第二步:配置GPIO

( 选择端口,配置成输入端口,给红外传感器用 )

根据手册配引脚模式GPIO_MODE,需要配置成浮空输入/带上拉输入/带下拉输入

    GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IPU ;//这里配带上拉的输入

第三步:配置AFIO中断引脚选择

( 选择用的某个GPIO,连接到后面的EXTI )

ST(stm32)公司没有给AFIO单独的库函数,它在GPIO库函数中

GPIO_AFIODeInit(void);//用于复位AFIO

GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//锁定GPIO配置的,防止被意外更改

GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//不多用
GPIO_EventOutputCmd(FunctionalState NewState);//不多用

GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);//引脚重映射
GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//选择中断引脚

GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);//以太网相关

第四步:配置EXTI

  ( 选择边沿触发方式,比如上升沿、下降沿、双边沿 )

(选择中断响应/中断事件,忘记了的话,请看上一节,这里选择中断响应)

个人理解:如下3个函数,外设基本都有,不用害怕和陌生,当见老朋友一样熟悉,使用起来

EXTI_DeInit(void);//配置清除,恢复成上电时状态
EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//用于构建结构体,配置EXTI外设,初始化
EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//把参数传递的结构体变量,赋默认值

个人理解:如下4个函数,对运行中的标志状态位,进行操作,很多模块会有的,适应起来)
EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);//软件触发外部中断
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//查看标志位,
EXTI_ClearFlag(uint32_t EXTI_Line);//对置1的标志位清0
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);//获取中断标志位是否置1
EXTI_ClearITPendingBit(uint32_t EXTI_Line);//清除中断挂起标志位

个人理解:

在程序查看和清除标志位,用EXTI_GenerateSWInterrupt()、FlagStatus EXTI_GetFlagStatus()

在中断函数里查看和清除标志位,用ITStatus EXTI_GetITStatus()、EXTI_ClearITPendingBit() 

第五步:配置NVIC

(给中断选择优先级)

最后通过NVIC,外部中断的信号,就进入CPU,执行中断函数里的中断程序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值