教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19

关于外部中断原理方面的文章:

嵌入式stm32 复习(工作用)— 外部中断原理知识 2020.3.19
添加链接描述

先上完整外部中断部分代码!!!

EXTI.c部分

#include "key.h"
#include "led.h"

void KEY_EXTI_Init(void)
{
	RCC->APB2ENR|=1<<2;
	
	GPIOA->CRL|=1<<3;
	GPIOA->CRL&=~(1<<2);
	
	GPIOA->CRL&=~(1<<0);
	GPIOA->CRL&=~(1<<1);
	
	GPIOA->ODR&=~(1<<0);
	
	RCC->APB2ENR|=1<<0;
	
	AFIO->EXTICR[0]&=0xFFF0;
	
	NVIC_SetPriorityGrouping(5);
	NVIC_EnableIRQ(EXTI0_IRQn);	
	NVIC_SetPriority(EXTI0_IRQn,10);	
	
	EXTI->IMR|=1<<0;	
	//EXTI->EMR|=1<<0;	
	EXTI->RTSR|=1<<0;	

}

void EXTI0_IRQHandler(void)
{

	if(EXTI->PR&0x01){	
		
		PBout(5)=~PBout(5);
		
		EXTI->PR|=1<<0;	
	}

}

EXTI.h部分

#ifndef __KEY_H
#define __KEY_H

#include "ext.h"

void KEY_EXTI_Init(void);

#endif

好!按照老样子,接下来开始详细讲解每行代码的用处,以及为什么这样写!

RCC->APB2ENR|=1<<2;

//在这里插入图片描述//如上图所示,我们使用过的外部中断的引脚是GPIOA端口,所以我们需要开启GPIOA的时钟。
//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第1张图片//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第2张图片//在这里插入图片描述

GPIOA->CRL|=1<<3;
GPIOA->CRL&=~(1<<2);

//在上一篇文章当中我们知道主设备要读取由从设备发过来的信号,也就是接收从设备的应答信号,那么此时主设备外部中断引脚就处于输入状态。
//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第3张图片//这里就是将3,2位设置为1和0,即为上拉/下拉输入模式。

GPIOA->CRL&=~(1<<0);
GPIOA->CRL&=~(1<<1);

//
教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第4张图片//这里就是将1,0位设置为0和0,即为输入模式(复位后的状态)。

GPIOA->ODR&=~(1<<0);

//这里我们需要知道两种状态,分别是上拉输入和下拉输入。
//上拉输入是电平状态从低电平到高电平。
//下拉输入是电平状态从高电平到低电平。
//这里我们默认是高电平,按键按下之后,电平状态从高电平到低电平,所以我们这里将状态设置为下拉输入。
//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第5张图片//从上图我们可以知道PxODR寄存器为0。
//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第6张图片

RCC->APB2ENR|=1<<0;

//在这里插入图片描述//从上图我们可以知道,必须先开启AFIO时钟。
//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第7张图片

AFIO->EXTICR[0]&=0xFFF0;

//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第8张图片//从上图我们可以知道设置AFIO_EXTICR1寄存器的EXTI1[3:0]位。
//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第9张图片//所以这里我们设置0~3位为0,其他位为1即可。
//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第10张图片

NVIC_SetPriorityGrouping(5);
NVIC_EnableIRQ(EXTI0_IRQn);	
NVIC_SetPriority(EXTI0_IRQn,10);	

//
在这里插入图片描述//由之前的定时器精准定时那篇文章可以得知,分配管理中断的是由NVIC来管理的。
//先分组,再使能EXTI0的全局中断,然后设置外部中断的优先级为10。

EXTI->IMR|=1<<0;	

//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第11张图片//这里我们将第零位为1,即开放来自线上的中断请求。

//EXTI->EMR|=1<<0;	

//使能事件屏蔽寄存器,特别注意,如果只使用外部中断功能,建议不要设置Event模式。

EXTI->RTSR|=1<<0;	

//教你手写外部中断(看完这篇你就会手动写啦,保姆级讲解)---- 2020.3.19_第12张图片//因为我们这里是设置的下拉输入,默认状态是低电平,如果按键触发的话,这样低电平就会变成高电平。
//所以我们需要开启上升沿触发选择寄存器。

结束语

个人认为大家如果细心看完这篇文章,并且结合上一篇文章一起看(在文章的刚开始会将前几篇关于外部中断原理部分的文章链接发出来),我相信大家会彻底掌握外部中断了!!!如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!

以后我会继续推出关于嵌入式(stm32)的协议方面的讲解,下一讲会推出DMA部分的文章!敬请期待!!!

**我先休息去了~~╭(╯^╰)╮

你可能感兴趣的:(嵌入式(stm32))