第 8 章 数字量 i/o 模块

54
第8第 第第第 I/O 第第

Upload: nowles

Post on 17-Jan-2016

92 views

Category:

Documents


0 download

DESCRIPTION

第 8 章 数字量 I/O 模块. 8.1 数字量 I/O 端口概述. F2407 系列有 41 个通用、双向的数字量 I/O ( GPIO )引脚,其中大多数都是基本功能和一般 I/O 复用引脚。. 9 个 16 位控制寄存器:设置专用 I/O 和复用 I/O 引脚的功能。. · I/O 端口复用控制寄存器( MCRx ) · 数据和方向控制寄存器( PxDATDIR ). 控制寄存器. I/O 端口复用控制寄存器( MCRx ) :选择 I/O 端口作为基本功能方式还是一般 I/O 引脚功能。. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 8 章  数字量 I/O 模块

第 8 章

数字量 I/O 模块

Page 2: 第 8 章  数字量 I/O 模块

8.1 数字量 I/O 端口概述F2407 系列有 41 个通用、双向的数字量 I/O ( GPIO )引脚,其中大多数都是基本功能和一般 I/O 复用引脚。

9 个 16 位控制寄存器:设置专用 I/O 和复用 I/O 引脚的功能。

· I/O 端口复用控制寄存器( MCRx ) · 数据和方向控制寄存器( PxDATDIR )

Page 3: 第 8 章  数字量 I/O 模块

控制寄存器

I/O 端口复用控制寄存器( MCRx ) :选择 I/O 端口作为基本功能方式还是一般 I/O 引脚功能。

数据和方向控制寄存器( PxDATDIR ): 当 I/O端口用作一般 I/O 引脚功能时,用数据和方向控制寄存器可控制数据和双向 I/O 引脚的数据方向。

Page 4: 第 8 章  数字量 I/O 模块

8.2 数字量 I/O 端口寄存器1. 数字量 I/O 控制寄存器地址

寄存器映射到存储器数据空间,地址为 7090h~709Fh 。

地 址 存储寄存器 说 明7090h MCRA I/O 复用控制寄存器 A

7092h MCRB I/O 复用控制寄存器 B

7094h MCRC I/O 复用控制寄存器 C

7098h PADATDIR I/O 端口 A 数据和方向寄存器709Ah PBDATDIR I/O 端口 B 数据和方向寄存器709Ch PCDATDIR I/O 端口 C 数据和方向寄存器709Eh PDDATDIR I/O 端口 D 数据和方向寄存器7095h PEDATDIR I/O 端口 E 数据和方向寄存器7096h PFDATDIR I/O 端口 F 数据和方向寄存器

Page 5: 第 8 章  数字量 I/O 模块

复用引脚配置图

Page 6: 第 8 章  数字量 I/O 模块

8.2.1 I/O 端口复用输出控制寄存器

1 . I/O 端口复用控制寄存器 A ( MCRA ) 地址 7090h

15 14 13 12 11 10 9 8

MCRA.15 MCRA.14 MCRA.13 MCRA.12 MCRA.11 MCRA.10 MCRA.9 MCRA.8

RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_0

7 6 5 4 3 2 1 0

MCRA.7 MCRA.6 MCRA.5 MCRA.4 MCRA.3 MCRA.2 MCRA.1 MCRA.0

RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_0

注 :R= 可读 , W= 可写 , _0= 复位后的值

Page 7: 第 8 章  数字量 I/O 模块

I/O 端口复用控制寄存器 A ( MCRA )配置

位 位的名称引脚功能选择

基本功能( MCRA.n = 1 ) 一般 I/O 端口( MCRA.n =0 )

0 MCRA.0 SCITXD IOPA0

1 MCRA.1 SCIRXD IOPA1

2 MCRA.2 XINT1 IOPA2

3 MCRA.3 CAP1/QEP1 IOPA3

4 MCRA.4 CAP2/QEP2 IOPA4

5 MCRA.5 CAP3 IOPA5

6 MCRA.6 PWM1 IOPA6

7 MCRA.7 PWM2 IOPA7

8 MCRA.8 PWM3 IOPB0

9 MCRA.9 PWM4 IOPB1

10 MCRA.10 PWM5 IOPB2

11 MCRA.11 PWM6 IOPB3

12 MCRA.12 T1PWM/T1CMP IOPB4

13 MCRA.13 T2PWM/T2CMP IOPB5

14 MCRA.14 TDIRA IOPB6

