一、 可编程标志口简介
可编程标志口即所谓的通用目的I/O口,这是CPU的最基本的外设,嵌入式系统中,任何一个CPU都会有通用目的I/O口,他们的属性都基本上相似,只是叫法不一样而已。
ADSP-BF531/2/3处理器有16个双向的通用目的可编程I/O引脚(PF[15:0])。每个引脚可以通过方向寄存器(FIO_DIR)独立配置为输入或者输出。当配置成输出时,可以通过直接写入数据寄存器(FIO_FLAG_D)来改变输出引脚的状态;也可以通过置位寄存器(FIO_FLAG_S)、清零寄存器(FIO_FLAG_C)和翻转寄存器(FIO_FLAG_T)来控制PFx 引脚的状态。当配置成输入时,以上寄存器都可以返回PFx口的状态。
值得注意的是,部分可编程标志口与其他外设复用,使用复用功能时,我们需要设置相应的外设寄存器。复用功能如表6-1。
表6-1 可编程标志口复用功能
PF 引脚 | PPI复用功能 | SPI 复用功能 | 定时器复用 |
0 | - | SPISS 低电平有效 |
|
1 |
| SPISEL1 | 输入时钟 |
2 |
| SPISEL2 |
|
3 | Frame Sync 3 | SPISEL3 |
|
4 | IO #15 | SPISEL4 |
|
5 | IO #14 | SPISEL5 |
|
6 | IO #13 | SPISEL6 |
|
7 | IO #12 | SPISEL7 |
|
8 | IO #11 |
|
|
9 | IO #10 |
|
|
10 | IO #9 |
|
|
11 | IO #8 |
|
|
12 | IO #7 |
|
|
13 | IO #6 |
|
|
14 | IO #5 |
|
|
15 | IO #4 |
|
|
从上面我们可以看出,本来I/O口不多,偏偏又共享出去了那么多,如果我们使用PPI、SPI等外设,对用户来说,剩下的可用IO口更少了。不错,事实就是这样,作为一款 DSP芯片,较少的IO口也是可以理解的。一般情况下,如果我们的系统中控制部分如果太复杂、使用I/O口较多的情况下,则需要I/O扩展(通过74系列逻辑芯片、CPLD以及专用的I/O扩展芯片)。
二、 I / O相关寄存器
1、方向寄存器
顾名思义,此寄存器可以设置PFx引脚的输入、输出方向。此寄存器是一个可读、写寄存器,每一位对应着一个PFx引脚。逻辑1将PFx引脚配置为输出方式,逻辑0将PFx引脚配置为输入方式。复位时,其值为0X0000,此时所有的PFx引脚均被配置为输入方式。
注意:如果PFx引脚被配置为输入方式时,一定要设置FIO_INEN中相应的位。
表6-2 FIO_DIR(地址:0XFFC0 0730 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_DIR | 可编程标志口方向寄存器,16位分别可以设置FP0~PF15的方向,为0时,为输入;为1时,为输出。 |
2、数值操作寄存器
处理器包含了四个数值操作相关的寄存器,他们分别为数据寄存器(FIO_FLAG_D)、置位寄存器(FIO_FLAG_S)、清零寄存器(FIO_FLAG_C)和翻转寄存器(FIO_FLAG_T)。四个寄存器通过不同的模式来操作PFx口与外界数据的交换,他们可以用来:
我们不但可以读取PFx的状态,也可以通过设置极性寄存器(FIO_POLAR)、边沿寄存器(FIO_EDGE)和双边沿寄存器(FIO_BOTH)来读取相应IO口上的电平状态、上升沿、下降沿的探测。这个功能其他处理器很少有。
表6-3 数值寄存器注释
FIO_POLAR | FIO_EDGE | FIO_BOTH | 说明 |
0 | 0 | X | 引脚为高电平时,读出为1;引脚为低电平时,读出为0 |
0 | 1 | 0 | 如果上升沿发生,读出为1;否则读出为0 |
1 | 0 | X | 引脚为低电平时,读出为1,;引脚为高电平时,读出为0 |
1 | 1 | 0 | 如果下降沿发生,读出为1,否则读出为0 |
X | 1 | 1 | 如果上升沿或者下降沿发生,读出为1,否则读出为0 |
(1)数据寄存器(FIO_FLAG_D)
当PFx引脚设置为输入方式时,FIO_FLAG_D中的每一位对应着每个PFx的输入电平或者边沿值见表6-3。当PFx引脚为输出方式时,通过向FIO_FLAG_D中写数据,从而指定每个PFx引脚的输出状态,逻辑1代表输出高电平,逻辑0代表输出低电平。相应的位写入 0 时,引脚输出低电平,写入 1 时,引脚输出高电平。
表6-4 FIO_FLAG_D(地址:0XFFC0 0700 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_DIR | 可编程标志口方向寄存器,16位分别可以设置FP0~PF15的方向,为0时,为输入;为1时,为输出。 |
(2)置位寄存器(FIO_FLAG_S)
置位寄存器,写入1时相应的端口置位,写入 0 时端口值保持不变。这样我们就很方便的对某一位端口置位而不影响其他端口的状态。
表6-5 FIO_FLAG_S(地址:0XFFC0 0708 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_FLAG_S | 可编程标志口置位寄存器,16位分别对应FP0~PF15的置位操作,为0时,维持原值不变;为1时,设置输出为1。 |
(3)清零寄存器(FIO_FLAG_C)
清零寄存器,写入1时相应的端口清零,写入0是端口保持不变。这样我们就很方便的对某一位端口值单独清零而不影响其他端口的状态。
表6-6 FIO_FLAG_C(地址:0XFFC0 0704 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_FLAG_S | 可编程标志口置位寄存器,16位分别对应FP0~PF15的置位操作,为0时,维持原值不变;为1时,设置输出为1。 |
(4)翻转寄存器(FIO_FLAG_T)
翻转寄存器,写入1时相应的端口值翻转(原来为高则置低,原来为低则置高),写入0是端口保持不变。
表6-7 FIO_FLAG_T(地址:0XFFC0 0704 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_FLAG_T | 可编程标志口翻转寄存器,16位分别对应FP0~PF15的翻转操作,为0时,维持原值不变;为1时,对相应的端口进行翻转操作。 |
(5)其他寄存器
除了数据操作寄存器外,还包含了极性控制寄存器(FIO_POLAR)、边沿寄存器(FIO_EDGE)以及双边沿寄存器(FIO_BOTH)。他们用于设定读操作时,数据置1的条件。
表6-8 FIO_POLAR(地址:0XFFC0 0734 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_POLAR | 可编程标志口极性寄存器,16位分别对应FP0~PF15的极性,为0时,代表高电平或者上升沿有效;为1时,代表低电平或者下降沿有效,请参考表6-3。 |
表6-9 FIO_EDGE(地址:0XFFC0 0738 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_EDGE | 可编程标志口边沿寄存器,16位分别对应FP0~PF15的边沿设定,为0时,代表高电平触发;为1时,代表边沿触发,请参考表6-3。 |
表6-10 FIO_BOTH(地址:0XFFC0 073C 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_BOTH | 双边沿寄存器,16位分别对应FP0~PF15的双边沿设定,为0时,代表单边沿触发;为1时,代表双边沿触发(上升沿和下降沿均触发),请参考表6-3。 |
三、 中断
可编程标志口的每个端口都可以产生中断,他们有两个中断向量,分别为可编程标志口中断A 和可编程标志口中断B。PF0~PF15可以任意向这两个中断向量中设置。值得注意的是,每个中断向量如果多于一个触发源(例如我们把PF0和PF1都设置指向中断向量A),则他们最终是以“或”的关系触发中断。
如果设置成电平中断(FIO_EDGE对应位设置成0),则只要引脚满足中断的电平条件(低电平或者高电平,取决于寄存器FIO_POLAR),就会触发中断,条件消失后,中断才不会触发;如果设置成边沿中断(FIO_EDGE对应位设置成1),边沿触发后立即触发中断,进入中断后,需要手动清除寄存器数值(可以通过写寄存器 FIO_FLAG_C的相应位清除)。
每个中断向量包含四个寄存器,他们分别为中断掩码数据寄存器、中断掩码设置寄存器、中断掩码清除寄存器和中断掩码翻转寄存器。四个寄存器设置可以达到同样的效果,如果对应位设定时,则使能中断,对应位清除时,则禁止中断。上电复位后,默认禁止所有中断。
表6-11 FIO_MASKA_D(地址:0XFFC0 0710 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_MASKA_D | 可编程标志口中断向量A数据寄存器,0~15位分别对应PF0~PF15端口,对应位写入1使能中断,写入0时禁止中断。 |
表6-12 FIO_MASKA_S(地址:0XFFC0 0718 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_MASKA_S | 可编程标志口中断向量A置位寄存器,0~15位分别对应PF0~PF15端口,对应位写入1使能中断,写入0时保持原数据不变。 |
表6-13 FIO_MASKA_C(地址:0XFFC0 0714 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_MASKA_C | 可编程标志口中断向量A清除寄存器,0~15位分别对应PF0~PF15端口,对应位写入1禁止中断,写入0时保持原数据不变。 |
表6-14 FIO_MASKA_T(地址:0XFFC0 071C 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_MASKA_T | 可编程标志口中断向量A翻转寄存器,0~15位分别对应PF0~PF15端口,对应位写入1数据翻转(原来使能则禁止、原来禁止则使能),写入0时保持原数据不变。 |
表6-15 FIO_MASKB_D(地址:0XFFC0 0720 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_MASKB_D | 可编程标志口中断向量B数据寄存器,0~15位分别对应PF0~PF15端口,对应位写入1使能中断,写入0时禁止中断。 |
表6-16 FIO_MASKB_S(地址:0XFFC0 0728 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_MASKB_S | 可编程标志口中断向量B置位寄存器,0~15位分别对应PF0~PF15端口,对应位写入1使能中断,写入0时保持原数据不变。 |
表6-17 FIO_MASKB_C(地址:0XFFC0 0724 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_MASKB_C | 可编程标志口中断向量B清除寄存器,0~15位分别对应PF0~PF15端口,对应位写入1禁止中断,写入0时保持原数据不变。 |
表6-18 FIO_MASKB_T(地址:0XFFC0 072C 复位值0x0000)
位 | 名称 | 描述 |
15:0 | FIO_MASKB_T | 可编程标志口中断向量B翻转寄存器,0~15位分别对应PF0~PF15端口,对应位写入1数据翻转(原来使能则禁止、原来禁止则使能),写入0时保持原数据不变。 |
-----------------------------------小马哥派来的分割线------------------------------------
附录 一、可编程标志口相关例程,包括:
1、流水灯;
2、按键测试;
3、按键边沿检测测试;
4、可编程标志口中断测试。
所有例程通过 MS531-II 开发板验证;例程仅供学习之用!不承担商业应用带来的一切直接、间接后果。
http://files.cnblogs.com/xiaomagee/example.zip
文章评论(0条评论)
登录后参与讨论