嵌入式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的时钟。
//////
GPIOA->CRL|=1<<3;
GPIOA->CRL&=~(1<<2);
//在上一篇文章当中我们知道主设备要读取由从设备发过来的信号,也就是接收从设备的应答信号,那么此时主设备外部中断引脚就处于输入状态。
////这里就是将3,2位设置为1和0,即为上拉/下拉输入模式。
GPIOA->CRL&=~(1<<0);
GPIOA->CRL&=~(1<<1);
//
//这里就是将1,0位设置为0和0,即为输入模式(复位后的状态)。
GPIOA->ODR&=~(1<<0);
//这里我们需要知道两种状态,分别是上拉输入和下拉输入。
//上拉输入是电平状态从低电平到高电平。
//下拉输入是电平状态从高电平到低电平。
//这里我们默认是高电平,按键按下之后,电平状态从高电平到低电平,所以我们这里将状态设置为下拉输入。
////从上图我们可以知道PxODR寄存器为0。
//
RCC->APB2ENR|=1<<0;
AFIO->EXTICR[0]&=0xFFF0;
////从上图我们可以知道设置AFIO_EXTICR1寄存器的EXTI1[3:0]位。
////所以这里我们设置0~3位为0,其他位为1即可。
//
NVIC_SetPriorityGrouping(5);
NVIC_EnableIRQ(EXTI0_IRQn);
NVIC_SetPriority(EXTI0_IRQn,10);
//
//由之前的定时器精准定时那篇文章可以得知,分配管理中断的是由NVIC来管理的。
//先分组,再使能EXTI0的全局中断,然后设置外部中断的优先级为10。
EXTI->IMR|=1<<0;
//EXTI->EMR|=1<<0;
//使能事件屏蔽寄存器,特别注意,如果只使用外部中断功能,建议不要设置Event模式。
EXTI->RTSR|=1<<0;
////因为我们这里是设置的下拉输入,默认状态是低电平,如果按键触发的话,这样低电平就会变成高电平。
//所以我们需要开启上升沿触发选择寄存器。
个人认为大家如果细心看完这篇文章,并且结合上一篇文章一起看(在文章的刚开始会将前几篇关于外部中断原理部分的文章链接发出来),我相信大家会彻底掌握外部中断了!!!如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!
以后我会继续推出关于嵌入式(stm32)的协议方面的讲解,下一讲会推出DMA部分的文章!敬请期待!!!
**我先休息去了~~╭(╯^╰)╮