15 MCRA.15 TCLKINA IOPB7

Page 8: 第 8 章  数字量 I/O 模块

2 . I/O 口复用控制寄存器 B ( MCRB ) 地址 7092h

15 14 13 12 11 10 9 8

MCRB.15 MCRB.14 MCRB.13 MCRB.12 MCRB.11 MCRB.10 MCRB.9 MCRB.8

RW_1 RW_1 RW_1 RW_1 RW_1 RW_1 RW_1 RW_0

7 6 5 4 3 2 1 0

MCRB.7 MCRB.6 MCRB.5 MCRB.4 MCRB.3 MCRB.2MCRB.

1MCRB.

0

RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_1 RW_1

注 :R = 可读 , W = 可写 , _X = 复位后的值 , X=1, X=0

Page 9: 第 8 章  数字量 I/O 模块

I/O 端口复用控制寄存器 B ( MCRB )配置

位 位的名称引脚功能选择

基本功能( MCRB.n = 1 ) 一般 I/O 端口( MCRB.n =0 )

0 MCRB.0 W/R IOPC0

1 MCRB.1 BIO IOPC1

2 MCRB.2 SPISIMO IOPC2

3 MCRB.3 SPISOMI IOPC3

4 MCRB.4 SPICLK IOPC4

5 MCRB.5 SPISTE IOPC5

6 MCRB.6 CANTX IOPC6

7 MCRB.7 CANRX IOPC7

8 MCRB.8 XINT2/ADCSOC IOPD0

9 MCRB.9 EMU0 保留位10 MCRB.10 EMU1 保留位11 MCRB.11 TCK 保留位12 MCRB.12 TDI 保留位13 MCRB.13 TDO 保留位14 MCRB.14 TMS 保留位15 MCRB.15 TMS2 保留位

Page 10: 第 8 章  数字量 I/O 模块

注意:

1.斜体表示的位必须配置成 1 ,这几个引脚是系统的专用引脚,用作与硬件仿真器接口( JTAG )相连,实现 DSP 的在线仿真功能。对以上的任一位写 0 将会引起不可预测的结果。

2.寄存器单元中保留的位是无效的,读时为 0 ,写对它无影响。

Page 11: 第 8 章  数字量 I/O 模块

3 . I/O 口复用控制寄存器 C ( MCRC ) 地址 7094h

15 14 13 12 11 10 9 8

保留 MCRC.14 MCRC.13 MCRC.12 MCRC.11 MCRC.10 MCRC.9 MCRC.8

RW-0 RW-0 RW-0 RW-0 RW-0 RW-0 RW-0

7 6 5 4 3 2 1 0

MCRC.7 MCRC.6 MCRC.5 MCRC.4 MCRC.3 MCRC.2 MCRC.1 MCRC.0

RW-0 RW-0 RW-0 RW-0 RW-0 RW-0 RW-0 RW-1

Page 12: 第 8 章  数字量 I/O 模块

I/O 端口复用控制寄存器 C ( MCRC )配置 位 位的名称

引脚功能选择

基本功能( MCRC.n = 1 ) 一般 I/O 端口( MCRC.n =0 )

0 MCRC.0 CLKOUT IOPE0

1 MCRC.1 PWM7 IOPE1

2 MCRC.2 PWM8 IOPE2

3 MCRC.3 PWM9 IOPE3

4 MCRC.4 PWM10 IOPE4

5 MCRC.5 PWM11 IOPE5

6 MCRC.6 PWM12 IOPE6

7 MCRC.7 CAP4/QEP3 IOPE7

8 MCRC.8 CAP5/QEP4 IOPF0

9 MCRC.9 CAP6 IOPF1

10 MCRC.10 T3PWM/T3CMP IOPF2

11 MCRC.11 T4PWM/T4CMP IOPF3

12 MCRC.12 TDIRB IOPF4

13 MCRC.13 TCLKINB IOPF5

14 MCRC.14 IOPF6 IOPF6

15 MCRC.15 保留位 保留位

Page 13: 第 8 章  数字量 I/O 模块

8.2.2 I/O 端口数据和方向寄存器

F2407 系列共有 6 个数据和方向控制寄存器( PxDATDIR )。

数据和方向控制寄存器:可控制数据和到双向通用 I/O 引脚的数据方向。

寄存器直接与 I/O 引脚相连。

当 I/O 用作基本功能时,寄存器的设置对相应的引脚无影响。

