找回密码
 注册
搜索
查看: 1664|回复: 4

[讨论] 请教MTK GPIO::GPIO_WriteIO函数的处理

[复制链接]
发表于 2010-6-9 11:07:31 | 显示全部楼层 |阅读模式
最近读了一下MTK的GPIO_WriteIO函数,发现最后处理GPIO高低的调用是:
   if (data == 1)
      DRV_WriteReg(GPIO_DOUT_SET(no),(1 << remainder));
        else
      DRV_WriteReg(GPIO_DOUT_CLR(no),(1 << remainder));
继续分析这段代码发现,如果想把GPIO_0拉高,实际上是将
#define         GPIO_DOUT1_SET      (GPIO_base+0x00c0+0x04)
也就是将(0x80120000+0x00c0+0x04)= 0x801200C4的第0位置为1,即:
*(volatile kal_16*)0x801200C4 = 0x0001;
我的困惑在于:
1)datasheet上并没有给出对应的说明,只是有GPIO_base+0x00C0h寄存器看似是相应的功能,为什么代码里是C4呢?
2)如果按照GPIO+0x00C0h的说明,这个十六位的寄存器每一位都对应一个gpio,如此使用方式*(volatile kal_16*)0x801200C4 = 0x0001,为什么不会影响到其他gpio呢,也就是当0x801200C4= 0x0001,其他的gpio1-15为啥不受影响?

希望得到高手的指点。多谢!
 楼主| 发表于 2010-6-9 13:45:16 | 显示全部楼层
大虾...,大...虾....!
请留步。
点评回复

使用道具 举报

发表于 2010-6-9 14:12:57 | 显示全部楼层
MTK有些芯片的规格书不完整。

我记得是这样的,可能有误:

一般16个GPIO集合使用一个16bit的寄存器。

比如GPIOX所在的寄存器地址为A,则A+4为对应GPIO集合的"SET寄存器"。如果要将某个GPIO置高,则需要将“SET寄存器A+4”对应位置置1,A会自动与A+4进行逻辑或运算,运算完毕后A+4寄存器自动清零。也就相当于A的对应位置也被置1,GPIO被设置为高电平,而不影响到其他GPIO口。

CLR寄存器为A+8,和SET类似,只是不是进行"或"运算,而是"非与"运算。就会在不影响其他GPIO的情况下,将需要的GPIO设为低电平。
点评回复

使用道具 举报

 楼主| 发表于 2010-6-9 15:11:12 | 显示全部楼层
楼上所言很有道理。
点评回复

使用道具 举报

发表于 2010-6-13 10:36:33 | 显示全部楼层
什么都没有!
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-15 16:27 , Processed in 0.046092 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表