/******************************************************************************
; * @型号 : MC32F7361
; * @创建日期 : 2021.12.21
; * @公司/作者 : SINOMCU-FAE
; * @晟矽微技术支持 : 2048615934
; * @晟矽微官网 : http://www.sinomcu.com/
; * @版权 : 2021 SINOMCU公司版权所有.
; *----------------------摘要描述---------------------------------
; * 外部中断
; * INT0 外部中断 P11下降沿触发,P14翻转一次
; * INT1 外部中断 P12上升沿触发,P10翻转一次
******************************************************************************/
#include "user.h"
/************************************************
; * @函数名 : CLR_RAM
; * @说明 : 清RAM
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void CLR_RAM(void)
{
for (FSR0 = 0; FSR0 < 0xff; FSR0 ++)
{
INDF0 = 0x00;
}
FSR0 = 0xFF;
INDF0 = 0x00;
}
/************************************************
; * @函数名 : IO_Init
; * @说明 : IO初始化
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void IO_Init(void)
{
IOP0 = 0x00; //io口数据位
OEP0 = 0x3F; //io口方向 1:out 0:in
PUP0 = 0x00; //io口上拉电阻 1:enable 0:disable
PDP0 = 0x00; //io口下拉电阻 1:enable 0:disable
P0ADCR = 0x00; //io类型选择 1:模拟输入 0:通用io
IOP1 = 0x00; //io口数据位
OEP1 = 0xF9; //io口方向 1:out 0:in
PUP1 = 0x00; //io口上拉电阻 1:enable 0:disable
PDP1 = 0x00; //io口下拉电阻 1:enable 0:disable
P1ADCR = 0x00; //io类型选择 1:模拟输入 0:通用io
IOP2 = 0x00; //io口数据位
OEP2 = 0x0F; //io口方向 1:out 0:in
PUP2 = 0x00; //io口上拉电阻 1:enable 0:disable
PDP2 = 0x00; //io口下拉电阻 1:enable 0:disablea
PMOD = 0x00; //P00、P01、P13 io端口值从寄存器读,推挽输出
DRVCR = 0x80; //普通驱动
}
/************************************************
; * @函数名 : INT_Init
; * @说明 : 外部中断初始化
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void INT_Init(void)
{
/*************INT0**************/
//上面的表格可以看到MCR寄存器的BIT0和BIT1是设置INT0的中断触发方式,这里设置的是01,所以INT0为下降沿触发,BIT2和BIT3是设置INT1的触发方式,这里没有置位,那就是初始值,上面也说明了初始值都是0,所以INT1的触发方式就是上升沿触发。
MCR |= DEF_SET_BIT0; //INI0下降沿触发
//这里要说明 一下,INT0对应的是P11口,INT1对应的是P12口,这个是芯片型号已经确定的,不可以更改。所以下面就是对P11的操作,将P11口设置为输入内部上拉,这样在没有外部输入的情况下,系统检查到的是高电平,然后设置为输入状态,这样就完成了配置。当外部有拉低的时候,就会把这个脚从高拉到低的过程,就是我们所说的下降沿。系统就可以检测到外部这个中断,然后进入到中断处理程序。
PUP1 |= DEF_SET_BIT1; //上拉
OEP1 &= DEF_CLR_BIT1; //in
//INT0IF是中断标志位,产生中断的时候置1,需要手动清除,所以看到我们的中断处理程序就是通过这个标志位,来判断是否参数了INT0的中断。INT0IE是中断是能位,就先开关一样,要用先要把开关打开,不用就关闭这个功能,关闭了你配置其他的也用不了,就像插头开关都关了,上面接电饭煲是不可能煮饭或者煲汤的。
INT0IF = 0;
INT0IE = 1; //外部中断使能
/*************INT1**************/
MCR &= ~(DEF_SET_BIT2 | DEF_SET_BIT3); //INI1上升沿触发
PDP1 |= DEF_SET_BIT2; //下拉
OEP1 &= DEF_CLR_BIT2; //in
INT1IF = 0;
INT1IE = 1; //外部中断使能
}
/************************************************
; * @函数名 : Sys_Init
; * @说明 : 系统初始化
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void Sys_Init(void)
{
GIE = 0;
CLR_RAM();
IO_Init();
INT_Init();
GIE = 1;
}
/************************************************
; * @函数名 : main
; * @说明 : 主程序
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void main(void)
{
Sys_Init();
while (1)
{
}
}
/************************************************
; * @函数名 : interrupt
; * @说明 : 中断函数
; * @输入参数 :
; * @返回参数 :
; ***********************************************/
void int_isr(void) __interrupt
{
__asm
movra _abuf
swapar _PFLAG
movra _statusbuf
__endasm;
//=======外部中断0=================
if (INT0IF & INT0IE)
{
INT0IF = 0;
P14D =! P14D;
}
//=======外部中断1=================
if (INT1IF & INT1IE)
{
INT1IF = 0;
P10D =! P10D;
}
__asm
swapar _statusbuf
movra _PFLAG
swapr _abuf
swapar _abuf
__endasm;
}
/**************************** end of file *********************************************/