Page 14: 第 8 章  数字量 I/O 模块

1 .端口 A 数据和方向控制寄存器( PADATDIR )――地址 7098h

15 14 13 12 11 10 9 8

A7DIR A6DIR A5DIR A4DIR A3DIR A2DIR A1DIR A0DIR

RW-0 RW-0 RW-0 RW-0 RW-0 RW-0 RW-0 RW-0

7 6 5 4 3 2 1 0

IOPA7 IOPA6 IOPA5 IOPA4 IOPA3 IOPA2 IOPA1 IOPA0

RW-+ RW-+ RW-+ RW-+ RW-+ RW-+ RW-+ RW-+

注 :_+ = 复位后的值和相应引脚的状态有关 , R = 可读 , W = 可写 , _0 = 复位后的值

Page 15: 第 8 章  数字量 I/O 模块

位 15~8 AnDIR0 配置相应的引脚为输入方式1 配置相应的引脚为输出方式

位 7~0 IOPAn当 AnDIR=0 ,即引脚为输入方式时0 读相应引脚的值为低电平1 读相应引脚的值为高电平当 AnDIR=1 ,即引脚为输出方式时0 设置相应的引脚,使其输出为低电平;1 设置相应的引脚 使其输出为高电平。

如果 I/O 端口用作一般 I/O ,则在对端口初始化时就必须对数据和方向控制寄存器进行设置,规定其为输入还是为输出。

Page 16: 第 8 章  数字量 I/O 模块

2 .端口 B 数据和方向控制寄存器( PB

DATDIR )――地址 709Ah

15 14 13 12 11 10 9 8

B7DIR B6DIR B5DIR B4DIR B3DIR B2DIR B1DIR B0DIR

RW-0 RW-0 RW-0 RW-0 RW-0 RW-0 RW-0 RW-0

7 6 5 4 3 2 1 0

IOPB7 IOPB6 IOPB5 IOPB4 IOPB3 IOPB2 IOPB1 IOPB0

RW-+ RW-+ RW-+ RW-+ RW-+ RW-+ RW-+ RW-+

Page 17: 第 8 章  数字量 I/O 模块

3 .端口 C 数据和方向控制寄存器( PC

DATDIR )――地址 709Ch

15 14 13 12 11 10 9 8

C7DIR C6DIR C5DIR C4DIR C3DIR C2DIR C1DIR C0DIR

RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_0

7 6 5 4 3 2 1 0

IOPC7 IOPC6 IOPC5 IOPC4 IOPC3 IOPC2 IOPC1 IOPC0

RW_+ RW_+ RW_+ RW_+ RW_+ RW_+ RW_+ RW_x

注 :_+ = 复位后的值和相应引脚的状态有关, R = 可读 , W = 可写 , _0 = 复位后的值, _x=未定义

Page 18: 第 8 章  数字量 I/O 模块

4 .端口 D 数据和方向控制寄存器( PD

DATDIR )――地址 709Eh

15-9 8

保留位 D0DIR

RW-0

7-1 0

保留位 IOPD0

RW_+

Page 19: 第 8 章  数字量 I/O 模块

5 .端口 E 数据和方向控制寄存器( PE

DATDIR )――地址 7095h

15 14 13 12 11 10 9 8

E7DIR E6DIR E5DIR E4DIR E3DIR E2DIR E1DIR E0DIR

RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_0

7 6 5 4 3 2 1 0

IOPE7 IOPE6 IOPE5 IOPE4 IOPE3 IOPE2 IOPE1 IOPE0

RW_+ RW_+ RW_+ RW_+ RW_+ RW_+ RW_+ RW_x

Page 20: 第 8 章  数字量 I/O 模块

6 .端口 F 数据和方向控制寄存器 (PFDATDIR) —— 地址 7096h

15 14 13 12 11 10 9 8

保留 F6DIR F5DIR F4DIR F3DIR F2DIR F1DIR F0DIR

RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_0 RW_0

7 6 5 4 3 2 1 0

保留 IOPF6 IOPF5 IOPF4 IOPF3 IOPF2 IOPF1 IOPF0

RW_+ RW_+ RW_+ RW_+ RW_+ RW_+ RW_+ RW_+

Page 21: 第 8 章  数字量 I/O 模块

8.3 I/O 端口应用例:循环点亮 8 个发光二极管

Page 22: 第 8 章  数字量 I/O 模块

工作原理1. 74HC273 用于驱动 8 个发光二极管。

