免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

CYPRESS PSoC1 GPIO ChangeFromRead 中断模式的使用方法

众所周知,PSoC1的IO支持三种中断模式:上升沿中断、下降沿中断和 ChangeFromRead中断。 Read 指的是读取寄存器(PRTxDR), Change From Read 是说如果当前 PRTxDR 的值和最后一次读取的 PRTxDR 的值相比有变化则触发此中断。

例如把 P0[7] 的中断模式设置成 ChangeFromRead, 然后我们可以使用代码 “X = PRT0DR & 0x80” 来读取PRT0DR 中 P0[7] 的对应位。 在此代码执行完毕后,CPU会自动记录此次读取的 PRT0DR 第7位的值, 所以我们只需完成读的动作而无需关注结果是什么。 下图是GPIO的内部中断逻辑电路。当设置成 ChangeFromRead 模式,中断是否产生只取决于异或门C的输出是否是1,而C的输出取决于两个输入: QinLatch(最后一次读取的PRTxDR的值) 和 INBUF(当前PRTxDR的值)。因此当前PRTxDR的值发生改变时,C的两输入不相同,输出为1 中断产生。

因此使用此中断模式最关键的就是在合适的时机去不断的读取 PRTxDR 的值,这样当输入改变时才有对比的对象。
具体的示例代码如下(P0[7] 为中断输入,P1[7]为LED输出):

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules

#pragma interrupt_handler Cfr_Isr
void Cfr_Isr(void);
BYTE Isr_Flag = 0;
BYTE X;
void main(void)
{

     INT_MSK0 |=INT_MSK0_GPIO; //Enable GPIO Interrupt
     M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   
     X = PRT0DR&0x80; //Read action
   
     while(1)
     {
         if(Isr_Flag) // If interrupt occur
         {
             Isr_Flag = 0; // Clear Interrupt Flag
             PRT1DR ^= 0x80; // Toggle P1[7] output
         }
     }
}
// Interrupt function
void Cfr_Isr(void)
{
     Isr_Flag = 1; // Set Interrupt Flag
     X = PRT0DR & 0x80; //Read action
}
返回列表