可编程标志寄存器学习总结

来源:互联网 发布:淘宝体检中心在哪 编辑:程序博客网 时间:2024/05/16 14:46

1.       可编程标志寄存器在内存中的映射如下:

 

内存映射地址

寄存器名称

0XFFC0 0700

FIO_FLAG_D

0XFFC0 0704

FIO_FLAG_C

0XFFC0 0708

FIO_FLAG_S

0XFFC0 070C

FIO_FLAG_T

0XFFC0 0710

FIO_MASKA_D

0XFFC0 0714

FIO_MASKA_C

0XFFC0 0718

FIO_MASKA_S

0XFFC0 071C

FIO_MASKA_T

0XFFC0 0720

FIO_MASKB_D

0XFFC0 0724

FIO_MASKB_C

0XFFC0 0728

FIO_MASKB_S

0XFFC0 072C

FIO_MASKB_T

0XFFC0 0730

FIO_DIR

0XFFC0 0734

FIO_POLAR

0XFFC0 0738

FIO_EDGE

0XFFC0 073C

FIO_BOTH

0XFFC0 0740

FIO_INEN

 

在这里有一个不明白的地方是:明明所有的寄存器都是16位的,两个字节就可以了,为什么所有的都占了四个字节?难道是用于扩展,避免以后出现32位?

 

由此可以看出,可编程标志寄存器大致可以分为如下几组:

组别

寄存器名称

第一组

FIO_FLAG_D

FIO_FLAG_C

FIO_FLAG_S

FIO_FLAG_T

第二组

FIO_MASKX_D

FIO_MASKX_C

FIO_MASKX_S

FIO_MASKX_T

第三组

FIO_DIR

FIO_POLAR

FIO_EDGE

FIO_BOTH

FIO_INEN

 

那么这几组寄存器有何关系,它们又是如何组合工作的呢?

所有的寄存器每一位都对应一个PF引脚。

首先我们来介绍下D,C,S,T所分别代表的意义:

D: 为数据,当对它进行写时,指定各个引脚的状态。当对它进行读时,返回的是各个引脚的值。

C,S,T主要用于以下两种情况:

1)置位,清除或者触发每个输出引脚的状态。

2)清除从各个输入引脚捕获到的锁存中断状态。

有一点没有搞清楚的是,好像FIO_MASKX_DFIO_MASKX_S寄存器都能设置使能中断。FIO_MASKX_D也可以像FIO_MASKX_C一样清除中断。

FIO_DIR  1:输出  0:输入

不过当为输入的时候,必须使能缓冲,也即FIO_INEN的相应位要置1.

FIO_POLARFIO_EDGEFIO_BOTH都是用在输入的情况下,当为输出时,没有任何意义。那么它们在输入的时候,到底是用来干什么的呢?当为输入的时候,它们的配置组合是用来解释从各个引脚读出来的10到底代表个什么东西。

FIO_POLAR    0:高电平或上升沿

               1:低电平或下降沿

FIO_EDGE       0:电平敏感

                1:边沿敏感

边沿敏感和电平敏感的区别:

       当被配置为边沿敏感时,从D,S,C,T这些寄存器读来的值是具有粘性的。也就是说除非通过用户代码进行清除,否则这些值一旦被设置就不会发生改变。而被设置为电平敏感的引脚,在每个时钟周期都会对引脚的状态进行检查,一旦引脚原先的电平发生了变化,读出来的值也会相应的发生变化。

FIO_BOTH     主要是用来使能在两个边沿(上升沿和下降沿)产生中断,当然前提是FIO_EDGE被设置为边沿敏感,并且当前为输入。

  0:单个边沿                  1:两个边沿

 

 现在我们来看一下它们组合起来的效果:

FIO_POLAR

FIO_EDGE

FIO_BOTH

MMR设置的效果

0

0

X

从这里可以看出引脚是电平敏感的,FIO_BOTH无效,所以读出来的值为1代表高电平,0代表低电平

0

1

0

单个边沿周期敏感。上升沿为0,下降沿为1

1

0

X

电平敏感。低电平为1,高电平为0,刚好和第一项相反

1

1

0

下降沿为1,上升沿为0,刚好和第二项相反

X

1

1

两个边沿敏感,不管是上升沿还是下降沿都读为1

 

原创粉丝点击