2. CLR 接 F2407 的复位引脚,使在复位时 74HC273输出为低电平,不点亮发光二极管。

3. F2407 的 IOPCA3 、 IOPCA4 及 IOPCA5 分别接 74LVC138 的 A 、 B 及 C 输入,通过它的选通 CLK作为 74HC273 的控制信号;

4.当输出为高时, 74HC273 的输出有效即输出信号反映输入的内容;当输出为低时,输出无效即输入变化时输出不变。

5.用 IOPB 端口来控制发光二极管的亮灭:某位为高则相应的 LED 发光;某位为低则相应的 LED 熄灭。

Page 23: 第 8 章  数字量 I/O 模块

软件设计

1.先向 IOPB 端口发送需要显示的数据,再通过发送一个脉冲,循环点亮 8 个发光二极管。

2.用软件延时的方法来调节发光二极管的延时间隔。

Page 24: 第 8 章  数字量 I/O 模块

汇编语言

IOSFT_REG .usect ".data0",1 ; 要显示的数据寄存器

.include “F2407REGS.H” ; 引用头部文件 .def _c_int0

.text

1. 主程序

Page 25: 第 8 章  数字量 I/O 模块

_c_int0: ; 相当于主程序的入口CALL SYSINIT ; 调系统初始化程序LDP #DP_PF2 ; 指向 7080h ~ 7100h 区LACL MCRAAND #000FFH ;IOPB 端口配置为一般 I/O 功能SACL MCRALACL MCRAAND #0FF00H ;IOPA 配置为一般 I/O 功能SACL MCRA LACL PBDATDIROR #0FF00H ;IOPB 端口设置为输出方式SACL PBDATDIR LACL PADATDIROR #0FF00H SACL PADATDIR ;IOPA 设置为输出方式LDP #5H ; 指向 0280h ~ 0300h 区SPLK #80H,IOSFT_REG ; 给显示的数据赋初值

Page 26: 第 8 章  数字量 I/O 模块

LOOP: LDP #DP_PF2LACL PADATDIRAND #0FFC7H ;138 select ch0,ledclk==1 SACL PADATDIR ; 开 74HC273 片选信号LDP #5HLACL IOSFT_REGLDP #DP_PF2 OR #0FF00HSACL PBDATDIR ; 送要显示的数据到 IOPB 端口LACL PADATDIROR #0038H ;138 select ch7,ledclk=0SACL PADATDIR ; 关 74HC273 片选信号CALL DELAY ; 调延时程序LDP #5HLACL IOSFT_REGBIT IOSFT_REG,BIT0; 是否循环完一次(已点亮第 8 个发光二极管)ROR ; 左移一位SACL IOSFT_REGBCND LOOP1,TCB WAIT

LOOP1: LDP #5HSPLK #80H,IOSFT_REG; 如循环完一次则显示数据赋初值

WAIT: NOPB LOOP

Page 27: 第 8 章  数字量 I/O 模块

系统初始化程序 SYSINIT:

SETC INTM CLRC SXM CLRC OVM

CLRC CNF ;B0 被配置为数据存储空间 LDP #0E0H

SPLK #81FEH,SCSR1 ;CLKIN=6 M,CLKOUT=24 M SPLK #0E8H,WDCR ; 不使能 WDT

LDP #0SPLK #0000H,IMR ; 不使能SPLK #0FFFFH,IFR ; 清全部中断标志RET

Page 28: 第 8 章  数字量 I/O 模块

软件延时程序

DELAY:MAR *,AR4LAR AR4,#0FFFEHLAR AR0,#00H

DELAY1: SBRK #1NOPCMPR 00BCND DELAY1,NTC

RET

Page 29: 第 8 章  数字量 I/O 模块

C 语言说明:

( 1 )程序中所有与 DSP 硬件有关的寄存器都用指针方式寻址。( 2 ) SXM 、 OVM 、 CNF 和 INTM 等的位操作嵌入汇编语句。( 3 )寄存器 PBDATDIR :

高 8 位是 IOPB 端口数据流动方向的设置,设置完成后一般不再改变;

低 8 位是数据内容,改变其内容,则可实现 LED 的循环显示。( 4 )移位的实现:其程序中设置了一个寄存器 led ,其高 8 位为 0 ,低 8 位存储需要显示的数据。用 C 语言指令 led=led>>1 实现数据右移一位。( 5 )每次须改变 LED 的显示内容时,用指令 PBDATDIR=PBDATDIR&0x0FF00 屏蔽掉其数据位,再用指令 PBDATDIR=PBDATDIR|led 把需要显示的数据赋给 IOPB 端口即可。

