首页->【玩CortexM0】

22 1

[Nuvoton M0516] 实验七 IO中断脉冲截获实验

中断截获实际上可以理解成当某个IO口有输入信号时产生中断,而后对这个口进行计数。这个功能是很有用的。

除了看手册外,更重要的是要看Register_Bit.h,这个文档在Includes文件夹中,里面有许多定义,可以增减这些定义以满足我们的需要。如果不想改变此文档,可以新增加一个文档存放自己定义的增减对象。下边开始本实验。先考虑采用P3口的还没有用的P32,P33做我们的脉冲触发实验的IO口,实验如下:

首先需要更改ioInit()函数里的P3口的定义,改为:

P3_PMD = 0x000F;//高6位输入,第2位数字[其实都是数字也可]

在变量定义区增加整形变量两个:

plusIn32,plusIn33,

接着增加两段初始化P32,P33函数:

//GPIO32 Initial

void p32Init(void){

 P3_MFP = (P3_MFP & (~P32_EINT0)) | EINT0;

 P3_PMD &=~(3<<4);

 P3_IMD &=IMD2_LEV;

 P3_IEN |=IF_EN2;

 NVIC_ISER |=EXT_INT0;

}

//GPIO32 Initial

void p33Init(void){

 P3_MFP = (P3_MFP & (~P33_EINT1_MCLK)) | EINT1;

 P3_PMD &=~(3<<6);

 P3_IMD &=IMD3_LEV;

 P3_IEN |=IF_EN3;

 NVIC_ISER |=EXT_INT1;

}

两者第二行不一样,因为报错。搜Register_Bit.h文档,没有对应P32_EINT0的P33_EINT1这个定义,但有P33_EINT1_MCLK,于是拿来主义直接引用,Ok!此外,两者都是采用电平触发方式。如果要沿触发,将IMDx_LEV改成IMDx_EDG即可。

在dispBase()函数中增加两行:

c2l(3,0,25);c2l(3,1,18);c2l(3,2,2);c2l(3,3,40);//PI2:

c2l(3,9,25);c2l(3,10,18);c2l(3,11,3);c2l(3,12,40);//PI3:

在dispMed()函数中增加两行:

c2l(3,4,(plusIn32/1000)%10);c2l(3,5,(plusIn32/100)%10);c2l(3,6,(plusIn32/10)%10);c2l(3,7,(plusIn32)%10);//PI3:

c2l(3,13,(plusIn33/1000)%10);c2l(3,14,(plusIn33/100)%10);c2l(3,15,(plusIn33/10)%10);c2l(3,16,(plusIn33)%10);//PI3:

在主函数main加入IO初始化函数:

p32Init();

p33Init();

最后在主函数之后增加两段中断处理函数:

//PORT32 Interrupt

void EINT0_IRQHandler(void){

 plusIn32++;

 P3_ISRC |= 1<<2;  

}

//PORT33 Interrupt

void EINT1_IRQHandler(void){

 plusIn33++;

 P3_ISRC |= 1<<3;  

}

中断处理函数很简单,就是将每个IO口的输入的电平累加,在LCD上显示即可。

程序编译下载后运行结果见照片71。71-P27脉冲引到P32累加计数.JPG

楼主可见

  1. zhao77 1#

    支持下哈哈