打印

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

[复制链接]
9250|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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见附件!

GPIO_ChangeFromRead_Interrupt.zip

40.03 KB

沙发
Go_PSoC| | 2012-3-29 17:50 | 只看该作者
很好的帖子

使用特权

评论回复
板凳
PSoC小子|  楼主 | 2012-4-2 07:55 | 只看该作者
这种中断方式也算是 PSoC1 的一个小特色了。 在某些应用中使用这种中断方式还是很实用的,比如一些解码。

使用特权

评论回复
地板
夏日飞鹰| | 2013-7-24 08:10 | 只看该作者
谢谢

使用特权

评论回复
5
lstslrm| | 2013-11-29 17:22 | 只看该作者
版主,你好,你用了您提供的历程,程序进不了中断,不知道还有那学原因容易导致中断程序不执行呢?

使用特权

评论回复
6
wangjinlili| | 2013-11-30 19:12 | 只看该作者
学习了 谢谢楼主

使用特权

评论回复
7
meishizhaoshi| | 2013-11-30 19:15 | 只看该作者
楼主的方法不错 下次试试

使用特权

评论回复
8
sishangcine| | 2013-11-30 19:26 | 只看该作者
这么好的贴为什么不置顶

使用特权

评论回复
9
heibaiyinjiag| | 2013-11-30 19:33 | 只看该作者
很实用 收藏了 顺便转走了

使用特权

评论回复
10
taihezhibanh| | 2013-11-30 19:36 | 只看该作者
版主好勤奋啊 赞一个

使用特权

评论回复
11
engtafanzhuan| | 2013-11-30 19:51 | 只看该作者
学习了 很棒 虽然新手看不太懂。。。

使用特权

评论回复
12
flyingfox110| | 2014-1-13 17:56 | 只看该作者
并不是所有的psoc1都有这个中断方式吧。

使用特权

评论回复
13
happygirlwz| | 2014-1-27 17:05 | 只看该作者
不错,学习一下…………

使用特权

评论回复
14
teabottle| | 2014-2-12 22:13 | 只看该作者
谢谢lz的资料 帮助我解决了很多问题

使用特权

评论回复
15
chao11yue| | 2014-2-14 14:37 | 只看该作者
好贴 应该置顶啊

使用特权

评论回复
16
haidixibahe| | 2014-2-14 15:04 | 只看该作者
下载了 谢谢lz的资料

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

514

帖子

6

粉丝