Page 30: 第 8 章  数字量 I/O 模块

#include "register.h" main( ) // 初始化子程序{ int led; int i,k; asm(" setc SXM"); // 抑制符号位扩展 asm(" clrc OVM"); // 累加器中结果正常溢出 asm(" clrc CNF"); // B0 被配置为数据存储空间 asm(" setc INTM");// 禁止所有中断 *SCSR1=0x81FE; // CLKIN=10M , CLKOUT=4*CLKIN=40M *WDCR=0x0E8; // 不使能看门狗,因为 SCSR2 中的 WDOVERRIDE

// 可以用软件禁止看门狗 *IMR=0x0000; // 禁止所有中断 * IFR=0x0FFFF; // 清除全部中断标志, " 写 1 清 0" *MCRA=*MCRA&0x00c7; // IOPA3,IOPA4,IOPA5,IOPB 端口配置为一般的 I/O 功,

// F240x 的端口均为 8 位, MCRA 为 16 位//因此控制了 IOPA 和 IOPB 的设置

* PBDATDIR=0x0FF00; // IOPB 端口设置为输出方式 , 熄灭全部的 LED *PADATDIR=*PADATDIR&0x0FF00; *PADATDIR=*PADATDIR|0x0FF38;// IOPA3,IOPA4,IOPA5 设置为输出方式,

//且 LEDCLK=1

Page 31: 第 8 章  数字量 I/O 模块

while(1){for(led=0x0080,i=0;i<8;led=led>>1,i++) { *PBDATDIR=*PBDATDIR&0x0FF00; //首先屏蔽 B 端口的各

位 *PBDATDIR=*PBDATDIR|led; // 把需要显示的值给 IOPB 端口 *PADATDIR=*PADATDIR&0x0FF00;

*PADATDIR=*PADATDIR|0x0FF38; // LEDCLK=1 for(k=0;k<0x0fffe;k++)

k=k; }

}}

void interrupt nothing( ) { return;}

直接返回中断服务程序

Page 32: 第 8 章  数字量 I/O 模块

8.3.2 键盘与发光二极管配合使用程序

硬件说明:

1.有 8 个键和 8 个发光二极管,键盘的值先用 IOPB端口直接读取,即相应的 I/O 用作输入方式;

2.把 IOPB 端口作为输出方式去点亮 8 个发光二极管。3.键盘 K1- K8 分别对应于 I/O 端口 IOPB0- IOP

B7 。4.按下 8 个键盘中的某个按键则相应的第几个发光二

极管点亮。

Page 33: 第 8 章  数字量 I/O 模块

软件说明1.用查询的方式来读取键值;

2.当 S1键按下时,点亮发光二极管 LED0 ;

3. S1键对应的输入 I/O 引脚为 IOPB0 ,在 IOPB0作为一般 I/O 输入的情况下,如 S1键按下则端口 B 数据和方向控制寄存器( PBDATDIR )的第 0 位为 0 ;

4.经过延时消抖动后如 PFDATDIR.0仍为 0 则表示S1键按下;

5.程序中如 S1键按下,就点亮发光二极管 LED0 。

Page 34: 第 8 章  数字量 I/O 模块

1 .汇编程序

KEYXS .usect ".data0",1 ;LED 显示的数据KEYDATA .usect ".data0",1 ;前次 LED显示的数据DP_USER .set 5

.include "F2407REGS.H" ; 引用头部文件 .def _c_int0

Page 35: 第 8 章  数字量 I/O 模块

( 2 )主程序 .text

_c_int0 CALL SYSINIT; 调系统初始化程序LDP #DP_USER; 指向 0280h ~ 0300h

区SPLK #0000H,KEYXS ; 给要显示的数据

赋初值 B LED ; 使 LED 全部熄灭LOOP: CALL KEY ; 调键盘程序 , 即扫描键盘LED: LDP #DP_PF2; 选数据页

LACL PADATDIR ; 将 PADATDIR装载到 ACC 的低 16 位

OR #00038H ;LEDCLK=0SACL PADATDIR ; 开 74HC273 片选信

号LDP #DP_USERLACL KEYXSOR #0FF00H;IOPB 端口为输出方式

Page 36: 第 8 章  数字量 I/O 模块

