笔记:(三)INT外部中断驱动
Author:家有仙妻谢掌柜
Date:2021/2/26
本文已于2021/3/1更新完毕。
本文用到的数据手册连接在这里
这里只分析中断的外部引脚中断,至于其他的,如:定时器中断会在Timer篇章中详解,ADC中断会在ADC篇章中详解等等
关于合泰的中断服务函数写法,在IDE中一定是这样的,固定格式。
如:DEFINE_ISR(INT1ISR,INT1VECTOR)
1.函数名字DEFINE_ISR: 无论是INT0还是INT1又或者是定时器中断,他们的中断服务函数名字都是DEFINE_ISR,这是编译器识别的入口,其他的不行。
2.第一个参数INT1ISR: 针对不同的中断你可以命名独立的函数名字,如:INT1ISR,这就是INT1的标识,这个标识是你自己定义的可以随便写的。
3.第二个参数INT1VECTOR: 中断的向量这里在头文件中定义了,#define INT1VECTOR 0x08
中断向量表如下图:
图中红色方框标识的就是INT1的中断向量,其中箭头标识的寄存器INT1F是请求标志位,左上角的黑色三角,是文档说明,它说明了该请求标志位寄存器的值表示的是可以自动复位的,就是可以自动清零的,
//因此我们不能在中断服务子程序中写上
DEFINE_ISR(INT1ISR,INT1VECTOR)
{
if(_int1f)
{
//想要执行的事情
}
_int1f = 0;
}
//而是要这样写
DEFINE_ISR(INT1ISR,INT1VECTOR)
{
//想要执行的事情
_int1f = 0;
}
接下来,走一波完整的配置,实现的功能是对黑白条进行计数,中断程序中是不要写太多的东西的,一般都是写一些这样的东西,当中断发生,更新标位置,或者当中断发生 ,对某一个值进行计数,或者中断发生,改变某引脚电平等等,执行的任务越少越好。
#include "include.h"
/*******************************************************************************
* fuction IRONInit
* brief
* param 无
* return 无
*******************************************************************************/
void INT1PinInit(void)
{
_pas17 = 0;
_pas16 = 0;
gpioInput(INT1Pin); //PA7
gpioPullUpEnable(INT1Pin); //PA7
_integ = 0x08; //0b00001000
_int1e = 1; //外部中断1中断使能
_int1f = 0; //清外部中断1标志位
_emi = 1; //使能总中断
}
/*******************************************************************************
* fuction INT1ISR
* brief INT1中断函数
* param
* return 无
*******************************************************************************/
DEFINE_ISR(INT1ISR,INT1VECTOR)
{
//中断中尽量执行比较简单的任务,这里只对某一个值进行计数
Cnt++;
_int1f = 0;
}
INT1PinInit函数中,使用到的寄存器分析
1、边沿触发寄存器选择
我在这里使用的是下降沿触发中断,
2、中断请求,开启中断配置
这里打开INT1控制位寄存器故而让_int1e = 1;
这里打开总中断控制位 故而让_emi = 1;
是否有事件请求,如果有的话是要_int1f = 1;但是置1之后,会进入到中断子程序内,因此我们要设置为0,当有中断来的时候,他会自动设置为1,故而_int1f = 0;
3、中断引脚复用配置
这里要注意的是引脚复用功能,PA7要作为中断,必须开启引脚复用功能,只需设置对应的寄存器即可。 _pas17 = 0; _pas16 = 0;这里选择是00。
#ifndef _IR_H
#define _IR_H
#include "BH66F2652.h"
#define INT1Pin PA7 //计数 外部中断1
#define INT1VECTOR 0x08
extern void INT1PinInit(void);
#endif
/*--------------------------------END THE FILE-----------------------------------*/