在线时间613 小时
UID252169
注册时间2010-12-5
NXP金币0
TA的每日心情 | 开心 2019-2-14 16:49 |
---|
签到天数: 296 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4473
- 最后登录
- 2020-4-14
|
本帖最后由 zhjb1 于 2016-9-5 14:23 编辑
FRDM_KL25Z 实验六 I/O中断实验
查FRDM KL25Z资料说明可以产生中断的I/O口有PORTA、PORTD两个口,由于D口已用了0~3作为LCD的接口,因此余下的4~7可以做实验,计划采用PORTD-5[没有别的意思,D5扣在最外边]做I/O口中断实验。看了用KL26转换过来的SDK,没有I/O中断的例程,但在MKL_GPIO.h中有关于IO口中断和清除标志的说明函数:
#define IO_IRQ_CONFIG(PTO, BIT, IRQ)————中断函数
PCR(PTO,BIT) = (PCR(PTO,BIT) & (~PORT_PCR_IRQC_MASK))|PORT_PCR_IRQC(IRQ);————清中断标志
于是参照IO口的设置在ioInit()中添加了PORTD-5的定义:
//PORTD_5 Direct IO IRQ setting
IO_FUN_SEL(MKL_PORTD,5,1);//PTD5=1 GPIOMODE
GPIO_DDR_INPUT(MKL_PORTD,5);//PTD5 input
IO_IRQ_CONFIG(MKL_PORTD,5,9);//PTD5 IRQ=9 rising edge
参照LPTimer的中断函数
void LPTimer_IRQHandler(void){
LPTMR0_CSR |= LPTMR_CSR_TCF_MASK;//lptmr标志位清除
t0++;//User Process
}
改成PORTD的:
//PORTD Interupt
void PORTD_IRQHandler(void){
plus++;
PCR(D,5)=(PCR(D,5)&(~PORT_PCR_IRQC_MASK))|PORT_PCR_IRQC(9);//9 is Interupt's mode
}
其中的plus为IO口外部信号计数器,由主程序清零并显示
再在main中加入中断级别声明:
NVIC_EnableIRQ(PORTD_IRQn);
NVIC_SetPriority(PORTD_IRQn,4);//PORTD interupt level
是pti、lptmr之后的4级中断,前者是2,3级。
再在LCD程序中加入显示plus的数据,结果见照片。
照片中的外部信号是从示波器上取得的1KHz3Vpp的脉冲信号作为PORTD_5的信号输入。
以上的设计参考了KL25P80M48SF0RM.pdf这个最长的说明文档,重点是11.5.1 Pin Control Register n (PORTx_PCRn)这一节介绍的POATD_n寄存器的设置,并且在IAR中查看了寄存器的值修改设置,也受到小恩GG的提携,表示感谢。
最后说明的是,时钟基准为6MHz,tip中断设定为0.2秒1次,主程序中测试tip的累加值为1——就是0.2秒读取IO中断的计数值,按道理应该是200个脉冲,但实际显示为380或381,非常准的两个数值。非常不理解的采样值。但没有关系,只要找到对应的修正系数就可以了。反正是实验——自我安慰吧。
|
-
中断显示380的
-
中断显示381的
|