LDP #DP_PF2SACL PBDATDIR; 送要显示的数据

到 IOPB 端口LACL PADATDIROR #0ff10H;LEDCLK=1AND #0ff10HSACL PADATDIR; 关 74HC273 片

选信号CALL KEYDELAY

WAIT: RPT #7 ; 延时 NOP

B LOOP ;跳转 , 循环查键

Page 37: 第 8 章  数字量 I/O 模块

( 3 )系统初始化程序SYSINIT:

SETC INTM CLRC SXM SETC OVM

CLRC CNF ;B0 被配置为数据存储空间 LDP #0E0H

SPLK #81FEH,SCSR1 ;CLKIN=6 MHz,CLKOUT=24 MHz SPLK #0E8H,WDCR; 不使能看门狗 WDT

LDP #0SPLK #0000H,IMR; 不使能中断SPLK #0FFFFH,IFR; 清全部中断标志RET

Page 38: 第 8 章  数字量 I/O 模块

( 4 )键盘初始化程序 KEYINIT:

LDP #DP_PF2LACL MCRAAND #000c7H ;IOPA3,IOPA4,IOPA

5,IOPB 端口配置为一般的 I/O 功能SACL MCRALACL PBDATDIRAND #0000H;IOPB 端口设置为输入方式SACL PBDATDIRLACL PADATDIROR #0FF10H;IOPA3,IOPA4,IOPA5 设

置为输出方式 ,且 KEYC=1AND #0FF10HSACL PADATDIRRET

Page 39: 第 8 章  数字量 I/O 模块

( 5 )键盘程序 KEY:

CALL READKEY ; 调读键程序LACL KEYXSBCND KEY,EQ ;没有键按下跳转到

KEY, 循环查键CALL KEYDELAY ; 延时消抖动CALL READKEY ; 再一次读键值LACL KEYXSBCND KEY,EQ ;没有键按下跳转到

KEY, 循环查键 B LED ; 有键按下 ,跳转到 LED,进行显示

Page 40: 第 8 章  数字量 I/O 模块

( 6 )读键子程序 READKEY:

CALL KEYINIT ; 调键盘初始化程序

LDP #DP_PF2 LACL PBDATDIR ;取出键值 P

BDATDIR.0 ~ PBDATDIR.3 OR #0FF00H ; 屏蔽高 8

位 CMPL ;取反 LDP #DP_USER SACL KEYXS ; 存放键值 RET ;返回

Page 41: 第 8 章  数字量 I/O 模块

( 7 )用软件延时 30mS消抖动

KEYDELAY: LACC #6000

KEYD1: SUB #1 RPT #80 NOP BCND KEYD1,NEQ RET

Page 42: 第 8 章  数字量 I/O 模块

( 10 )假中断程序

PHANTOM KICK_DOG ; 复位看门狗RETEND

Page 43: 第 8 章  数字量 I/O 模块

2 . C 语言程序 #include "register.h" int j,k;main() // 初始化子程序{ asm(" setc SXM"); // 抑制符号位扩展

asm(" clrc OVM");// 累加器中结果正常溢出asm(" clrc CNF"); // B0 被配置为数据存储空间asm(“ setc INTM”); // 禁止所有中断SCSR1=0x81FE; // CLKIN=10MHz , CL

KOUT=4xCLKIN=40MHzWDCR=0x0E8; // 不使能看门狗,可以用软件禁

止看门狗

Page 44: 第 8 章  数字量 I/O 模块

IMR=0x0000; // 禁止所有中断IFR=0x0FFFF; // 清除全部中断标志, " 写 1 清 0"MCRA=MCRA&0x00c7; // OPA3,IOPA4,IOPA5,IOPB 端口配置为一般的 I/O功能, F240x 的端口均为 8 位, MCRA 为 16 位因此控制了 IOPA 和 IOPB 的设置PBDATDIR=0x0FF00; // IOPB 端口设置为输出方式 PADATDIR=PADATDIR|0x0FF38;PADATDIR=PADATDIR&0x0FF00; //IOPA3,IOPA4,IOPA5 设置为输出方式,且 LEDCLK=1PADATDIR=PADATDIR|0x0FF10; // IOPA3,IOPA4,IOPA5 设置为输出方式,选通 KEYC

Page 45: 第 8 章  数字量 I/O 模块

