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

[复制链接]
10234|15
 楼主| PSoC小子 发表于 2012-3-29 11:34 | 显示全部楼层 |阅读模式
本帖最后由 PSoC小子 于 2012-3-29 22:04 编辑

众所周知,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
}
Project见附件!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
Go_PSoC 发表于 2012-3-29 17:50 | 显示全部楼层
很好的帖子
 楼主| PSoC小子 发表于 2012-4-2 07:55 | 显示全部楼层
这种中断方式也算是 PSoC1 的一个小特色了。 在某些应用中使用这种中断方式还是很实用的,比如一些解码。
夏日飞鹰 发表于 2013-7-24 08:10 | 显示全部楼层
lstslrm 发表于 2013-11-29 17:22 | 显示全部楼层
版主,你好,你用了您提供的历程,程序进不了中断,不知道还有那学原因容易导致中断程序不执行呢?
wangjinlili 发表于 2013-11-30 19:12 | 显示全部楼层
学习了 谢谢楼主
meishizhaoshi 发表于 2013-11-30 19:15 | 显示全部楼层
楼主的方法不错 下次试试
sishangcine 发表于 2013-11-30 19:26 | 显示全部楼层
这么好的贴为什么不置顶
heibaiyinjiag 发表于 2013-11-30 19:33 | 显示全部楼层
很实用 收藏了 顺便转走了
taihezhibanh 发表于 2013-11-30 19:36 | 显示全部楼层
版主好勤奋啊 赞一个
engtafanzhuan 发表于 2013-11-30 19:51 | 显示全部楼层
学习了 很棒 虽然新手看不太懂。。。
flyingfox110 发表于 2014-1-13 17:56 | 显示全部楼层
并不是所有的psoc1都有这个中断方式吧。
happygirlwz 发表于 2014-1-27 17:05 | 显示全部楼层
不错,学习一下…………
teabottle 发表于 2014-2-12 22:13 | 显示全部楼层
谢谢lz的资料 帮助我解决了很多问题
chao11yue 发表于 2014-2-14 14:37 | 显示全部楼层
好贴 应该置顶啊
haidixibahe 发表于 2014-2-14 15:04 | 显示全部楼层
下载了 谢谢lz的资料
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

514

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部