while(1) { PBDATDIR=PBDATDIR&0x00ff; k=PBDATDIR&0x00FF; if(k==0x00FF) k=0; else k=1; if(k==1) { for(j=0;j<3000;j++) ; k=PBDATDIR&0x00FF; if(k==0x00FF) k=0; else k=1; }

Page 46: 第 8 章  数字量 I/O 模块

if(k==1) { k=PBDATDIR&0x00FF; switch(k) { case 0x00FE:PBDATDIR=(PBDATDIR&0x0FF00)|0x0FF01; break; //按下 S1 点亮 LED0 case 0x00FD:PBDATDIR=(PBDATDIR&0x0FF00)|0x0FF02; break; //按下 S2 点亮 LED1 case 0x00FB:PBDATDIR=(PBDATDIR&0x0FF00)|0x0FF04; break; //按下 S3 点亮 LED2 case 0x00F7:PBDATDIR=(PBDATDIR&0x0FF00)|0x0FF08; break; //按下 S4 点亮 LED3

case 0x00EF:PBDATDIR=(PBDATDIR&0x0FF00)|0x0FF10; break; //按下 S5 点亮 LED4 case 0x00DF:PBDATDIR=(PBDATDIR&0x0FF00)|0x0FF20; break; //按下 S6 点亮 LED5 case 0x00BF:PBDATDIR=(PBDATDIR&0x0FF00)|0x0FF40; break; //按下 S7 点亮 LED6 case 0x007F:PBDATDIR=(PBDATDIR&0x0FF00)|0x0FF80; break; //按下 S8 点亮 LED7

Page 47: 第 8 章  数字量 I/O 模块

default: PBDATDIR=PBDATDIR; } PADATDIR=PADATDIR|0x0FF38; PADATDIR=PADATDIR&0x0FF00; //IOPA3,IOPA4,IOPA5 设置为输出方式且 LEDCLK=1 PADATDIR=PADATDIR|0x0FF10; }

} }

Page 48: 第 8 章  数字量 I/O 模块

// 直接返回中断服务程序void interrupt nothing( ) { return;}

Page 49: 第 8 章  数字量 I/O 模块

8.3.3 光电隔离的 8路开关量输入与 8路开关量输出电路

1.用 DSP 的 I/O 端口 IOPB0~7 与 74LVC245构成 8路开关量输入通道;

2. DSP 的 I/O 端口 IOPB0~7 与 74HC273锁存器构成8路开关量输出通道;

3. DSP 的 I/O 端口 IOPA3~5 作为 74LVC138 的输入信号;

4.该信号经 138译码后输出一个信号来使能 74LVC245从而控制 I/O 端口 IOPB0~7 输入 8路开关量信号;

5.或者经 138译码后输出一个信号来控制 74HC273锁存器从而使 I/O 端口 IOPB0~7 输出 8路开关量信号锁存到 74HC273 的寄存器中。

Page 50: 第 8 章  数字量 I/O 模块

说明

调试时,可以适当地选择连接光电耦合二极管串联的电阻值,使光电耦合器件可靠导通,实现不同电压等级下的电平匹配与电气隔离,从而模拟实际控制过程中的光电隔离型开关量输入。

光电耦合器件的 VIN 接 5V 电平;

IN0~7 为 8路开关量输入;

OUT0~7 为 8路开关量输出;

开关量输入为低电平时,输出也为低电平信号。

Page 51: 第 8 章  数字量 I/O 模块

F2407 与光电隔离的 8路开关量输入输出接口电路

1 2 3 4 5 6 7 8 9

RP2

3K

VCCA1

B2

C3

OE2A4

OE2B5

OE16

Y7 7GND8 Y6 9Y510Y4 11Y3 12

Y2 13Y1 14Y015

VCC 16U25

74LVC138

VCC

GNDVCC

R852K

R862K

R872K

R882K

VIN

IN0

IN1

IN2

IN3

R892K

R902K

R912K

R922K

VIN

IN4

IN5

IN6

IN7

GND

GND

VIN1

L1IN2

VIN3

L2IN4

VIN5

L3IN6

VIN7

L4IN8

VOUT 16

L1OUT 15

VOUT14

L2OUT 13

VOUT 12

L3OUT 11

VOUT 10

L4OUT9

U31 TLP521-4

VIN1

L1IN2

VIN3

L2IN4

VIN5

L3IN6

VIN7

L4IN8

VOUT16

L1OUT 15

VOUT 14

L2OUT 13

VOUT 12

L3OUT11

VOUT 10

L4OUT 9

U32 TLP521-4

A02

A13

A24

A35

A46

A57

A68

A79

B0 18

B1 17

B216

B3 15

B4 14

B5 13

B6 12

B711

E19

DIR1

U3074LVC245

R84

10K

VCC

DSPIN0DSPIN1DSPIN2DSPIN3DSPIN4DSPIN5DSPIN6DSPIN7

IOPB0IOPB1IOPB2IOPB3IOPB4IOPB5IOPB6IOPB7

VCC8路开关量输入IOINEN

8路开关量锁存输出

IOOUTCLKRESET

R101

4.7K

GND

CLR1

CLK11

1D3 1Q 2

2D4 2Q 5

3D7 3Q 6

4D8 4Q 9

5D13

5Q12

6D14 6Q 15

7D17 7Q 16

8D18

8Q19

VCC 20

GND 10

U3574HC273

VCCGND

IOPB0IOPB1IOPB2IOPB3IOPB4IOPB5IOPB6IOPB7

VIN1

L1IN2

VIN3

L2IN4

VIN5

L3IN6

VIN7

L4IN8

VOUT16

L1OUT 15

VOUT 14

L2OUT 13

VOUT 12

L3OUT11

VOUT 10

L4OUT 9

U33 TLP521-4

VIN1

L1IN2

VIN3

L2IN4

VIN5

L3IN6

VIN7

L4IN8

VOUT 16

L1OUT 15

VOUT 14

L2OUT13

VOUT 12

L3OUT 11

VOUT10

L4OUT 9

U34 TLP521-4

GNDIN1

GNDIN1

OUT0

OUT1

OUT2

OUT3

OUT4

OUT5

OUT6

OUT7

VCC

VCC

R96300

R95300

R94300

R93300

R100300

R99300

R98300

R97300

2407O0

2407O1

2407O2

2407O3

2407O4

2407O5

2407O6

2407O7

VIN

R1105.1k

R1115.1k

R1125.1k

R1135.1k

R1145.1k

R1155.1k

R1165.1k

R1175.1k

开关量输出

IOPA3IOPA4IOPA5

IOINENIOOUTCLK

开关量输入

DSPIN0

DSPIN1

DSPIN2

DSPIN3

DSPIN4

DSPIN5

DSPIN6

DSPIN7

TMS320LF2407A

IOPA3IOPA4IOPA5

Page 52: 第 8 章  数字量 I/O 模块

C 语言源程序 #include "register.h" int j,k;main() { asm(" setc SXM"); // 抑制符号位扩展

asm(" clrc OVM"); // 累加器中结果正常溢出asm(" clrc CNF"); // B0 被配置为数据存储空间asm(" setc INTM"); // 禁止所有中断SCSR1=0x81FE; // CLKIN=10MHz , CLKOUT=4xCLKIN=40MHzWDCR=0x0E8; // 不使能看门狗,可以用软件禁止看门狗IMR=0x0000; // 禁止所有中断IFR=0x0FFFF; // 清除全部中断标志, " 写 1 清 0"MCRA=MCRA&0x00c7; // IOPA3,IOPA4,IOPA5,IOPB 端口配置为

一般的 I/O 功能, F240x 的端口均为 8 位, MCRA 为 16 位因此控制了 IOPA 和 IOPB 的设置 PBDATDIR=0x00ff; // IOPB 端口设置为输入方式

PADATDIR=(PADATDIR&0x0FF00)|0x0FF28; //IOPA3,IOPA4,IOPA5 设置为输出方式,且 IOINEN=1, 选通 8路开关量输入

Page 53: 第 8 章  数字量 I/O 模块

while(1) { PBDATDIR=PBDATDIR&0x00ff; k=PBDATDIR&0x00FF; if(k==0x00FF) k=0; else k=1; if(k==1) { for(j=0;j<3000;j++) ; k=PBDATDIR&0x00FF; if(k==0x00FF) k=0; else k=1; } if(k==1) { PADATDIR=(PADATDIR&0x0FF00)|0x0FF30; PADATDIR=PADATDIR&0x0FF00; //IOPA3,IOPA4,IOPA5 设置为输出方式,且 IOOUTCLK=1, 选通 8路开关量输出 PADATDIR=PADATDIR|0x0FF28; //IOPA3,IOPA4,IOPA5 设置为输出方式,且 IOINEN=1, 选通 8路开关量输入 }

} }

Page 54: 第 8 章  数字量 I/O 模块

// 中断服务程序直接返回void interrupt nothing( ) { return;}