嵌入式系统讲义第 4章 S3C2410X系统结构周国运
2007.3
第三章习题解答
1,ARM指令中的第二操作数,operand2‖有哪些具体形式?
解:有三种:寄存器、寄存器移位,8位位图立即数。
2,对于 ARM的变址寻址方式,有基地址和偏移地址两部分组成。( 1)基地址可以是哪些寄存器?( 2)偏移地址可以有哪些形式?( 3)总地址的计算方法有哪些?怎么表示?
( 4)变址寻址应用于哪些指令?
解:( 1)基地址可以是通用寄存器 R0---R15中的任意一个。
( 2)偏移地址可以有三种形式,12位立即数、寄存器、
寄存器移位。
( 3)总地址的计算方法。有三种:前索引偏移、后索引偏移、程序相对偏移。 即偏移地址的计算方法
– 前索引偏移:即先使用偏移,后传送数据。不定修改基地址。
如,LDR Rd,[Rn,#m]; STR Rd,[Rn,#m]!(修改基地址 )
– 后索引偏移:即先传送数据,后先使用偏移,修改基地址。
如,LDR Rd,[Rn],#m
– 相对偏移:寻址地址在 PC中,以当前指令为基地址,± 4KB内。
如,LDR Rd,lable ; lable为程序标号
( 4) 有 4条指令,LDR,STR,LDM,STM
3,存储器从 0x400000开始的 100个单元中存放着 ASCII码,
编写程序,将其所有的小写字母转换成大写字母,对其它的 ASCII码不做变换。
解:
MOV R0,#0x400000
MOV R1,#0
LP
LDRB R2,[R0,R1]
CMP R2,#0x61
BLO NEXT
CMP R2,#0x7B ;0x61---0x7A为小写字母的 ASC
SUBLO R2,R2,#0x20
STRBLO R2,[R0,R1]
NEXT
ADD R1,R1,#1
CMP R1,#100
BNE LP
4,编写程序,比较存储器中 0x400000和 0x400004
两无符号字数据的大小,并且将比较结果存于
0x400008的字中,若两数相等其结果记为 0,若前者大于后者其结果记为 1,若前者小于后者其结果记为 -1。
解:
MOV R0,#0x400000
LDR R1,[R0] ;取第 1个数
LDR R2,[R0,#4] ;取第 2个数
CMP R1,R2 ;两个数相比较
MOVHI R1,#1 ; R1大
MOVLO R1,# -1 ; R1小
MOVEQ R1,#0 ;两个数相等
STR R1,[R0,#8]
7,编写一程序,存储器中从 0x400200开始有一个 64位数。
( 1)将取反,再存回原处;( 2)求其补码,存放到
0x400208处 。
解:
LDR R0,=0x400200
LDR R2,=0xFFFFFFFF
LDR R1,[R0] ;取低 32位数
EOR R1,R1,R2 ;取反
STR R1,[R0] ;存低 32位反码
ADDS R1,R1,#1 ;又加 1为求补
STR R1,[R0,#8] ;存低 32位补码
LDR R1,[R0,#4] ;取高 32位数
EOR R1,R1,R2 ;取反
STR R1,[R0,#4] ;存高 32位反码
ADC R1,R1,#0 ;高 32位求补
STR R1,[R0,#12] ;存高 32位补码
8,编写一简单 ARM汇编程序段,实现 1+2+…+100
的运算。
解:
MOV R2,#100
MOV R1,#0
LOOP
ADD R1,R1,R2 ; R1中为累加和
SUBS R2,R2,#1 ; R2控制循环
BNE LOOP
习 题本章作业,2,3,5,7,10,12,15
1,S3C2410X主要特性有哪些?
2,S3C2410X的结构分为几个部分?每一部分主要由哪些部件构成?
3,S3C2410X的存储器由哪几部分构成,每一部分有什么特点? 存储器主要有哪些控制寄存器?
4,S3C2410X的 Flash有哪些特点?
5,S3C2410X的 DMA有哪些特点?其工作过程是怎样的?每个通道配置有哪些寄存器?
6,S3C2410X的 A/D转换器有哪些特点?有哪些相关的寄存器?
7、编写一程序,用查询的方式,对 S3C2410X的 A/D转换器的第 0通道连续进行 100次 A/D转换,然后将其结果求平均值。
注意,A/D转换器有独立的模拟信号输入引脚 AIN0---AIN9。
8,S3C2410X的中断系统有哪些特点?相关的寄存器有哪些?
9,S3C2410X的中断控制器的工作过程是怎样的?对于 IRQ,整个中断过程是怎样的(中断控制器处理,向 CPU请求,转到中断入口,转去获得中断服务程序的首地址,执行中断服务程序)?
10、编写一程序,使用外部中断 EINT0,用中断方式对端口 C做数据输入。(注意对中断系统和相关引脚进行初始化)
提示,C语言指向特定地址的方法:
( 1) #define rGPCDAT (*(volatile unsigned *)0x56000024)
( 2) int *rGPCDAT=0x56000024;
( 3) int *rGPCDAT;
rGPCDAT=0x56000024;
用第一种方法为好。
11,S3C2410X的定时器系统有哪些特点?由哪几部分构成?相关的寄存器有哪些?是如何工作的?
12、编写一程序,使用 timer0产生并输出频率为
10KHz、占空比为 1/2的方波。设 f pclk=50MHz。
(注意对 timer0和相关引脚初始化)
13、编写一程序,利用 S3C2410X的 PWM功能对一直流电机进行调速,要求使用 timer1产生并输出频率为 10KHz、占空比可变的方波进行控制,电机的转速变化如下图所示。设 f pclk=50MHz。(注意对 timer0和相关引脚初始化)
t0 2*t0 t
v
0
14,S3C2410X的串行接口 UART有哪些特点?由哪几部分构成?
相关的寄存器有哪些?
是如何工作的?
15、编写一程序,使用 S3C2410X的 UART2进行串行数据收发,
要求用脉冲请求中断的方式、使用收 /发 FIFO,8个数据位、
1个停止位、不校验,波特率为 125kb/s。设 Pclk为 50MHz。
(提示:主程序对 UART2初始化、引脚配置、中断初始化等,并进行一次发送;中断服务程序进行收发,并且清除中断请求标志和中断服务标志)
16,S3C2410X的 SPI接口有哪些特点?由哪几部分构成?相关的寄存器有哪些?是如何工作的?
17、编写一程序,使用 S3C2410X的 UART2进行串行数据收发,
要求用脉冲请求中断的方式、使用收 /发 FIFO,8个数据位、
1个停止位、不校验,波特率为 125kb/s。设 Pclk为 50MHz。
(提示:主程序对 UART2初始化、引脚配置、中断初始化等,并进行一次发送;中断服务程序进行收发,并且清除中断请求标志和中断服务标志)
18,把 S3C2410的 SPI0设为主设备,同时把 SPI1设为从设备,
将二者的 MOSI,MISO交叉相连,二者的 SCL对连,用
GPG0引脚控制 nSS1。编写程序,SPI0用中断方式,SPI1
用查询方式,采用格式 B,1Mb/s的波特率,SPI0发送数据、
SPI1接收数据,发送、接收 100个字节的数据。设系统
Pclk=50MHz。
第 4章 S3C2410X系统结构
4.1 S3C2410X概述
4.2 存储器配置
4.3 DMA
4.4 ADC和触摸屏接口
4.5 中断控制器
4.6 I/O端口
4.7 PWM
4.8 UART接口
4.9 SPI接口
4.10 IIC接口
4.11 RTC
4.12时钟和电源管理
4.13看门狗
4.14 其它接口主要内容
4.14 其它接口
1,USB接口
2,LCD控制器
3,SD接口
4,IIS接口
4.1 S3C2410X概述主要内容
主要特性
系统结构
引脚信号
4.1 S3C2410X概述
S3C2410X是韩国三星公司推出的 16/32位 RISC
微控制器,其 CPU采用的是 ARM920T内核,加上丰富的片内外设,为手持设备和其它应用,提供了低价格、低功耗、高性能微控制器的解决方案。
一、主要特性
具有 16KB指令 Cache,16KB数据 Cache和存储器管理单元 MMU。
外部存储器控制器,可扩展 8组,每组 128MB,总容量达 1GB;支持从 Nand flash存储器启动。
55个中断源,可以设定 1个为快速中断,有 24个外部中断,并且触发方式可以设定。
4通道的 DMA,并且有外部请求引脚。
3个通道的 UART,带有 16字节的 TX/RX FIFO,支持 IrDA1.0功能。
具有 2通道的 SPI,1个通道的 IIC串行总线接口和 1
个通道的 IIS音频总线接口。
有 2个 USB主机总线的端口,1个 USB设备总线的端口。
有 4个具有 PWM功能的 16位定时器和 1个 16位内部定时器。
8通道的 10位 A/D转换器,最高速率可达 500kB/s;
提供有触摸屏接口。
具有 117个通用 I/O口和 24通道的外部中断源。
兼容 MMC的 SD卡接口。
具有电源管理功能,可以使系统以普通方式、慢速方式、空闲方式和掉电方式工作。
看门狗定时器。
具有日历功能的 RTC。
有 LCD控制器,支持 4K色的 STN和 256K色的 TFT,
配置有 DMA通道。
具有 PLL功能的时钟发生器,时钟频率高达
203MHz。
双电源系统,1.8/2.0V内核供电,3.3V存储器和 I/O
供电。
二、系统结构主要由两大部分构成:
ARM920T内核片内外设。
1,ARM920T内核由三部分,ARM9内核 ARM9TDMI,32KB的
Cache,MMU。
2、片内外设分为高速外设和低速外设,分别用 AHB总线和 APB总线。
三、引脚信号
S3C微控制器是
272-FBGA封装。
其信号可以分成
addr0---addr26、
Data0---data31、
GPA0---GPA22
GPB10,GPC15、
GPD15,GPE15、
GPF7,GPG15、
GPH10,EINT23、
nGCS0—nGCS7、
AIN7,IIC,SPI、
OM0---OM3
等,大部分都是复用的
4.2 S3C2410X的存储器主要内容
存储器配置
– 存储器概述
– 控制寄存器
Flash及控制器
– Flash控制器概述
– 控制器主要特性
– 控制器的寄存器
– 控制器的工作原理
4.2 存储器配置
4.2.1 S3C2410X的存储器配置一、概 述
S3C2410X的存储器管理器 提供访问外部存储器的所有控制信号,26位地址信号,32位数据信号,8个片选信号、
以及读 /写控制信号等。
S3C2410X的存储空间分成 8组,最大容量是 1GB,
bank0---bank5为固定 128MB,bank6和 bank7的容量可编程改变,可以是 2,4,8,16,32,64,128MB,并且
bank7的开始地址与 bank6的结束地址相连接,但是二者的容量必须相等。
bank0可以作为引导 ROM,其数据线宽只能是 16位和
32位,复位时由 OM0,OM1引脚确定;其它存储器的数据线宽可以是 8位,16位和 32位。
S3C2410X的存储器格式,可以编程设置为大端格式,
也可以设置为小端格式。
注意:补充引脚信号二、存储器的控制寄存器内存控制器为访问外部存储空间提供存储器控制信号,
S3C2410X存储器控制器共有 13个寄存器。
寄存器 地 址 功 能 操作 复位值
BWSCON 0x48000000 总线宽度和等待控制 读 /写 0x0
BANKCON0 0x48000004 BANK0控制 读 /写 0x0700
BANKCON1 0x48000008 BANK1控制 读 /写 0x0700
BANKCON2 0x4800000C BANK2控制 读 /写 0x0700
BANKCON3 0x48000010 BANK3控制 读 /写 0x0700
BANKCON4 0x48000014 BANK4控制 读 /写 0x0700
BANKCON5 0x48000018 BANK5控制 读 /写 0x0700
BANKCON6 0x4800001C BANK6控制 读 /写 0x18008
BANKCON7 0x48000020 BANK7控制 读 /写 0x18008
REFRESH 0x48000024 SDRAM刷新控制 读 /写 0xAC0000
BANKSIZE 0x48000028 可变的组大小设置 读 /写 0x0
MRSRB6 0x4800002C BANK6模式设置 读 /写 xxx
MRSRB7 0x48000030 BANK7模式设置 读 /写 xxx
第 9次到 此此
1,总线宽度和等待控制寄存器
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
ST7 WS7 DW7 ST6 WS6 DW6 ST5 WS5 DW5 ST4 WS4 DW4
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ST3 WS3 DW3 ST2 WS2 DW2 ST1 WS1 DW1 X DW0 X
STn:控制存储器组 n的 UB/LB引脚输出信号 。
1:使 UB/LB与 nBE[3,0]相连;
0:使 UB/LB与 nWBE[3,0]相连
WSn:使用 /禁用存储器组 n的 WAIT状态
1:使能 WAIT; 0:禁止 WAIT
DWn:控制存储器组 n的数据线宽
00,8位; 01,16位; 10,32位; 11:保留
Tacs:设置 nGCSn有效前地址的建立时间
00,0个 ; 01,1个; 10,2个; 11,4个时钟周期
Tcos:设置 nOE有效前片选信号的建立时间
00,0个 ; 01,1个; 10,2个; 11,4个时钟周期
Tacc:访问周期
000,1个; 001,2个; 010,3个; 011,4个时钟
100,6个,101,8个; 110,10个; 111,14个
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Tacs Tcos Tacc Tcoh Tcah Tacp PMC
2,BANKn---存储器组控制寄存器 ( n=0--5)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
Tcoh,nOE无效后片选信号的保持时间
00,0个 ; 01,1个; 10,2个; 11,4个时钟
Tcah,nGCSn无效后地址信号的保持时间
00,0个 ; 01,1个; 10,2个; 11,4个时钟
Tacp:页模式的访问周期
00,2个 ; 01,3个; 10,4个; 11,6个时钟
PMC:页模式的配置,每次读写的数据数
00,1个 ; 01,4个; 10,8个; 11,16个注,00为通常模式。
注:紫色为实验箱上的配置,其值为 0x0700
MT,设置存储器类型
00,ROM或者 SRAM,[3,0]为 Tacp和 PMC;
11,SDRAM,[3,0]为 Trcd和 SCAN; 01,10:保留
Trcd:由行地址信号切换到列地址信号的延时时钟数
00,2个时钟; 01,3个时钟; 10,4个时钟
SCAN:列地址位数
00,8位; 01,9位; 10,10位
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Tacs Tcos Tacc Tcoh Tcah Tacp/Trcd PMC/SCAN
3,BANK6/7---存储器组 6/7控制寄存器
31 …… 17 16 15
保留 MT
REFEN:刷新控制 。 1,使能刷新; 0:禁止刷新
TREFMD:刷新方式 。 1:自刷新 0,自动刷新
Trp:设置 SDRAM行刷新时间 (时钟数)
00,2个时钟; 01,3个; 10,3个; 11,4个时钟
Tsrc:设置 SDRAM行操作时间 (时钟数)
00,4个时钟; 01,5个; 10,6个; 11,7个时钟注,SDRAM的行周期 = Trp + Tsrc。
Refresh_count:刷新计数值
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
保 留 Refresh_count
4,REFRESH---刷新控制寄存器
31 …… 24 23 22 21 20 19 18 17 16
保 留 REFEN TREFMD Trp Tsrc 保留
Refresh_count:刷新计数器值计算公式:
刷新周期 =( 211- Refresh_count+1) /HCLK
例子:设刷新周期 =15.6μs,HCLK=60MHz
则 刷新计数器值 =211+1-60× 15.6=1113
1113=0x459=0b10001011001
高 24位未用。
BURST_EN,ARM突发操作控制
0:禁止突发操作; 1:可突发操作
SCKE_EN,SCKE使能控制 SDRAM省电模式
0:关闭省电模式; 1:使能省电模式
SCLK_EN,SCLK省电控制,使其只在 SDRAM访问周期内使能 SCLK
0,SCLK一直有效; 1,SCLK只在访问期间有效
BK76MAP:控制 BANK6/7的大小及映射
7 6 5 4 3 2 1 0
BURST_EN X SCKE_ENSCLK_EN X BK76MAP
5,BANKSIZE---BANK6/7组大小控制寄存器
BK76MAP:控制 BANK6/7的大小及映射
100,2MB; 101,4MB;
110,8MB 111,16MB;
000,32MB; 001,64MB
010,128MB
WBL:突发写的长度 。 0:固定长度; 1:保留
TM:测试模式 。 00:模式寄存器集;其它保留
CL:列地址反应时间
000,1个时钟; 010,2个时钟;
011,3个时钟;其它保留
BT:猝发类型
0:连续; 1:保留
BL:猝发时间 000,1个时钟;其它保留
6,MRSRB6/7---BANK6/7模式设置寄存器
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
WBL TM CL BT BL
4.2.2 Nand Flash及其控制器主要内容
1,Nand Flash控制器概述
2、控制器主要特性
3、控制器的寄存器
4、控制器的工作原理
4.2.2 Nand Flash及其控制器
Nor flash存储器,读速度高,而擦、写速度低,容量小,价格高。
Nand flash存储器,读速度不如 Nor flash,而擦、写速度高,容量大,价格低。有取代磁盘的趋势。
因此,现在不少用户从 Nand flash启动和引导系统,而在 SDRAM上执 行主程序代码。
一,Nand Flash控制器概述
S3C2410X微控制器从 Nand flash的引导功能,其内部有一个叫做,起步石( Steppingstone)”的 SRAM缓冲器,
系统 启动时,Nand flash存储器的前面 4KByte字节将被自动载入到 起步石 中,然后系统自动执行这些载入的引导代码。引导代 码执行完毕后,自动跳转到 SDRAM执行。
Nand flash操作的校验功能,使用 S3C2410X内部硬件
ECC功能可以对 Nand flash的数据进行有效性的检测。
二,Nand Flash控制器主要特性
Nand Flash模式,支持读 /擦 /编程 Nand flash存储器。
自动导入模式,复位后,引导代码被送入
Steppingstone,传送后,引导代码在
Steppingstone中执行。
具有硬件 ECC(纠错码)功能,硬件产生纠错代码。
内部 4KB的 SRAM缓冲器 Steppingstone,在
Nand flash引导后可以作为其他用途使用。
Nand Flash控制器功能框图主要由 6部分组成引脚信号:
CLE:命令锁存
R/nB,就绪 /忙三,Nand Flash 控制器的寄存器寄存器 地 址 功 能 操作 复位值
NFCON 0x4E000000 Nand Flash配置 读 /写 -
NFCMD 0x4E000004 Nand Flash命令 读 /写 -
NFADDR 0x4E000008 Nand Flash地址 读 /写 -
NFDATA 0x4E00000C Nand Flash数据 读 /写 -
NFSTAT 0x4E000010 Nand Flash状态 读 /写 -
NFECC 0x4E000014 Nand Flash纠错 读 /写 -
NFEN,NF控制器使能控制
0:禁止使用; 1:允许使用
IECC:初始化 ECC编码 /解码器控制位
0:不初始化 ECC; 1:初始化 ECC
NFCE,NF片选信号 nFCE控制位持续时间设置
0,nFCE为低有效; 0,nFCE为高无效
TACLE,CLE/ALE持续时间设置值( 0---7)
持续时间= HCLK * (TACLS + 1)
CLE/ALE,命令 /地址锁存允许
15 1413 12 11 10 9 8 7 6 5 4 3 2 1 0
NFEN X IECC NFCE TACLE X TWRPH0 X PWRPH1
0 - 0 0 0 - 0 - 0
1,NFCON---Flash配置寄存器
TWRPH0:写信号 持续时间设置值 ( 0~ 7)
持续时间= HCLK * (TWRPH0+ 1)
TWRPH1:写信号无效后 CLE/ALE保 持时间设置值 ( 0~ 7)
持续时间= HCLK * (TWRPH1+ 1)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
保 留 命令字
2,NFCMD---Flash命令寄存器高 24位未用,低 8位为读入或者写出的数据
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
保 留 地址值
3,NFADDR---Flash地址寄存器
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
保 留 输入 /输出数据
4,NFDATA---Flash数据寄存器高 24位未用,低 8位为 Flash存储器地址值
RnB,Nand Flash存储器状态位
0:存储器忙; 1:存储器准备好
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
保 留 RnB
5,NFSTAT---Flash状态寄存器
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
错误校正码 #1 错误校正码 #0
6,NFECC---Flash错误校正码寄存器
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
保 留 错误校正码 #2
四,Nand Flash 控制器的工作原理
1、自动导入启动代码步骤
完成复位。
如果自动导入模式使能,Nand flash存储器的前面 4K
字节被自动拷贝到 Steppingstone 内部缓冲器中。
Steppingstone被映射到 nGCS0对应的 BANK0存储空间。
CPU在 Steppingstone的 4-KB内部缓冲器中开始执行引导代码。
注意,在自动导入模式下,不进行 ECC检测。因此,
Nand flash的前 4KB应确保不能有位错误(一 般 Nandflash
厂家都确保)。
2,Nand FLASH模式配置
通过 NFCONF寄存器配置 Nand flash;
写 Nand flash命令到 NFCMD寄存器;
写 Nand flash地址到 NFADDR寄存器;
在读写数据时,通过 NFSTAT寄存器来获得
Nand flash的状态信息。应该在读操作前或写入 之后检查 R/nB信号(准备好 /忙信号)。
在读写操作后要查询校验错误代码,对错误进行纠正。
3、系统引导和 Nand FLASH 配置
OM[1:0] = 00b,使能 Nand flash控制器自动导入模式;
OM[3,0]为芯片引脚,设置引导模式、存储器
bank0的数据宽度、时钟模式等。
OM[1:0] = 01b,10b:
bank0数据宽度为 16位,32位
OM[1:0]=11b:测试模式
Nand flash的存储页面大小 应该为 512字节。
NCON,Nand flash 寻址步骤数选择
0,3步寻址; 1,4步寻址
4,Nand Flash操作的校验问题
S3C2410A在写 /读操作时,每 512字节数据自动产生 3字节的 ECC奇偶代码 (24位 )。
24位 ECC 奇偶代码= 18位行奇偶 + 6位列奇偶
ECC产生模块执行以下步骤:
当 MCU写数据到 Nand时,ECC产生模块生成 ECC代码。
当 MCU从 Nand读数据时,ECC产生模块生成 ECC代码同时用户程序将它与先前写入时产 生的 ECC代码比较 。
4.3 DMA控制器主要内容
1、概述
2、工作原理
3、寄存器一、概 述
S3C2410X有 4 个通道的 DMA 控制器,其位于在系统总线和外设总线之间。
每个 DMA 通道都能没有约束的实现系统总线或者外设总线之间的数据传输,即每个通道都能处理下面四种情况:
( 1) 源器件和目的器件都在系统总线
( 2) 源器件在系统总线,目的器件在外设总线
( 3) 源器件在外设总线,目的器件在系统总线
( 4) 源器件和目的器件都在外设总线
DMA的主要优点是,可以不通过 CPU的中断来实现数据的传输,DMA的运行可以通过软件或者通过外围设备的中断和请求来初始化。
二,DMA工作原理
1,DMA的服务对象每个 DMA通道都有 4个 DMA请求源,通过设置,可以从中挑选一个服务。每个通道的 DMA 请求源如表 4-1所示。
通道 源 请求源 0 请求源 1 请求源 2 请求源 3 请求源 4
通道 0 nXDREQ0 UART0 SDI Timer USB设备 EP1
通道 1 nXDREQ1 UART1 IIS/SDI SPI0 USB设备 EP2
通道 2 IISSDO IISSDI SDI Timer USB设备 EP3
通道 3 UART2 SDI SPI1 Timer USB设备 EP4
表 4-1 各通道的 DMA 请求源
2,DMA的工作过程一般 DMA的工作过程如下面所示
( 1) 外设向
DMAC 发出请求
( 2) DMAC通过 HOLD 向 CPU
发出总线请求;
( 3) CPU响应释放三总线,并且发应答 HLDA
( 4) DMAC向外设发 DMA应答
( 5) DMAC发出地址、控制信号,为外设传送数据;
( 6)传送完规定的数据后,DMAC撤销 HOLD信号,CPU
也撤销 HLDA信号,并且恢复对三总线的控制。
1
2
4
5
3
2,DMA的工作过程
S3C2410X的 DMA工作过程可以分为三个状态:
状态 1:等待状态。 DMA 等待一个 DMA请求。
如果有请求到来,将转到状态 2。在这个状态下,
DMA ACK和 INT REQ为 0。
状态 2:准备状态。 DMA ACK变为 1,计数器
( CURR_TC)装入 DCON[19:0]寄存器。
注意,DMA ACK保持为 1直至它被清除。
状态 3:传输状态。 DMA控制器从源地址读入数据并将它写到目的地址,每传输一次,CURR_TC
数器(在 DSTAT中)减 1,并且可能做以下操作:
– 重复传输,在全服务模式下,将重复传输,直到计数器
CURR_TC变为 0;在单服务模式下,仅传输一次。
– 设置中断请求信号,当 CURR_TC变为 0时,DMAC发出
INT REQ信号,而且 DCON[29]即中断设定位被设为 1。
– 清除 DMA ACK信号,对单服务模式,或者全服务模式
CURR_TC变为 0。
注意,在单服务模式下,DMAC的 3个状态被执行一遍,然后停止,等待下一个 DMA REQ的到来。
如果 DMA REQ到来,则这些状态被重复操作,直到 CURR_TC减为 0 。
说明,DMA传输分为一个单元传输和 4个单元突发式传输。
3、外部 DMA请求 /响应规则
DMAC有 3种类型的外部 DMA请求 /响应规则:
( 1) single service demand,单服务请求 (对应于需求模式)
( 2) single service handshake,单服务握手 (握手模式)
( 3) whole service handshake,全服务握手 (全服务模式)
每种类型都定义了像 DMA请求和 DMA响应这些信号怎样与这些规则相联系。
demand 与 handshake模式的比较:
在一次传输结束时,DMA检查 xnxDREQ( DMA请求)信号的状态:
– 在 demand模式下:如果 DMA请求( xnxDREQ)信号仍然有效,则传输马上再次开始。否则等待。
– 在 handshake模式下:如果 DMA请求信号无效,DMA在两个时钟周期后将 DMA响应( xnxDACK)信号变得无效。否则,DMA等待直到
DMA请求信号变得无效。每请求一次传输一次。
4,DMA时序要求基本时序要求:
DMA请求信号和响应信号的 Setup时间与 delay时间在所有的模式下是相同的。
如果 DMA请求信号的 setup时间满足要求,则在两个周期内实现同步,然后 DMA响应信号变得有效。
在 DMA响应信号有效后,DMA向 CPU请求总线。如果它得到总线就执行操作。 DMA操作完成后,DMA响应信号变得无效。
三,DMA控制器的相关寄存器每个 DMA 通道有 9 个控制寄存器( 4 个通道共计 36 个寄存器),6 个用来控制 DMA 传输,其它 3 个监视 DMA 控制器的状态。
Register Address R/W Description Reset Value
DISRCn 0x4B0000x0 R/W 初始源基地址寄存器 0x00000000
DISRCCn 0x4B0000x4 R/W 初始源控制寄存器 0x00000000
DIDSTn 0x4B0000x8 R/W 初始目的基地址寄存器 0x00000000
DIDSTCn 0x4B0000xC R/W 初始目的控制寄存器 0x00000000
DCONn 0x4B0000y0 R/W DMA控制寄存器 0x00000000
DSTATn 0x4B0000y4 R 状态 /计数寄存器 0x00000000
DCSRCn 0x4B0000y8 R 当前源地址寄存器 0x00000000
DCDSTn 0x4B0000yC R 当前目的地址寄存器 0x00000000
SKTRIGn 0x4B0000z0 R/W DMA掩码 /触发寄存器 0b000
1,DISRCn---DMA源基地址寄存器原名,DMA初始源寄存器寄存器 地 址 R/W 意 义 初 值
DISRC0 0x4B000000 R/W DMA0源基地址寄存器 0x00000000
DISRC1 0x4B000040 R/W DMA1源基地址寄存器 0x00000000
DISRC2 0x4B000080 R/W DMA2源基地址寄存器 0x00000000
DISRC3 0x4B0000C0 R/W DMA3源基地址寄存器 0x00000000
31 30 …… 0
0 S_ADDR---源数据基地址(在 CURR_SRC为 0、并且 DMA ACK为 1时装载入 CURR_SRC)
第 10次到此
LOC---源所在总线选择 0,AHB; 1,APB
INC---源地址变化设置
0:源地址增加; 1:源地址不变
2,DISRCCn---DMA源控制寄存器寄存器 地 址 R/W 意 义 初 值
DISRCC0 0x4B000004 R/W DMA0初始源控制寄存器 0x00000000
DISRCC1 0x4B000044 R/W DMA1初始源控制寄存器 0x00000000
DISRCC2 0x4B000084 R/W DMA2初始源控制寄存器 0x00000000
DISRCC3 0x4B0000C4 R/W DMA3初始源控制寄存器 0x00000000
31 …… 2 1 0
保留(为 0) LOC---源总线选择 INC---源地址变化设置
3,DIDSTn---DMA目的基地址寄存器原名,DMA初始目的寄存器寄存器 地 址 R/W 意 义 初 值
DIDST0 0x4B000008 R/W DMA0目的基地址寄存器 0x00000000
DIDST1 0x4B000048 R/W DMA1目的基地址寄存器 0x00000000
DIDST2 0x4B000088 R/W DMA2目的基地址寄存器 0x00000000
DIDST3 0x4B0000C8 R/W DMA3目的基地址寄存器 0x00000000
31 30 …… 0
0 D_ADDR---目标基地址,会被载入 CURR_DST(当 CURR_DST的值为 0、并且 DMA ACK 的值为 1时)
4,DIDSTCn---DMA初始目的控制寄存器寄存器 地 址 R/W 意 义 初 值
DIDSTC0 0x4B00000C R/W DMA0初始目的控制寄存器 0x00000000
DIDSTC1 0x4B00004C R/W DMA1初始目的控制寄存器 0x00000000
DIDSTC2 0x4B00008C R/W DMA2初始目的控制寄存器 0x00000000
DIDSTC3 0x4B0000CC R/W DMA3初始目的控制寄存器 0x00000000
LOC---目的地址所在总线选择 0,AHB; 1,APB
INC---目的地址地址变化设置
0:目的地址增加; 1:目的地址不变
31 …… 2 1 0
保留(为 0) LOC---目的总线选择 INC---目的地址变化设置
5,DCONn---DMA控制 寄存器寄存器 地 址 R/W 意 义 初 值
DCON0 0x4B000010 R/W DMA 0 控制寄存器 0x00000000
DCON1 0x4B000050 R/W DMA 1 控制寄存器 0x00000000
DCON2 0x4B000090 R/W DMA 2 控制寄存器 0x00000000
DCON3 0x4B0000D0 R/W DMA 3 控制寄存器 0x00000000
31 30 29 28 27 26 25 24 23 22 21 20
DMD
_HS SYNC INT TSZ
SERV
MODE HWSRCSEL
SWHW
_SEL
RE
LOAD DSZ
19 18 17 16 15 14 13 12 11 10 9 8 8 7 6 5 4 3 2 1 0
TC---传输次数初值
DMD_HS---DMA与外设握手模式选择
0:需求模式。为单服务,但只要 DREQ信号有效便传输
1:握手模式。为单服务,要等待 DREQ信号变为无效,
DREQ再有效时才传输。
SYNC---DREQ 和 DACK信号与系统总线时钟同步选择
0,DREQ和 DACK与 PCLK(APB clock)同步。慢速外设
1,DREQ和 DACK与 HCLK(AHB clock)同步。高速外设
INT---CURR_TC的中断请求控制
0:禁止 CURR_TC产生中断请求
1:当所有的传输结束时,CURR_TC产生中断请求
TSZ---传输长度类型选择
0:执行单数据传输 1:执行四数据长的突发传输
31 30 29 28 27 26 25 24 23 22 21 20
DMD
_HS SYNC INT TSZ
SERV
MODE HWSRCSEL
SWHW
_SEL
RE
LOAD DSZ
SERVMODE---传输模式选择
0:单服务传输模式,每传输一次都要查询 DREQ
1:全服务传输模式,不查询 DREQ,但传输一次也要释放总线。
HWSRCSEL ---各 DMA通道请求源设置
31 30 29 28 27 26 25 24 23 22 21 20
DMD
_HS SYNC INT TSZ
SERV
MODE HWSRCSEL
SWHW
_SEL
RE
LOAD DSZ
HWSRCSEL 000 001 010 011 100
通道 0 nXDREQ0 UART0 SDI Timer USB设备 EP1
通道 1 nXDREQ1 UART1 IISSDI SPI0 USB设备 EP2
通道 2 IISSDO IISSDI SDI Timer USB设备 EP3
通道 3 UART2 SDI SPI1 Timer USB设备 EP4
SWHW_SEL--- DMA源选择方式 (软件或硬件) 设置
0:以软件 software方式产生 DMA请求,需要用
DMASKTRIG控制寄存器中的 SW_TRIG位设置触发。
1:由位 [26:24]提供的 DMA源触发 DMA操作
RELOAD---再装载选择
0:自动再装载,当传输次数减为 0时自动装载 DMA初值
1:不自动再装载,传输结束关闭 DMA通道。
DSZ---传输数据类型设置
00:字节; 01:半字; 10:字; 11:保留
31 30 29 28 27 26 25 24 23 22 21 20
DMD
_HS SYNC INT TSZ
SERV
MODE HWSRCSEL
SWHW
_SEL
RE
LOAD DSZ
STAT---DMA状态 00:就绪态,可进行传输;
01,DMA正在传输; 1X:保留
CURRTC---当前传输计数值每传输一次其值减 1。其初值在 DCONn中低 20位。
6,DSTATn---DMA状态 /计数 寄存器原名,DMA状态寄存器寄存器 地 址 R/W 意 义 初 值
DSTAT0 0x4B000014 R DMA0状态 /计数寄存器 0x00000000
DSTAT1 0x4B000054 R DMA1状态 /计数寄存器 0x00000000
DSTAT2 0x4B000094 R DMA2状态 /计数寄存器 0x00000000
DSTAT3 0x4B0000D4 R DMA3状态 /计数寄存器 0x00000000
21 20 19 18 17 16 15 14 13 12 11 10 9 8 8 7 6 5 4 3 2 1 0
STAT CURRTC---当前传输次数计数值
CURR_SRC---当前数据源地址注意:( 1) DMA每传输一次,其地址可能增加 (1,2,4)、
可能不变;( 2) 在 CURR_SRC为 0、且 DMA ACK为 1时,将
S_ADDR源基地址的值装入。
寄存器 地 址 R/W 意 义 初 值
DCSRC0 0x4B000018 R DMA0当前源地址寄存器 0x00000000
DCSRC1 0x4B000058 R DMA1当前源地址寄存器 0x00000000
DCSRC2 0x4B000098 R DMA2当前源地址寄存器 0x00000000
DCSRC3 0x4B0000D8 R DMA3当前源地址寄存器 0x00000000
31 30 …… 0
0 CURR_SRC---当前数据源地址
7,DCSRCn---DMA当前 源地址寄存器
CURR_DST---当前数据目的地址注意:( 1) DMA每传输一次,其地址可能增加 (1,2、
4) ; ( 2) 在 CURR_DST为 0、且 DMA ACK为 1时,
将 D_ADDR的值装入。
寄存器 地 址 R/W 意 义 初 值
DCDST0 0x4B00001C R DMA0当前目的地址寄存器 0x00000000
DCDST1 0x4B00005C R DMA1当前目的地址寄存器 0x00000000
DCDST2 0x4B00009C R DMA2当前目的地址寄存器 0x00000000
DCDST3 0x4B0000DC R DMA3当前目的地址寄存器 0x00000000
31 30 …… 0
0 CURR_DST---当前数据目的地址
8,DCDSTn---DMA当前目的地址寄存器寄存器 地 址 R/W 意 义 初 值
DMASKTRIG0 0x4B000020 R/W DMA0掩码触发寄存器 0x00000000
DMASKTRIG1 0x4B000060 R/W DMA1掩码触发寄存器 0x00000000
DMASKTRIG2 0x4B0000A0 R/W DMA2掩码触发寄存器 0x00000000
DMASKTRIG3 0x4B0000E0 R/W DMA3掩码触发寄存器 0x00000000
9,DMASKTRIGn---DMA掩码 (Mask)触发寄存器
31 …… 3 2 1 0
保留(为 0) STOP ON/OFF SW_TRIG
STOP---DMA运行停止位
1,DMA将当前数据传输完立即停止,并且 CURR_TC变为 0。
注意,如果 ON/OFF设置为 OFF,则 DMA也停止传输。
ON/OFF---DMA通道屏蔽位
0:关闭通道; 1:开放通道如果 DCONn[22]设为非自动重装,DMA则传输完成后
STOP位置 1、并且关闭通道。
注意,在 DMA运行期间,不要改变其值,并且也不要使用该位停止 DMA传输,正确的方法应该使用 STOP位。
SW_TRIG,DMA软件触发位设为 1时,实现软件触发 DMA请求。
注意,只有当 DCONn[23]设为软件触发 DMA请求时,其软件触发才有效。
对 DMA应用注意:
在 DMA运行中改变 DISRCn,DIDSTn寄存器以及改变 DCONn中 TC的值,对 DMA当前的整个传输没有影响。而其它寄存器或位值的改变,将立即影响传输。
4.4 A/D转换与触摸屏主要内容
1、概述
2、结构与工作原理
3、寄存器
4、应用举例一,S3C2410X的 A/D 转换器概述
S3C2410X中集成了一个8通道 10 位 A/D 转换器,A/D 转换器自身具有采样保持功能。并且
S3C2410X的 A/D 转换器支持触摸屏接口。
A/D转换器的主要特性:
– 分辨率,10位; 精度,± 1LSB
– 线性度误差,± 1.5---2.0LSB;
– 最大转换速率,500KSPS;
– 输入电压范围,0~3.3v;
– 系统具有采样保持功能;
– 常规转换和低能源消耗功能;
– 独立 /自动的 X/Y 坐标转换模式。
二,A/D转换器结构与工作原理下图为 S3C2410 A/D 转换器和触摸屏接口的功能块图。
1、结构主要由 6部分构成:
信号输入通道
8转 1切换开关
A/D转换器
控制逻辑
中断信号发生器
触摸屏接口
2、引脚信号(需要补充)
0:正常工作模式;
3、工作原理
( 1) A/D 转换时间计算和分辨率当 PCLK 频率为 50MHz,预分频值是 49,10 位数字量的转换时间如下:
A/D 转换频率 =50MHz /( 49+1) =1MHz
转换时间 =1/( 1MHz/5 个周期) =1/200KHz=5us
A/D 转换器最大可以工作在 2.5MHz 时钟下,所以转换速率可以达到 500KSPS。
( 2)触摸屏的结构及工作原理原理,对于电阻式触摸屏,由 3层透明薄膜构成,有一层是电阻层,还有一层是导电层,它们中间有一隔离层,
当某一点被按压时,在按压点电阻层与导电层接触,如果在电阻层的一边接电源,另一边接地,便可测量出按压点的电压,从而可算出其坐标。
实现方法:
测量 X坐标,从 XP输出电压给 X+端,从 XM输出地电位给 X-端;从 YP脚输入按压点电压。
控制信号,nYPON=1; nYMON=0
nXPON=0; nXMON=1
测 Y
测 X
测量 Y坐标,从 YP输出电压给 Y+端,从 YM输出地电位给 Y-端;从 XP脚输入按压点电压。
控制信号,nYPON=0; nYMON=1
nXPON=1; nXMON=0
测 Y
测 X
3,S3C24120X A/D转换器的工作模式有 5种:普通转换模式、分离的 X/Y坐标转换模式、连续的 X/Y坐标转换模式、等待中断模式、静态模式。第 2---4种是用于触摸屏。
( 1)普通转换模式用于一般 A/D转换,不是用于触摸屏。转换结束后,其数据在 ADCDAT0中的 XPDATA域。
( 2)分离的 X/Y坐标转换模式分两步进行 X/Y坐标转换,其转换结果分别存于
ADCDAT0中的 XPDATA域中和 ADCDAT1中的 YPDATA域中,并且均会产生 INT_ADC中断请求。
( 3)自动(连续)的 X/Y坐标转换模式
X坐标转换结束启动 Y坐标转换,其转换结果分别存于
ADCDAT0中的 XPDATA域中和 ADCDAT1中的 YPDATA域中,然后产生 INT_ADC中断请求。
( 4)等待中断转换模式在该模式下,转换器等待使用者按压触摸屏,一旦触摸屏被按压,则产生 INT_TC触摸屏中断请求。
中断后,在中断处理程序中再将转换器设置为分离的 X/Y坐标转换模式、或者连续的 X/Y坐标转换模式进行处理。
触摸屏接口信号:
XP=上拉 XM=高阻
YP=AIN[5] YM=接地
( 5)静态模式当 ADCCON中的 STDBM设为 1时,转换器进入静态模式,停止 A/D转换。其数据域的数据保持不变。
三,ADC和触摸屏专用寄存器有 5个专用寄存器
Register Address R/W Description Reset Value
ADCCON 0x58000000 R/W ADC控制寄存器 0x3FC4
ADCTSC 0x58000004 R/W 触摸屏控制寄存器 0x058
ADCDLY 0x58000008 R/W ADC起始延迟寄存器 0x00FF
ADCDAT0 0x5800000C R ADC转换数据 0寄存器 -
ADCDAT1 0x58000010 R ADC转换数据 1寄存器 -
ECFLG---转换结束标志 (只读)
0:转换操作中; 1:转换结束
PRSCEN---转换器预分频器使能
0:停止预分频器; 1:使能预分频器
PRSCVL---转换器预分频器数值 数值 N范围,1---255
注意,( 1)实际除数值为 N+1
( 2)对 N数值的要求:转换速率应该 <PCLK/5
1,ADCCON---ADC控制 寄存器
15 14 13 …… 6
ECFLG PRSCEN PRSCVL
5 4 3 2 1 0
SEL_MUX STDBM READ_START ENABLE_START
SEL_MUX ---模拟输入通道选择
000,AIN0; 001,AIN1 010,AIN2
011,AIN3 …… 111,AIN7
STDBM---备用模式设置
0:正常工作模式; 1:备用模式,不做 A/D转换
READ_START---通过读取启动转换
0:停止通过读取启动转换; 1:使能通过读取启动转换
ENABLE_START---通过设置该位启动转换
0:无效; 1:启动 A/D转换(启动后被清 0)
注意,如果 READ_START为 1,则该位无效
5 4 3 2 1 0
SEL_MUX STDBM READ_START ENABLE_START
YM_SEN---选择 YMON的输出值
0:输出 0( YM=高阻); 1,输出 1( YM=GND)
YP_SEN---选择 nYPON的输出值
0:输出 0( YP=外部电压); 1:输出 1( YP连接
AIN[5])
XM_SEN---选择 XMON的输出值
0:输出 0( XM=高阻); 1,输出 1( XM=GND)
XP_SEN---选择 nXP的输出值
0:输出 0( XP=外部电压); 1:输出 1( XP连接
AIN[7])
2,ADCTSC---ADC触摸屏控制寄存器
8 7 6 5 4 3 2 1 0
保留 0YM_SENYP_SENXM_SENXP_SEN PULL_UP AUTO_PST XY_PST
PULL---上拉切换使能
0,XP上拉使能; 1,XP上拉禁止
AUTO_PST---自动连续转换 X轴和 Y轴坐标模式选择
0:普通 A/D转换; 1:连续 X/Y轴转换模式
XY_PST---手动测量 X轴和 Y轴坐标模式选择
00:无操作模式; 01:对 X坐标测量;
10:对 X坐标测量; 11:等待中断模式
8 7 6 5 4 3 2 1 0
保留 0YM_SENYP_SENXM_SENXP_SEN PULL_UP AUTO_PST XY_PST
31 …… 16 15 14 13 12 11 10 9 8 8 7 6 5 4 3 2 1 0
保留为 0 起始延迟数值 ---分两种情况第一情况:
对普通转换模式、分离的 X/Y轴坐标转换模式、
连续的 X/Y轴坐标转换模式,为转换延时数值 。
第二种情况:
对中断转换模式,为按压触摸屏后到产生中断请求的延迟时间数值,其时间单位为 ms。
3,ADCDLY---ADC起始延迟寄存器
UPDOWN---等待中断模式的按压状态
0:触笔点击; 1:触笔提起
AUTO_PST---自动 X/Y轴转换模式指示
0:普通转换模式; 1,X/Y轴坐标连续转换
XY_PST---手动 X/Y轴转换模式指示
00:无操作; 01:为 X轴坐标转换
10:为 Y轴坐标转换 11:为等待中断转换
XPDATA[9,0]:为 X轴坐标转换数值、或普通 ADC转换数值具体意义由其它位指示。其值为,0---0x3FF
4,ADCDAT0---ADC转换数据 0寄存器
15 14 13 12 11 10 9 …… 0
UPDOWN AUTO_PST XY_PST 保留( 0) XPDATA或普通 ADC值第 11次到此
UPDOWN---等待中断模式的按压状态
0:触笔点击; 1:触笔提起
AUTO_PST---自动 X/Y轴转换模式指示
0:普通转换模式; 1,X/Y轴坐标连续转换
XY_PST---手动 X/Y轴转换模式指示
00:无操作; 01:为 X轴坐标转换
11:为 Y轴坐标转换 11:为等待中断转换
YPDATA[9,0]:为 10位 Y轴坐标转换结果其值为,0---0x3FF
5,ADCDAT1---ADC转换数据 1寄存器
15 14 13 12 11 10 9 …… 0
UPDOWN AUTO_PST XY_PST 保留( 0) YPDATA
例题,编写程序,对 3通道的模拟量连续做 10
次转换,用查询方式读取转换结果,其数据存于
0x400000开始的区域。
AREA ADC,CODE,READONLY
ENTRY
START
#define rADCCON (*(volatile unsigned *)0x58000000)
#define rADCDAT0 (*(volatile unsigned *)0x5800000c)
#define pref 49
#define ch 3
void adc(void)
{ int adc_data[10],i;
rADCCON=(1<<14)|(pref<<6)|(ch<<3)|1 //允许预分频
for(i=0;i<10;i++)
{ while(rADCCON&0x8000==0); //查询转换结束否
adc_data[i]=rADCDAT0&0x3ff; //读取转换结果
rADCCON|=1; //再次启动转换
}
}
4.5 中断主要内容概述结构与工作原理寄存器应用举例一、概 述
S3C2410X中断控制器有 56个中断源,对外提供 24个外中断输入引脚,内部所有设备都有中断请求信号,例如 DMA控制器,UART,IIC等等。
S3C2410X的 ARM920T内核有两个中断,IRQ
中断和快速中断 FIQ。
中断仲裁,当中断控制器接收到多个中断请求时,其内的优先级仲裁器裁决后向 CPU发出优先级最高的中断请求信号或快速中断请求信号。
二,S3C2410X中断系统结构
1、中断系统结构主要由中断源和控制寄存器两大部分构成,其寄存器主要有 4种:模式、屏蔽、优先级、挂起
(标志)寄存器等。
中断源
(有子寄存器 )
子中断源挂起寄存器 中断源
(无子寄存器 )
子中断源屏蔽寄存器中断屏蔽中断模式优先级仲裁
FIQ
IRQ 中断源挂起中断挂起
2、中断优先级仲裁器及工作原理中断系统有 6个分仲裁器和 1
个总仲裁器,
每一个仲裁器可以处理
6路中断。
三、中断控制器专用寄存器有 8个专用寄存器
Register Address R/W Description Reset Value
SRCPND 0x4A000000 R/W 中断标志寄存器 0x00000000
INTMOD 0x4A000004 R/W 中断模式寄存器 0x00000000
INTMSK 0x4A000008 R/W 中断屏蔽寄存器 0xFFFFFFFF
PRIORITY 0x4A00000C R/W 中断优先级寄存器 0x7F
INTPND 0x4A000010 R/W 中断服务寄存器 0x00000000
INTOFFSET 0x4A000014 R 中断偏移寄存器 0x00000000
SUBSRCPND 0x4A000018 R/W 子源挂起寄存器 0x00000000
INTSUBMSK 0x4A00001C R/W 中断子源屏蔽寄存器 0x7FF
主要使用前 5个寄存器该寄存器也就是中断标志寄存器各位,1:对应中断源 有 中断请求
0:对应中断源 无 中断请求注意:必须在中断处理程序中对其标志位清 0。其方法为写 1.
1,SRCPND---中断源挂起(标志)寄存器位号 中断源 位号 中断源 位号 中断源 位号 中断源
31 INT_ADC 23 INT_UART1 15 INT_UART2 7 nBATT_FLT
30 INT_RTC 22 INT_SPI0 14 INT_TIM4 6 保留
29 INT_SPI1 21 INT_SDI 13 INT_TIM3 5 EINT8_23
28 INT_UART0 20 INT_DMA3 12 INT_TIM2 4 EINT4_7
27 INT_IIC 19 INT_DMA2 11 INT_TIM1 3 EINT3
26 INT_USBH 18 INT_DMA1 10 INT_TIM0 2 EINT2
25 INT_USBD 17 INT_DMA0 9 INT_WDT 1 EINT1
24 保留 16 INT_LCD 8 INT_TICK 0 EINT0
该寄存器是设置各中断源是 FIQ中断还是 IRQ中断各位,1:对应中断源设为 FIQ中断模式
0:对应中断源设为 IRQ中断模式
2,INTMOD---中断模式寄存器位号 中断源 位号 中断源 位号 中断源 位号 中断源
31 INT_ADC 23 INT_UART1 15 INT_UART2 7 nBATT_FLT
30 INT_RTC 22 INT_SPI0 14 INT_TIM4 6 保留
29 INT_SPI1 21 INT_SDI 13 INT_TIM3 5 EINT8_23
28 INT_UART0 20 INT_DMA3 12 INT_TIM2 4 EINT4_7
27 INT_IIC 19 INT_DMA2 11 INT_TIM1 3 EINT3
26 INT_USBH 18 INT_DMA1 10 INT_TIM0 2 EINT2
25 INT_USBD 17 INT_DMA0 9 INT_WDT 1 EINT1
24 保留 16 INT_LCD 8 INT_TICK 0 EINT0
各位,1:屏蔽对应中断源
0:开放对应中断源
3,INTMSK---中断屏蔽寄存器位号 中断源 位号 中断源 位号 中断源 位号 中断源
31 INT_ADC 23 INT_UART1 15 INT_UART2 7 nBATT_FLT
30 INT_RTC 22 INT_SPI0 14 INT_TIM4 6 保留
29 INT_SPI1 21 INT_SDI 13 INT_TIM3 5 EINT8_23
28 INT_UART0 20 INT_DMA3 12 INT_TIM2 4 EINT4_7
27 INT_IIC 19 INT_DMA2 11 INT_TIM1 3 EINT3
26 INT_USBH 18 INT_DMA1 10 INT_TIM0 2 EINT2
25 INT_USBD 17 INT_DMA0 9 INT_WDT 1 EINT1
24 保留 16 INT_LCD 8 INT_TICK 0 EINT0
4,PRIORITY---中断优先级寄存器
ARB_SELn---n组优先级顺序控制位
00,REQ0,1,2,3,4,5 01,REQ0,2,3,4,1,5
10,REQ0,3,4,1,2,5 11,REQ0,4,1,2,3,5
ARB_MODEn---n组优先级循环控制位
0:优先顺序固定不变
1:优先顺序循环,每响应一次中断,其顺序循环改变一次,
但 REQ0,REQ5位置不变。
位号 含 义 位号 含 义 位号 含 义
31:21 保 留 12:11 ARB_SEL2 4 ARB_MODE4
20:19 ARB_SEL6 10:9 ARB_SEL1 3 ARB_MODE3
18:17 ARB_SEL5 8:7 ARB_SEL0 2 ARB_MODE2
16:15 ARB_SEL4 6 ARB_MODE6 1 ARB_MODE1
14:13 ARB_SEL3 5 ARB_MODE5 0 ARB_MODE0
各位,1:对应的中断源被响应,且正在执行中断服务
0:对应中断源未被响应注意:必须在中断处理程序中对其服务标志位清 0。方法为对某位写 1便清除为 0。
即在清除 SRCPND中相应位后,要清除该寄存器相应位。
5,INTPND---中断服务(挂起)寄存器位号 中断源 位号 中断源 位号 中断源 位号 中断源
31 INT_ADC 23 INT_UART1 15 INT_UART2 7 nBATT_FLT
30 INT_RTC 22 INT_SPI0 14 INT_TIM4 6 保留
29 INT_SPI1 21 INT_SDI 13 INT_TIM3 5 EINT8_23
28 INT_UART0 20 INT_DMA3 12 INT_TIM2 4 EINT4_7
27 INT_IIC 19 INT_DMA2 11 INT_TIM1 3 EINT3
26 INT_USBH 18 INT_DMA1 10 INT_TIM0 2 EINT2
25 INT_USBD 17 INT_DMA0 9 INT_WDT 1 EINT1
24 保留 16 INT_LCD 8 INT_TICK 0 EINT0
该寄存器的偏移值指示在 INTPND中显示的中断源各位,1:对应的中断源,在 INTPND中被置位说明,当在中断服务程序中对 SRCPND,INTPND中的标志位清 0时,该寄存器的对应位自动清 0。
6,INTOFFSET---中断偏移寄存器中断源 偏移 值 中断源 偏移 值 中断源 偏移 值 中断源 偏移 值
INT_ADC 31 INT_UART1 23 INT_UART2 15 nBATT_FLT 7
INT_RTC 30 INT_SPI0 22 INT_TIM4 14 保留 6
INT_SPI1 29 INT_SDI 21 INT_TIM3 13 EINT8_23 5
INT_UART0 28 INT_DMA3 20 INT_TIM2 12 EINT4_7 4
INT_IIC 27 INT_DMA2 19 INT_TIM1 11 EINT3 3
INT_USBH 26 INT_DMA1 18 INT_TIM0 10 EINT2 2
INT_USBD 25 INT_DMA0 17 INT_WDT 9 EINT1 1
保留 24 INT_LCD 16 INT_TICK 8 EINT0 0
7,SUBSRCPND---子中断源请求标志寄存器对有多个中断源的外设,显示其具体的中断请求各位,1:对应的子中断源有请求
0:对应的子中断源无请求注意,在中断服务程序中,需要对其置 1的标志位清 0。
位号 中断源 位号 中断源 位号 中断源
31:11 保 留 7 INT_TXD2 3 INT_RXD1
10 INT_ADC 6 INT_RXD2 2 INT_ERR0
9 INT_TC 5 INT_ERR1 1 INT_TXD0
8 INT_ERR2 4 INT_TXD1 0 INT_RXD0
8,INTSUBMSK---子中断源屏蔽寄存器对有多个中断源的外设,对具体的中断源进行屏蔽各位,1:屏蔽对应的子中断源
0:开放对应的子中断源位号 中断源 位号 中断源 位号 中断源
31:11 保 留 7 INT_TXD2 3 INT_RXD1
10 INT_ADC 6 INT_RXD2 2 INT_ERR0
9 INT_TC 5 INT_ERR1 1 INT_TXD0
8 INT_ERR2 4 INT_TXD1 0 INT_RXD0
在 2410init.s文件中与的中断初始化部分程序开始及中断入口
b ResetHandler
b HandlerUndef ;handler for Undefined mode
b HandlerSWI ;handler for SWI interrupt
b HandlerPabort ;handler for PAbort
b HandlerDabort ;handler for DAbort
b,;reserved
b HandlerIRQ ;handler for IRQ interrupt
b HandlerFIQ ;handler for FIQ interrupt
本段意义,利用后面定义的宏来展开上面各行,使其进入它们所对应的中断服务子程序。
中断举例 第 12次到此
LTORG ;声明一个数据缓冲池的开始
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
本段意义,利用后面定义的宏来展开上面各行,使其进入它们所对应的中断服务子程序;本宏意义,转到相应中断服务子程序去执行
MACRO
$HandlerLabel HANDLER $HandleLabel;如 Label=IRQ,( HandlerIRQ )
$HandlerLabel
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=$HandleLabel
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
MEND
IRQ中断服务程序
IsrIRQ
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9}
ldr r9,=INTOFFSET ;中断偏移寄存器
ldr r9,[r9]
ldr r8,=HandleEINT0 ;中断向量表首地址
add r8,r8,r9,lsl #2
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc}
本段意义,根据中断服务号,转去执行相应的中断处理程序段。;中断向量表 IntVectorTable
HandleEINT0 # 4
HandleEINT1 # 4
HandleEINT2 # 4
HandleEINT3 # 4
HandleEINT4_7 # 4
HandleEINT8_23 # 4
HandleRSV6 # 4
HandleBATFLT # 4
HandleTICK # 4
HandleWDT # 4
HandleTIMER0 # 4
HandleTIMER1 # 4
……
4.6 输入 /输出端口主要内容概述寄存器应用举例一、概述
S3C2410X有 117个输入 /输出端口 。这些端口是:
A口( GPA),23个输出口
B口( GPB),11个输入 /输出口
C口( GPC),16个输入 /输出口
D口( GPD),16个输入 /输出口
E口( GPE),16个输入 /输出口
F口( GPF),8个输入 /输出口
G口( GPG),16个输入 /输出口
H口( GPH),11个输入 /输出口这些端口都具有多功能,通过引脚配置寄存器,可以将其设置为所需要的功能,如,I/O功能、中断功能等等。
二、端口寄存器及引脚配置每一个端口都有 4个寄存器,它们是:引脚配置寄存器、数据寄存器、引脚上拉寄存器等。
Register Address R/W Description Reset Value
GPXCON 0x560000x0 R/W 端口 X配置寄存器 X
GPXDAT 0x560000x4 R/W 端口 X数据寄存器 X
GPXUP 0x560000x8 R/W 端口 X上拉寄存器 X
RESERVED 0x560000xC R/W 端口 X保留寄存器 -
GPADAT寄存器为准备输出的数据其值为 23位 [22,0]
注意,( 1) 当 A口引脚配置为非输出功能时,其输出无意义; ( 2)从引脚输入没有意义。
1、端口 A寄存器及引脚配置
Register Address R/W Description Reset Value
GPACON 0x56000000 R/W 端口 A引脚配置寄存器 0x7FFFFF
GPADAT 0x56000004 R/W 端口 A数据寄存器 -
RESERVED 0x56000008 - 端口 A保留寄存器 -
RESERVED 0x5600000C - 端口 A保留寄存器 -
1、端口 A寄存器及引脚配置位号 位 名 位值,0 1 位号 位 名 位值,0 1
22 GPA22 输出 nFCE 10 GPA10 输出 ADDR25
21 GPA21 输出 nRSTOUT 9 GPA9 输出 ADDR24
20 GPA20 输出 nFRE 8 GPA8 输出 ADDR23
19 GPA19 输出 nFWE 7 GPA7 输出 ADDR22
18 GPA18 输出 ALE 6 GPA6 输出 ADDR21
17 GPA17 输出 CLE 5 GPA5 输出 ADDR20
16 GPA16 输出 nGCS5 4 GPA4 输出 ADDR19
15 GPA15 输出 nGCS4 3 GPA3 输出 ADDR18
14 GPA14 输出 nGCS3 2 GPA2 输出 ADDR17
13 GPA13 输出 nGCS2 1 GPA1 输出 ADDR16
12 GPA12 输出 nGCS1 0 GPA0 输出 ADDR0
11 GPA11 输出 ADDR26 FCE,Flash片选
GPBDAT---为准备输出或输入的数据其值为 11位 [10,0]
GPBUP---端口 B上拉寄存器,位 [10,0]有意义。
0:对应引脚设置为上拉 1:无上拉功能注意,当 B口引脚配置为非输入 /输出功能时,其寄存器中的值没有意义。
2、端口 B寄存器及引脚配置
Register Address R/W Description Reset Value
GPBCON 0x56000010 R/W 端口 B引脚配置寄存器 0x0
GPBDAT 0x56000014 R/W 端口 B数据寄存器 -
GPBUP 0x56000018 R/W 端口 B上拉寄存器 0x0
RESERVED 0x5600001C - 端口 B保留寄存器 -
端口 B引脚配置寄存器位号 位 名 位值,00 01 10 11
21,20 GPB10 输入 输出 nXDREQ0 Reserved
19,18 GPB9 输入 输出 nXDACK0 Reserved
17,16 GPB8 输入 输出 nXDREQ1 Reserved
15,14 GPB7 输入 输出 nXDACK1 Reserved
13,12 GPB6 输入 输出 nXBACK Reserved
11,10 GPB5 输入 输出 nXBREQ Reserved
9,8 GPB4 输入 输出 TCLK0 Reserved
7,6 GPB3 输入 输出 TOUT3 Reserved
5,4 GPB2 输入 输出 TOUT2 Reserved
3,2 GPB1 输入 输出 TOUT1 Reserved
1,0 GPB0 输入 输出 TOUT0 Reserved
GPCDAT---为准备输出或输入的数据其值为 16位 [15,0]
GPCUP---端口 C上拉寄存器,位 [15,0]有意义。
0:对应引脚设置为上拉 1:无上拉功能注意,当 C口引脚配置为非输入 /输出功能时,其寄存器中的值没有意义。
3、端口 C寄存器及引脚配置
Register Address R/W Description Reset Value
GPCCON 0x56000020 R/W 端口 C引脚配置寄存器 0x0
GPCDAT 0x56000024 R/W 端口 C数据寄存器 -
GPCUP 0x56000028 R/W 端口 C上拉寄存器 0x0
RESERVED 0x5600002C - 端口 C保留寄存器 -
端口 C引脚配置寄存器位号 位 名位 值位号 位名 位 值
00 01 10 11 00 01 10 11
31,30 GPC15 输入 输出 VD7 保留 15,14 GPC7输入 输出 LCDVF2 保留
29,28 GPC14 输入 输出 VD6 保留 13,12 GPC6输入 输出 LCDVF1 保留
27,26 GPC13 输入 输出 VD5 保留 11,10 GPC5输入 输出 LCDVF0 保留
25,24 GPC12 输入 输出 VD4 保留 9,8 GPC4输入 输出 VM 保留
23,22 GPC11 输入 输出 VD3 保留 7,6 GPC3输入 输出 VFRAME 保留
21,20 GPC10 输入 输出 VD2 保留 5,4 GPC2输入 输出 VLINE 保留
19,18 GPC9 输入 输出 VD1 保留 3,2 GPC1输入 输出 VCLK 保留
17,16 GPC8 输入 输出 VD0 保留 1,0 GPC0输入 输出 VEND 保留
GPDDAT---为准备输出或输入的数据其值为 16位 [15,0]
GPDUP---端口 D上拉寄存器,位 [15,0]有意义。
0:对应引脚设置为上拉 1:无上拉功能初始化时,[15,12]无上拉功能,而 [11,0]有上拉注意,当 D口引脚配置为非输入 /输出功能时,其寄存器中的值没有意义。
4、端口 D寄存器及引脚配置
Register Address R/W Description Reset Value
GPDCON 0x56000030 R/W 端口 D引脚配置寄存器 0x0
GPDDAT 0x56000034 R/W 端口 D数据寄存器 -
GPDUP 0x56000038 R/W 端口 D上拉寄存器 0xF000
RESERVED 0x5600003C - 端口 D保留寄存器 -
端口 D引脚配置寄存器位号 位 名位 值位号 位名 位 值
00 01 10 11 00 01 10 11
31,30GPD15 输入 输出 VD23 nSS0 15,14 GPD7 输入 输出 VD15 保留
29,28GPD14 输入 输出 VD22 nSS1 13,12 GPD6 输入 输出 VD14 保留
27,26GPD13 输入 输出 VD21 保留 11,10 GPD5 输入 输出 VD13 保留
25,24GPD12 输入 输出 VD20 保留 9,8 GPD4 输入 输出 VD12 保留
23,22GPD11 输入 输出 VD19 保留 7,6 GPD3 输入 输出 VD11 保留
21,20GPD10 输入 输出 VD18 保留 5,4 GPD2 输入 输出 VD10 保留
19,18 GPD9 输入 输出 VD17 保留 3,2 GPD1 输入 输出 VD9 保留
17,16 GPD8 输入 输出 VD16 保留 1,0 GPD0 输入 输出 VD8 保留
GPEDAT---为准备输出或输入的数据其值为 16位 [15,0]
GPEUP---端口 E上拉寄存器,位 [15,0]有意义。
0:对应引脚设置为上拉 1:无上拉功能初始化时,各个引脚都有上拉功能。
注意,当 E口引脚配置为非输入 /输出功能时,其寄存器中的值没有意义。
5、端口 E寄存器及引脚配置
Register Address R/W Description Reset Value
GPECON 0x56000040 R/W 端口 E引脚配置寄存器 0x0
GPEDAT 0x56000044 R/W 端口 E数据寄存器 -
GPEUP 0x56000048 R/W 端口 E上拉寄存器 0x0
RESERVED 0x5600004C - 端口 E保留寄存器 -
端口 E引脚配置寄存器位号 位 名位 值位号 位名 位 值
00 01 10 11 00 01 10 11
31,30GPE15 输入 输出 IICSDA 保留 15,14 GPE7 输入 输出 SDDAT0 保留
29,28GPE14 输入 输出 IICSCL 保留 13,12 GPE6 输入 输出 SDCMD 保留
27,26GPE13 输入 输出 SPICLK0保留 11,10 GPE5 输入 输出 SDCLK 保留
25,24GPE12 输入 输出 SPISI0 保留 9,8 GPE4 输入 输出 IISSDO 保留
23,22GPE11 输入 输出 SPISO0 保留 7,6 GPE3 输入 输出 IISSDI 保留
21,20GPE10 输入 输出 SDDAT3 保留 5,4 GPE2 输入 输出 CDCLK 保留
19,18 GPE9 输入 输出 SDDAT2 保留 3,2 GPE1 输入 输出 IISSCLK 保留
17,16 GPE8 输入 输出 SDDAT1 保留 1,0 GPE0 输入 输出 IISLRCK 保留
GPFDAT---为准备输出或输入的数据其值为 8位 [7,0]
GPFUP---端口 F上拉寄存器,位 [7,0]有意义。
0:对应引脚设置为上拉 1:无上拉功能初始化时,各个引脚都有上拉功能。
注意,当 F口引脚配置为非输入 /输出功能时,其寄存器中的值没有意义。
6、端口 F寄存器及引脚配置
Register Address R/W Description Reset Value
GPFCON 0x56000050 R/W 端口 F引脚配置寄存器 0x0
GPFDAT 0x56000054 R/W 端口 F数据寄存器 -
GPFUP 0x56000058 R/W 端口 F上拉寄存器 0x0
RESERVED 0x5600005C - 端口 F保留寄存器 -
端口 F引脚配置寄存器位号 位 名 位 值00 01 10 11
15,14 GPF7 输入 输出 EINT7 保留
13,12 GPF6 输入 输出 EINT6 保留
11,10 GPF5 输入 输出 EINT5 保留
9,8 GPF4 输入 输出 EINT4 保留
7,6 GPF3 输入 输出 EINT3 保留
5,4 GPF2 输入 输出 EINT2 保留
3,2 GPF1 输入 输出 EINT1 保留
1,0 GPF0 输入 输出 EINT0 保留
GPGDAT---为准备输出或输入的数据其值为 16位 [15,0]
GPGUP---端口 G上拉寄存器,位 [15,0]有意义。
0:对应引脚设置为上拉 1:无上拉功能初始化时,[15:11]引脚无上拉功能,其它引脚有。
注意,当 G口引脚配置为非输入 /输出功能时,其寄存器中的值没有意义。
7、端口 G寄存器及引脚配置
Register Address R/W Description Reset Value
GPGCON 0x56000060 R/W 端口 G引脚配置寄存器 0x0
GPGDAT 0x56000064 R/W 端口 G数据寄存器 -
GPGUP 0x56000068 R/W 端口 G上拉寄存器 0xF800
RESERVED 0x5600006C - 端口 G保留寄存器 -
端口 G引脚配置寄存器位号 位 名位 值位号 位名 位 值
00 01 10 11 00 01 10 11
31,30GPG15输入 输出 EINT23 nYPON 15,14 GPG7 输入 输出 EINT15 SPICLK1
29,28GPG14输入 输出 EINT22YMON 13,12 GPG6 输入 输出 EINT14 SPISI1
27,26GPG13输入 输出 EINT21 nXPON 11,10 GPG5 输入 输出 EINT13 SPISO1
25,24GPG12输入 输出 EINT20XMON 9,8 GPG4 输入 输出 EINT12 LCD-PEN
23,22GPG11 输入 输出 EINT19 TCLK1 7,6 GPG3 输入 输出 EINT11 nSS1
21,20GPG10输入 输出 EINT18 保留 5,4 GPG2 输入 输出 EINT10 nSS0
19,18 GPG9 输入 输出 EINT17 保留 3,2 GPG1 输入 输出 EINT9 保留
17,16 GPG8 输入 输出 EINT16 保留 1,0 GPG0 输入 输出 EINT8 保留
LCD-PEN:POWER_ENABLE
nSS0:SPI0_SELECT
GPHDAT---为准备输出或输入的数据其值为 11位 [10,0]
GPHUP---端口 H上拉寄存器,位 [10,0]有意义。
0:对应引脚设置为上拉 1:无上拉功能注意,当 H口引脚配置为非输入 /输出功能时,其寄存器中的值没有意义。
8、端口 H寄存器及引脚配置
Register Address R/W Description Reset Value
GPHCON 0x56000070 R/W 端口 H引脚配置寄存器 0x0
GPHDAT 0x56000074 R/W 端口 H数据寄存器 -
GPHUP 0x56000078 R/W 端口 H上拉寄存器 0x0
RESERVED 0x5600007C - 端口 H保留寄存器 -
端口 H引脚配置寄存器位号 位 名 位值,00 01 10 11
21,20 GPH10 输入 输出 CLKOUT1 Reserved
19,18 GPH9 输入 输出 CLKOUT0 Reserved
17,16 GPH8 输入 输出 UCLK Reserved
15,14 GPH7 输入 输出 RXD2 nCTS1
13,12 GPH6 输入 输出 TXD2 nRTS1
11,10 GPH5 输入 输出 RXD1 Reserved
9,8 GPH4 输入 输出 TXD1 Reserved
7,6 GPH3 输入 输出 RXD0 Reserved
5,4 GPH2 输入 输出 TXD0 Reserved
3,2 GPH1 输入 输出 nRTS0 Reserved
1,0 GPH0 输入 输出 nCTS0 Reserved
UCLK为 USB的
9、端口其它控制寄存器
Register Address R/W Description Reset Value
MISCCR 0x56000080 R/W 混合控制寄存器 0x10330
DCLKCON 0x56000084 R/W D时钟控制寄存器 0x0
nEN_SCKE---SCLK使能位。在电源关闭模式下对 SDRAM做保护 0,正常状态 1:低电平
nEN_SCLKx---SCLKx使能位。在电源关闭模式下对 SDRAM
做保护
0,SCLKx= SCLK 1:低电平
nRSTCON---对 nRSTOUT软件复位控制位
0:使 nRSTOUT为低,0; 1:使 nRSTOUT为高,1
15 14 13 12 11 10 9 8 7
保留 USBSUSPND1 USBSUSPND0 保留 CLKSEL1 保留
( 1) MISCCR---混合控制寄存器
31 …… 20 19 18 17 16
保留(为 0) nEN_SCKE nEN_SCLK1 nEN_SCLK0 nRSTCON
6 5 4 3 2 1 0
CLKSEL0 USBPAD MEM_HZ_CON SPUCR_L SPUCR_H
USBSUSPND1---USB端口 1模式
0:正常 1:浮空
USBSUSPND0---USB端口 0模式
0:正常 1:浮空
CLKSEL1 --- CLKOUT1引脚输出信号源选择
000,MPLL CLK 001,UPLL CLK
010,FCLK 011,HCLK 100,PCLK
101,DCLK1 11x:保留
CLKSEL0 --- CLKOUT0引脚输出信号源选择
000,MPLL CLK 001,UPLL CLK
010,FCLK 011,HCLK 100,PCLK
101,DCLK0 11x:保留
15 14 13 12 11 10 9 8 7
保留 USBSUSPND1 USBSUSPND0 保留 CLKSEL1 保留
USBPAD---与 USB连接选择
0:与 USB设备连接 1:与 USB主机连接
MEM_HZ_CON---MEM高阻控制位
0,Hi-Z 1:前一状态
SPUCR_L---数据口低 16位 [15,0]上拉控制位
0:上拉 1:无上拉
SPUCR_H---数据口高 16位 [31,16]上拉控制位
0:上拉 1:无上拉
6 5 4 3 2 1 0
CLKSEL0 USBPAD MEM_HZ_CON SPUCR_L SPUCR_H
15 … 12 11 10 9 8 7 6 5 4 3 2 1 0
保留 DCLK0CMP DCLK0DIV 保留 DCLK0SelCK DCLK0EN
( 2) DCLKCON---D时钟控制寄存器
31 … 28 27 26 25 24 23 22 21 20 19 18 17 16
保留 DCLK1CMP DCLK1DIV 保留 DCLK1SEL DCLK1EN
DCLK1(0)CMP---DCLK1(0)低电平时间所占的比例数 。
设该位值为 m,m< DCLK1(0)DIV。
则低、高电平持续时间的源周期数分别为:
m+1,DCLK1(0)DIV-m
DCLK1(0)DIV---DCLK1(0)分频值
DCLK1(0) frequency
= source clock / ( DCLK1(0)DIV + 1 )
15 … 12 11 10 9 8 7 6 5 4 3 2 1 0
保留 DCLK0CMP DCLK0DIV 保留 DCLK0SelCK DCLK0EN
( 2) DCLKCON---D时钟控制寄存器(续)
31 … 28 27 26 25 24 23 22 21 20 19 18 17 16
保留 DCLK1CMP DCLK1DIV 保留 DCLK1SEL DCLK1EN
DCLK1(0)SelCK---DCLK1(0) source clock 选择
0,源时钟选择 PCLK
1:源时钟选择 UCLK ( USB )
DCLK1(0)EN---DCLK1(0) Enable
0:禁止
1:允许主要设置各个外中断源的触发方式、滤波
10、外中断控制寄存器
Register Address R/W Description Reset Value
EXTINT0 0x56000088 R/W 外中断触发方式寄存器 0 0x0
EXTINT1 0x5600008C R/W 外中断触发方式寄存器 1 0x0
EXTINT2 0x56000090 R/W 外中断控制寄存器 2 0x0
EINT0~7---中断请求信号触发方式选择
000:低电平触发 001:高电平触发
01x:下降沿触发 10x:上升沿触发
11x:双边沿触发第 3,7,11,15,19,23,27,31位 ---保留
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
X EINT3 X EINT2 X EINT1 X EINT0
( 1) EXTINT0---外中断触发方式控制寄存器 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
X EINT7 X EINT6 X EINT5 X EINT4
EINT8~15---中断请求信号触发方式选择
000:低电平触发 001:高电平触发
01x:下降沿触发 10x:上升沿触发
11x:双边沿触发第 3,7,11,15,19,23,27,31位 ---保留
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
X EINT11 X EINT10 X EINT9 X EINT8
( 2) EXTINT1---外中断触发方式控制寄存器 1
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
X EINT15 X EINT14 X EINT13 X EINT12
EINT16~23---外中断请求信号触发方式选择
000:低电平触发 001:高电平触发
01x:下降沿触发 10x:上升沿触发
11x:双边沿触发第 3,7,11,15,19,23,27,31位 ---为 FILTEN
各引脚滤波控制位
0:禁止滤波 1:使能滤波
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
F19 EINT19 F18 EINT18 F17 EINT17 F16 EINT16
( 3) EXTINT2---外中断控制寄存器 2
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
F23 EINT23 F22 EINT22 F21 EINT21 F20 EINT20
主要设置各个外中断源的滤波器设置
11、外中断滤波控制寄存器
Register Address R/W Description Reset Value
EINTFLT0 0x56000094 R/W 保留 -
EINTFLT1 0x56000098 R/W 保留 -
EINTFLT2 0x5600009C R/W 外中断滤波控制寄存器 2 0x0
EINTFLT3 0x560000A0 R/W 外中断滤波控制寄存器 3 0x0
FLTCLK16~19---外中断 16~19滤波器时钟选择
0,PCLK
1:外部 /振荡时钟(由 OM引脚选择)
EINTFLT16~19---外中断 16~19滤波器宽度 (频带宽度)
15 14 …… 8 7 6 …… 0
FLTCLK17 EINTFLT17 FLTCLK16 EINTFLT16
( 1) EINTFLT2---外中断滤波控制寄存器 2
31 30 …… 24 23 22 16
FLTCLK19 EINTFLT19 FLTCLK18 EINTFLT18
FLTCLK20~23---外中断 20~23滤波器时钟选择
0,PCLK
1:外部 /振荡时钟(由 OM引脚选择)
EINTFLT20~23---外中断 20~23滤波器宽度 (频带宽度)
15 14 …… 8 7 6 …… 0
FLTCLK21 EINTFLT21 FLTCLK20 EINTFLT20
( 2) EINTFLT3---外中断滤波控制寄存器 3
31 30 …… 24 23 22 16
FLTCLK23 EINTFLT23 FLTCLK22 EINTFLT22
12、外中断屏蔽、标志寄存器
Register Address R/W Description Reset Value
EINTMAK 0x560000A4 R/W 外中断屏蔽寄存器 0x00FFFFF0
EINTPEND 0x560000A8 R/W 外中断标志寄存器 0x0
外中断屏蔽寄存器位号 含 义 位号 含 义 位号 含 义
23 EINT23 15 EINT15 7 EINT7
22 EINT22 14 EINT14 6 EINT6
21 EINT21 13 EINT13 5 EINT5
20 EINT20 12 EINT12 4 EINT4
19 EINT19 11 EINT11 3 保留
18 EINT18 10 EINT10 2 保留
17 EINT17 9 EINT9 1 保留
16 EINT16 8 EINT8 0 保留各位:
0:允许中断 1:禁止中断注意,EINT0--- EINT3不能在此被屏蔽,在 SRCPND中屏蔽。
外中断标志寄存器位号 含 义 位号 含 义 位号 含 义
23 EINT23 15 EINT15 7 EINT7
22 EINT22 14 EINT14 6 EINT6
21 EINT21 13 EINT13 5 EINT5
20 EINT20 12 EINT12 4 EINT4
19 EINT19 11 EINT11 3 保留
18 EINT18 10 EINT10 2 保留
17 EINT17 9 EINT9 1 保留
16 EINT16 8 EINT8 0 保留各位:
0:无中断请求 1:有中断请求注意:对某位写 1,则清除相应标志,即清为 0.
GSTATUS3,4:
复位时被清 0,其它情况下其数据不变。
用户可以用于保存数据。
13、外中断状态寄存器
Register Address R/W Description Reset Value
GSTATUS0 0x560000AC R 外部引脚状态寄存器 不确定
GSTATUS1 0x560000B0 R 芯片 ID(标识 )寄存器 0x32410000
GSTATUS2 0x560000B4 R/W 复位状态寄存器 0x1
GSTATUS3 0x560000B8 R/W 信息保存寄存器 0x0
GSTATUS4 0x560000C0 R/W 信息保存寄存器 0x0
nWEIT---引脚 nWEIT状态
nCON---引脚 nCON状态
RnB---引脚 R/nB状态
nBATT_FLT---引脚 nBATT_FLT状态注意:各位的数值 0,1,随着对应引脚变化。
31 …… 4 3 2 1 0
保 留 nWEIT nCON RnB nBATT_FLT
( 1) GSTATUS0---外部引脚状态寄存器
WDTRST---上电复位控制状态
1:出现了上电复位对该位写,则将该位清 0
OFFRST---掉电模式复位状态。
1:系统出现了从掉电模式唤醒复位对该位写,则将该位清 0
PWRST---看门狗复位状态
1:系统出现了看门狗定时器复位对该位写,则将该位清 0
31 …… 3 2 1 0
保 留 WDTRST OFFRST PWRST
( 2) GSTATUS2---复位状态寄存器第 13讲到此外中断举例
static void __irq Eint0Int(void)
{
ClearPending(BIT_EINT0);
Uart_Printf("EINT0 interrupt is occurred.\n");
}
static void __irq Eint1Int(void)
{
ClearPending(BIT_EINT1);
Uart_Printf("EINT1 interrupt is occurred.\n");
}
#define ClearPending(bit) {\rSRCPND = bit;\ rINTPND = bit;\
rINTPND;\ }
void Test_Eint(void)
{
int i;
int extintMode; //选择外中断触发方式变量
Uart_Printf("[External Interrupt Test]\n");
Uart_Printf("1.L-LEVEL 2.H-LEVEL 3.F-EDGE 4.R-
EDGE 5.B-EDGE\n");
Uart_Printf("Select the external interrupt type.\n");
extintMode=Uart_Getch();
//extintMode='3';
rGPFCON = (rGPFCON & 0xfffa)|(1<<3)|(1<<1);
// 设置引脚配置,F0,F1配置为 EINT0/1
switch(extintMode)
{
case '1':
rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x0<<4 |
0x0<<0; //EINT0/1=low level triggered
break;
case '2':
rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x1<<4 |
0x1<<0; //EINT0/1=high level triggered
break;
case '3':
rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x2<<4 |
0x2<<0; //EINT0/1=falling edge triggered
break;
case '4':
rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x4<<4 |
0x4<<0; //EINT0/1=rising edge triggered
break;
case '5':
rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x6<<4 |
0x6<<0; //EINT0/1=both edge triggered
break;
default,break;
}
Uart_Printf(―Press the EINT0/1 buttons or Press any key to
exit.\n‖); //设置中断向量
pISR_EINT0=(U32)Eint0Int; //将中断处理程序的开始
pISR_EINT1=(U32)Eint1Int;; //地址送到中断向量表
rEINTPEND = 0xffffff; //清除 EINTPND需要向其中写入数据。因此这句代码的含义是清除 EINTPND。
rSRCPND = BIT_EINT0|BIT_EINT1;
//to clear the previous pending states
rINTPND = BIT_EINT0|BIT_EINT1;
rINTMSK=~(BIT_EINT0|BIT_EINT1);
Uart_Getch();
rEINTMASK=0xffffff;
rINTMSK=BIT_ALLMSK;
} ( void Test_Eint(void)函数结束 )
注释,#define BIT_ALLMSK (0xffffffff)
4.7 定时器主要内容概述结构寄存器应用举例一、概 述
1,S3C2410X定时器的主要特性
5个 16位定时器;
2个 8位预分频器和 2个 4位分频器;
可编程 PWM输出占空比;
具有初值自动重装连续输出模式和单脉冲输出模式;
具有死区生成器。
S3C2410有 5个 16位的定时器,定时器 0- 3具有 PWM
(脉宽调制)功能。定时器 4是一个内部定时器,没有输出引脚,供内部使用。定时器 0有死区产生器,通常用于大电流设备控制。
有 2个 8位预分频器和 2个 4位分频器 。定时器 0 和定时器
1 分享同一个 8 位的预分频器和分频器,定时器 2,3,4 分享另一个预分频器和分频器,分频器有 1/2,1/4,1/8,1/16
这 4种分频值。定时器从分频器接收自己的时钟信号,时钟分频器从相应的预分频器接收时钟信号。
2,PWM(脉宽调制)概念
PWM(脉宽调制),就是只对一方波序列信号的占空比按照要求进行调制,而不改变方波信号的其它参数,即不改变幅度和周期,因此脉宽调制信号的产生和传输,都是数字式的。
用脉宽调制技术可以实现模拟信号,如果调制信号的频率远远大于信号接受者的分辨率,则接收者获得的是信号的平均效果,不能感知数字信号的 0和 1,其信号大小的平均值与信号的占空比有关,信号的占空比越大,平均信号越强,其平均值与占空比成正比。只要带宽足够(频率足够高或周期足够短),任何模拟信号都可以使用 PWM
来实现。
PWM技术的应用,借助于微处理器,使用脉宽调制方法实现模拟信号是一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
二、结构与工作原理
1、定时器结构
( 1)时钟控制,系统为每个定时器设置有:
预分频器、分频器。
( 2)定时器组成( 5部分):
减法计数器、
初值寄存器、比较寄存器、观察寄存器、控制逻辑等部分构成。
定时器结构图预分频器
8位分频器
1/2
1/4
1/8
1/16
TCLK0/1
计数器观察寄存器比较寄存器
PCLK 五选一开关初值寄存器控制逻辑 TOUT
中断
2、工作原理
( 1)定时器工作过程装入初值、启动计数,计数结束产生中断请求,并且可以重装初值连续计数。如下图所示。
( 2)初值自动重装、手动装载和双缓冲初值自动重装功能,5个定时器都具有此功能。
当计数器中值减到 0后,若设置了自动重装功能,
则在下一计数周期开始前将初值装入计数器重新计数。
初值手动装载功能,在启动计数前,必须使用手动装载功能将初值装入计数器,而初值自动重装仅是一次计数结束后重新装入初值。
双缓冲功能,如果定时器正在工作,此时写入新的数据到 TCNTBn、或者到 TCMPBn,该写入的数据不影响本次定时器的操作。当定时器到达 0
后下一次运行定时器时,新写入的 TCNTBn、或者
TCMPBn才生效。
( 3) PWM输出寄存器 TCMPB的作用:当计数器 TCNT中的值减到与
TCMPB的值相同时,TOUT的输出值取反。 改变 TCMPB的值,便改变了输出方波的占空比 。
TOUT的输出可以设置为反相输出,如下图所示。
正向输出正向输出反相输出周期开始
( 4)死区产生器死区的概念,是一小段时间间隔,在这个时间间隔内,
禁止两个开关同时处于开启状态。死区是在功率设备控制中常采用的一种技术,防止两个开关同时打开起反作用。
S3C2410的 timer0具有死区发生器功能,可用于控制大功率设备。
死区发生器开启前后输出波形对比
( 5) DMA请求模式
S3C2410中定时器的 DMA功能,系统中的 5个定时器都有 DMA请求功能,但是在同一时刻只能设置一个使用
DMA功能,通过设置其 DMA模式位来实现。
DMA请求过程,定时器可以在任意时间产生 DMA请求,并且保持 DMA请求信号( nDMA_REQ)为低直到定时器收到 ACK信号。当定时器收到 ACK信号时,它使请求信号变得无效。
DMA请求与中断的关系,如果一个定时器被配置为
DMA模式,该定时器不会产生中断请求了。其他的定时器会正常的产生中断。
3、计数时钟和输出计算
1)定时器输入时钟频率 f Tclk (即计数时钟频率),
f Tclk=[f pclk∕(Prescaler+1)] × 分频值式中,Prescaler,预分频值,0---255;分频值为
1/2,1/4,1/8,1/16。
2) PWM输出时钟频率,
PWM输出时钟频率 = f Tclk ∕ TCNTBn
3) PWM输出信号占空比 (即高电平持续时间所占信号周期的比例),
PWM输出信号占空比 = TCMPBn∕TCNTBn
定时器最大、最小输出周期设 PCLK的频率为 50MHz,经过预分频和分频器后,送给定时器的可能计数时钟频率由表 4-7-1给出。
表 4-7-1 定时器最大、最小输出周期分频值最小输出周期
(预分频器 =0、
TCNTBn=1)
最大输出周期
(预分频器 =255、
TCNTBn=6553
5)
最小输出周期
(预分频器 =0、
TCNTBn=6553
5)
最小输出周期
(预分频器 =0、
TCNTBn=255)
1/2 25.00MHz(0.04μs) 0.6710s 381Hz 97656
1/4 12.50MHz(0.08μs) 1.3421s 191Hz 48828
1/8 6.250MHz(0.16μs) 2.6843s 95Hz 24414
1/16 3.125MHz(0.32μs) 5.3686s 48Hz 12207
三、定时器专用寄存器共有 6种,17个寄存器
TCNTBn---Timern计数初值寄存器(计数缓冲寄存器),16位
TCMPBn---Timern比较寄存器(比较缓 冲寄存器),16位
TCNTOn---Timern计数读出寄存器,16位
Register Address R/W Description Reset Value
TCFG0 0x51000000 R/W 配置寄存器 0 0x00000000
TCFG1 0x51000004 R/W 配置寄存器 1 0x00000000
TCON 0x51000008 R/W 控制寄存器 0x00000000
TCNTBn 0x510000xx R/W 计数初值寄存器 (5个 ) 0x0000
TCMPBn 0x510000xx R/W 比较寄存器 (4个 ) 0x0000
TCNTOn 0x510000xx R 观察寄存器 (5个 ) 0x0000
Dead zone length---死区宽度设置位其值 N为,0~255,以 timer0的定时时间为单位死区宽度为:( N+1) × timer0的定时时间
Prescaler1---timer2,3,4的预分频值其值 N为,0~255
输出频率为,PCLK ÷ ( N+1)
Prescaler0--- timer0,1的预分频值其值 N为,0~255
输出频率为,PCLK ÷ ( N+1)
1,TCFG0---预分频器配置寄存器
31 …… 24 23 …… 16 15 …… 8 7 …… 0
保留(为 0) Dead zone length Prescaler1 Prescaler0
2,TCFG1---DMA模式与分频选择寄存器
DMA mode---DMA通道选择设置位
0000:不使用 DMA方式,所有通道都用中断方式
0001:选择 timer0 0010,选择 timer1
0011:选择 timer2 0100,选择 timer3
0101:选择 timer4 011X,保留
MUX4~ MUX0---timer4~timer0分频值选择 0000:
1/2 0001,1/4 0010,1/8
0011,1/16
01XX:选择外部 TCLK0,1(对 timer0,1是选
TCLK0,对 timer4,3,2是选 TCLK1)
31 … 24 23 … 20 19…16 15…12 11…8 7 … 4 3 … 0
保留(为 0) DMA mode MUX4 MUX3 MUX2 MUX1 MUX0
第 14讲到此
TL4~TL0---计数初值自动重装控制位
0:单次计数
1:计数器值减到 0时,自动重新装入初值连续计数。
TUP4~TUP0---计数初值手动装载控制位。
0:不操作 1:立即将 TCNTBn中的计数初值装载到计数寄存器 TCNTn中。
说明,如果没有执行手动装载初值,则计数器启动时无初值。
12 11 10 9 8 7…5 4 3 2 1 0
TR2 TL1 TO1 TUP1 TR1 保留 DZE TL0 TO0 TUP0 TR0
3,TCON---定时器控制寄存器
31… 23 22 21 20 19 18 17 16 15 14 13
保留 TL4 TUP4 TR4 TL3 TO3 TUP3 TR3 TL2 TO2 TUP2
TR4~TR0---TIMER4~TIMER0运行控制位
0:停止 1:启动对应的 TIMER
TO3~TO0--- TIMER4~TIMER0输出控制位
0:正相输出 1:反相输出
DZE---TIMER0死区操作控制位
0:禁止死区操作 1:使能死区操作
12 11 10 9 8 7…5 4 3 2 1 0
TR2 TL1 TO1 TUP1 TR1 保留 DZE TL0 TO0 TUP0 TR0
3,TCON---定时器控制寄存器(续)
31… 23 22 21 20 19 18 17 16 15 14 13
保留 TL4 TUP4 TR4 TL3 TO3 TUP3 TR3 TL2 TO2 TUP2
四、定时器的使用
1、定时器初始化方法
( 1)写 TCFG0,设置计数时钟的预分频值和 Timer0
死区宽度;
( 2)写 TCFG1,选择各个定时器的分频值和 DMA、
中断服务;
( 3)对 TCNTBn和 TCMPBn分别写入计数初值和比较初值;
( 4)写 TCON,设置计数初值自动重装、手动装载初值、设置反相输出;
( 5)再写 TCON,清除手动装载初值位、设置正相输出、启动计数。
2、定时器停止运行方法写 TCON,禁止计数初值自动重装。(一般不使用运行控制位停止运行)
3、定时器操作例子
( 1) 按照前面初始化定时器;设置
TCNTBn=160(50+110),TCMPBn=110;手动装入初值后,
又重设 TCNTBn=80,TCMPBn=40;
( 2) 启动定时器,按第一个初值计数;
( 3)与第一个比较值相同,输出取反;
( 4)第一次计数结束,自动重装初值 80,40;
( 5) 在第一次中断处理程序又重设 TCMPBn=60;
( 8) 在第二次中断处理程序禁止自动重装初值,准备结束计数;
( 10)第三次计数结束,不再计数。
50 110 40 40 20 60
1 2 3 4 6 7 9 10
5 8
TOUTn
定时器应用举例
#define BIT_TIMER0 (0x1<<10)
int variable0,variable1,variable2,variable3,variable4;
void __irq Timer0Done(void)
{
rSRCPND = BIT_TIMER0; //Clear pending bit
rINTPND = BIT_TIMER0; //Clear serve bit
variable0++;
}
void __irq Timer1Done(void)
{ rSRCPND = BIT_TIMER1; //Clear pending bit
rINTPND = BIT_TIMER1;
variable1++;
}
rINTPND; //Prevent an double interrupt pending
#define pISR_TIMER0 (*(unsigned *)(_ISR_STARTADDRESS+0x48))
#define pISR_TIMER1 (*(unsigned *)(_ISR_STARTADDRESS+0x4c))
void Test_TimerInt(void)
{
variable0 = 0;variable1 = 0;variable2 = 0;
variable3 = 0;variable4 = 0;
rINTMSK = ~(BIT_TIMER4 | BIT_TIMER3 |
BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0);
//将各个中断向量写入中断向量表中
pISR_TIMER0 = (int)Timer0Done;
pISR_TIMER1 = (int)Timer1Done;
pISR_TIMER2 = (int)Timer2Done;
pISR_TIMER3 = (int)Timer3Done;
pISR_TIMER4 = (int)Timer4Done;
Uart_Printf("\n[ Timer 0,1,2,3,4 Interrupt Test ]\n\n");
rTCFG0 = rTCFG0 & ~(0xffffff) | 0x000f0f; //死区宽度 =0,
//T1预分频 =0x0f,T0预分频 =0x0f
rTCFG1 =rTCFG1 & ~(0xffffff) | 0x001233; //全部使用中断
//T4---T0分频值为,1/2,1/4,1/8,1/16,1/16
//设置 T0---T4计数初值
rTCNTB0 = 0xffff; // (1/(50MHz/16/16)) * 0xffff (65535) = 0.334s
rTCNTB1 = 0xffff; // (1/(50MHz/16/16)) * 0xffff (65535) = 0.334s
rTCNTB2 = 0xffff; // (1/(50MHz/16/8 )) * 0xffff (65535) = 0.163s
rTCNTB3 = 0xffff; // (1/(50MHz/16/4 )) * 0xffff (65535) = 0.078s
rTCNTB4 = 0xffff; // (1/(50MHz/16/2 )) * 0xffff (65535) = 0.039s
rTCON = rTCON & ~(0xffffff) | 0x6aaa0a; //Auto reload,
//Inverter off,Manual update,Dead zone disable,Stop
rTCON = rTCON & ~(0xffffff) | 0x599901; //Auto reload
//(T0=One-shot),Inverter off,No operation,Dead zone disable,Start
while(variable0 == 0);
Delay(1); //To compensate timer error(<1 tick period)
if(variable4==8 && variable3==4 && variable2==2 &&
variable1==1 && variable0==1)
Uart_Printf("Timer 0,1,2,3,4 Interrupt Test --> OK\n");
else
Uart_Printf("Timer 0,1,2,3,4 Interrupt Test --> Fail.......\n");
Uart_Printf("Press any key to exit Timer interrupt test\n");
while(!Uart_GetKey());
rTCON = 0x0; //One-shot,Inverter off,No operation,Dead
zone disable,Stop
Uart_Printf("Timers interrupt number is as below:\n");
Uart_Printf("Timer0 - %d,Timer1 - %d,Timer2 - %d,
Timer3 - %d,Timer4 - %d \n",variable0,variable1,
variable2,variable3,variable4);
rINTMSK |= (BIT_TIMER4 | BIT_TIMER3 |
BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0);
}
#define BIT_TIMER0 (0x1<<10)
#define BIT_TIMER1 (0x1<<11)
#define BIT_TIMER2 (0x1<<12)
#define BIT_TIMER3 (0x1<<13)
#define BIT_TIMER4 (0x1<<14)
4.8 UART通用异步串行接口主要内容概述结构寄存器应用举例重点:
( 1)控制寄存器、线路控制寄存器、
发 /收状态寄存器;
( 2) RTC应用一、概 述
S3C2410 的 UART(通用异步串行口) 有三个独立的异步串行 I/O 端口,UART0,UART1,UART2,每个串口都可以在中断和 DMA 两种模式下进行收发。 UART支持的最高波特率达 230.4kbps。
每个 UART 包含,波特率发生器、接收器、发送器和控制单元。波特率发生器以 PCLK或 UCLK为时钟源。发送器和接收器各包含 1个 16 字节的 FIFO 寄存器和移位寄存器。
S3C2410 的 3个 UART都有 遵从 1.0规范的红外传输功能,
UART0,UART1有完整的握手信号,可以连接 MODEM。
当发送数据的时候,数据先写到 FIFO 然后拷贝到发送移位寄存器,然后从数据输出端口( TxDn)依次被移位输出。被接收的数据也同样从接收端口( RxDn)移位输入到移位寄存器,然后拷贝到 FIFO 中。
二、串行口结构和工作原理
1、串行口结构主要有 4
部分构成:
接收器、发送器、波特率发生器、
控制逻辑等。
接收器 /发送器的结构错误状态寄存器控制寄存器波特率除数寄存器
MODEM状态 R
MODEM控制 R
发送移位寄存器接收移位寄存器线路控制寄存器收发状态寄存器
FI
FO
控制寄存器
FI
FO
状态寄存器发送缓冲寄存器接收缓冲寄存器
:
:
:
:
中断 /DMA请求
nRT
S
nCT
S
TxD
RxD
Tx FIFO
Rx FIFO
2、工作原理
( 1) 串行口的操作数据帧格式,可编程,包含 1个开始位,5 到 8 个数据位,1个可选的奇偶校验位,1个或 2个停止位,通过线路控制器( ULCONn)来设置。
发送中止信号:迫使串口输出逻辑 0,这种状态保持一个传输帧的时间长度。通常在一帧传输数据完整地传输完之后,再通过这个全 0 状态将中止信号发送给对方。中止信号发送之后,传送数据连续放到 FIFO 中(在不使用 FIFO
模式下,将被放到输出保持寄存器)。
接收器具有错误检测功能:可以检测出溢出错误,奇偶校验错误,帧错误和中止状况,每种情况下都会将一个错误标志在接收状态寄存器置位。
( 2)串行口的波特率发生器每个 UART 的波特率发生器为传输提供了串行移位时钟。波特率产生器的时钟源可以从 S3C2410 的内部系统时钟 PCLK或 UCLK 中来选择。波特率数值决定于波特率除数寄存器( UBRDIVn)的值,波特率数与 UBRDIVn 的关系为:
UBRDIVn=(int)( CLK/( f B*16))- 1
其中 CLK为所选择的时钟频率,f B为波特率。
f B= CLK/16/ ( UBRDIVn + 1 )
例如,如果波特率为 115200bps 且 PCLK 或 UCLK 为
40MHz,则 UBRDIVn 为:
UBRDIVn =( int) (40000000)(115200*16)) - 1
= (int)(21.7) - 1
= 21- 1 = 20
( 3)串行口波特率误差极限在应用中,实际波特率往往与理想波特率有差别,其误差不能超过一定的范围,其极限为,UART传输 10bit数据的时间误差应该小于 1.87%( 3/160)。
t_true = (UBRDIVn + 1)× 16× 10 / PCLK
实际的传输 10bit所需时间
t_ideal = 10 / baud_rate
理想情况下传输 10位需要的时间
UART error= ( ( t_true – t_ideal ) / t_ideal )× 100%
( 4)串行口的自动流控制功能
UART0和 UART1不仅有完整的握手信号,而且有自动流控制功能,在寄存器 UMCONn中设置实现。自动流控制是利用信号 nRTS,nCTS来实现的。在接收数据时,只要接收 FIFO中有两个空字节就会使 nRTS有效,使对方发送数据;在发送数据时,只要 nCTS有效,就会发送数据。其实现过程如下图所示。
nRTS:请求对方发送 nCTS:清除请求发送注意:这种自动流控制应用于对方也是 UART设备,不能应用于 MODEM设备。
( 5)使用 FIFO进行收发主要是通过对 FIFO状态寄存器 UFSTATn的查询,确定进行收发。
使用 FIFO进行发送:
( 1)选择发送模式(中断或者 DMA模式)
( 2)查询对方是否有请求发送要求,由 MODEM状态寄存器 UMSTATn[0]给出,该位为 1,则有请求,再查询
FIFO状态寄存器 UFSTATn的数据满状态位是否为 1,如果不是 1,可以向发送缓冲寄存器 UTXHn写入发送的数据。
上面二者有一个或者两个都不满足,则不发送数据。
使用 FIFO进行接收(请求发送):
( 1)选择接收模式(中断或者 DMA模式)
( 2)请求发送。先要查询 FIFO状态寄存器 UFSTATn
的数据满状态位是否为 1,如果不是 1,则可以向对方发出
“请求发送信号”,对 MODEM控制寄存器 MCONn中的请求发送信号产生位置 1,使 UARTn发出 nRTS信号;如果
UFSTATn的数据满状态位是 1,则不能够请求发送数据。
第 15讲到此
( 6)不使用 FIFO进行收发主要是通过对收 /发状态寄存器 UTRSTATn的查询,确定进行收发。
数据发送:
( 1)选择发送模式(中断或者 DMA模式)
( 2)查询对方是否有请求发送要求,由 MODEM状态寄存器 UMSTATn[0]给出,该位为 1,则有请求,再查询发送 /接收状态寄存器 UTRSTATn[1]的“发送缓冲器空”状态位是否为 1,如果是 1,可以向发送缓冲寄存器 UTXHn写入发送的数据。
数据接收(请求发送):
( 1)选择接收模式(中断或者 DMA模式)
( 2)请求发送。先要查询发送 /接收状态寄存器
UTRSTATn[0]的接收缓冲器“数据就绪状态位”是否为 1,
如果是 1,需要先读取数据,然后再请求对方发送数据,方法是对 MODEM控制寄存器 MCONn中的请求发送信号产生位置 1,使 UARTn发出 nRTS信号。 如果 UFSTATn的数据满状态位是 1,则不能够请求发送数据
( 7)中断或 DMA请求每个 UART都有 3类,7种事件产生中断请求或者 DMA
请求。
7种中断请求事件是:溢出错误、奇偶校验错误、帧格式错误、传输中断信号、接收缓冲器数据就绪、发送缓冲器空、发送移位器空。
它们可以分成 3类:错误中断请求、接收中断请求、发送中断请求。
接收中断:
– 非 FIFO模式:当接收缓冲寄存器收到数据后,产生中断请求。
– FIFO模式,Rx FIFO中数据的数目达到了触发中断的水平,或者超时(在三帧时间内未收到任何数据),均产生中断请求。
发送中断:
– 非 FIFO模式:当发送缓冲器空时,产生中断请求。
– FIFO模式,Tx FIFO中数据的数目达到了触发中断的水平。
错误中断:
一共有 4种错误中断:溢出错误、奇偶检验错误、帧格式错误、传输中断信号错误。
– 非 FIFO模式:只要有任何一个错误出现,就会产生中断请求。
– FIFO模式,Rx FIFO中数据溢出,或者出现了帧格式错误、奇偶校验错误、传输中断信号错误,都会产生中断请求。
说明:
( 1)对于“奇偶校验错误、帧格式错误、传输中断信号错误”中断,在数据接收时就产生了,但是在数据接收产生时并非出现中断请求,而是在读出错误数据时才出现中断请求。
( 2)如果设置的是 DMA模式,而不是中断请求模式,
对于以上所出现的中断请求,应该是 DMA请求。
( 3)传输中断信号定义:在超出一帧的时间内,全部输出低电平。
( 8)循环检测模式
S3C2410X的每一个 UART都提供有检测功能,它是一种数据循环流动的自发、自收方式,数据从发送缓冲器传送到 TXD,数据不经过引脚输出,在内部将数据传到接收引脚 RXD,再传输到接收缓冲器。
三,UART专用寄存器
3个 UART,每个都有 11个专用寄存器,共 29个寄存器
Register Address R/W Description Reset Value
ULCONn 0x5000x000 R/W 线路控制寄存器 0x00
UCONn 0x5000x004 R/W 控制寄存器 0x00
UFCONn 0x5000x008 R/W FIFO控制寄存器 0x00
UMCONn 0x5000x00C R/W MODEM控制寄存器 * 0x00
UTRSTATn 0x5000x010 R 发送 /接收状态寄存器 0x6
UERSTATn 0x5000x014 R Rx错误状态寄存器 0x0
UFSTATn 0x5000x018 R FIFO状态寄存器 0x00
UMSTATn 0x5000x01C R MODEM状态寄存器 * 0x0
UTXHn 0x5000x020/23 W 发送缓冲寄存器 -
URXHn 0x5000x024/27 R 接收缓冲寄存器 -
UBRDIVn 0x5000x028 R/W 波特率除数寄存器 -
1、线路控制寄存器( ULCON)
Register Address R/W Description Reset Value
ULCON0 0x50000000 R/W UART0线路控制寄存器 0x00
ULCON1 0x50004000 R/W UART1线路控制寄存器 0x00
ULCON2 0x50008000 R/W UART2线路控制寄存器 0x00
字段名 位 意 义 初值
- 7 保 留 0
Infra-Red-Mode 6 红外模式设置位。 0:正常模式; 1:红外 0
Parity Mode 5:3
奇偶校验类型。 0xx:不校验;
100:奇校验; 101:偶校验;
110:强制为 1; 111:强制为 0
000
Num of stop bit 2 停止位个数。 0,1个; 1,2个 0
Word Length 1:0 数据位数目。 00,5位;01,6位; 10,7位; 11,8位 00
2、控制寄存器( UCON)
Register Address R/W Description Reset Value
UCON0 0x50000004 R/W UART0控制寄存器 0x00
UCON1 0x50004004 R/W UART1控制寄存器 0x00
UCON2 0x50008004 R/W UART2控制寄存器 0x00
2、控制寄存器( UCON)
字段名 位 意 义 初值
Clock Selection 10 波特率时钟源选择。 0,PCLK; 1,UCLK 0
Tx Int Type 9 发送中断请求类型。 0,脉冲型 ; 1:电平 0
Rx Int Type 8 接收中断请求类型。 0,脉冲型 ; 1:电平 0
Rx Time OV Ena 7 接收超时中断控制。 0:禁止; 1:允许 0
Rx ERR Int Ena 6 接收错误中断控制。 0:禁止; 1:允许 0
Loopback Mode 5 回送模式控制。 0 = 正常操作; 1 = 回送模式 0
Send Break Signal 4 发送暂停信号控制。0 = 正常传输; 1 = 发送暂停信号(全为 0) 0
Transmit Mode 3:2 发送 /接收 模式控制。 00:禁止 发送 /接收 ;
01:中断或查询模式; 10,UART0,2用
DMA0,DMA3; 11,UART1用 DMA1
00
Receive Mode 1:0 00
3,FIFO控制寄存器( UFCON)
Register Address R/W Description Reset Value
UFCON0 0x50000008 R/W UART0 FIFO控制寄存器 0x00
UFCON1 0x50004008 R/W UART1 FIFO控制寄存器 0x00
UFCON2 0x50008008 R/W UART2 FIFO控制寄存器 0x00
3,FIFO控制寄存器字段名 位 意 义 初值
Tx FIFO Tri
Leve 7:6
Tx FIFO的触发电平设置。 00:空;
01:减少到 4字节; 10:减少到 8字节;
11:减少到 12字节
00
lRx FIFO Tri
Level 5:4
Rx FIFO的触发电平设置。
00:增加到 4字节; 01:增加到 8字节;
10:增加到 12字节; 11,增加到 16字节
00
reserved 3 保 留 0
Tx FIFO Reset 2 Tx FIFO清除控制。 0:正常; 1:清零 0
Rx FIFO Reset 1 Rx FIFO清除控制。 0:正常; 1:清零 0
FIFO Enable 0 FIFO应用控制 。 0:失能; 1:使能 0
4,MODEM控制寄存器( UMCON)
Register Address R/W Description Reset Value
UMCON0 0x5000000C R/W UART0 FIFO控制寄存器 0x00
UMCON1 0x5000400C R/W UART1 FIFO控制寄存器 0x00
reserved 0x5000800C - 保留 -
字段名 位 意 义 初值
reserved 7:5 保留(为 0) 000
Auto Flow
Control (AFC) 4
自动流控制。
0:一般方式; 1:自动流控制 0
reserved 3:1 保留(为 0) 000
Request to Send 0 nRTS引脚信号控制。 0,nRTS 为高电平; 1,nRTS为低电平,有效。 0
5、发送 /接收状态寄存器( UTRSTAT)
Register Address R/W Description Reset Value
UTRSTAT0 0x50000010 R UART0状态寄存器 0x06
UTRSTAT1 0x50004010 R UART1状态寄存器 0x06
UTRSTAT2 0x50008010 R UART2状态寄存器 0x06
字段名 位 意 义 初值
Transmitter
empty 2
发送器空状态位。 0:发送器未空
1:发送器、发送缓冲器均空。 1
Transmit
buffer empty 1
发送缓冲器空状态位。 0:未空; 1:空在非 FIFO模式,激发中断或 DMA请求 1
Receive buffer
data ready 0
接收缓冲器状态位。 0:空; 1:有数据在非 FIFO模式,激发中断或 DMA请求 0
6,Rx错误状态寄存器( UERSTAT)
Register Address R/W Description Reset Value
UERSTAT0 0x50000014 R UART0Rx错误状态寄存器 0x0
UERSTAT1 0x50004014 R UART1Rx错误状态寄存器 0x0
UERSTAT2 0x50008014 R UART2Rx错误状态寄存器 0x0
字段名 位 意 义 初值
Break Detect 3 暂停信号状态。 0:无 暂停信号 ;1:收到 暂停信号 (产生中断请求 ) 0
Frame Error 2 帧错误状态位。 0:无帧错误;1:有帧错误 (产生中断请求 ) 0
Parity Error 1 奇偶校验错误状态。 0:无奇偶校验错1:有奇偶校验错误 (产生中断请求 ) 0
Overrun Error 0 溢出错误状态位。 0:无溢出错误;1:溢出错误 (产生中断请求 ) 0
7,FIFO状态寄存器( UFSTAT)
Register Address R/W Description Reset Value
UFSTAT0 0x50000018 R UART0 FIFO状态寄存器 0x00
UFSTAT1 0x50004018 R UART1 FIFO状态寄存器 0x00
UFSTAT2 0x50008018 R UART2 FIFO状态寄存器 0x00
字段名 位 意 义 初值
Reserved 15:10 保留(为 0) 0
Tx FIFO Full 9 发送 FIFO满状态。 0:未满; 1:满 0
Rx FIFO Full 8 接收 FIFO状态位。 0:未满; 1:满 0
Tx FIFO Count 7:4 发送 FIFO中数据的数目,字节单位。 0
Rx FIFO Count 3:0 接收 FIFO中数据的数目,字节单位。 0
8,MODEM状态寄存器( UMSTAT)
Register Address R/W Description Reset Value
UMSTAT0 0x5000001C R UART0 Modem状态寄存器 0x0
UMSTAT1 0x5000401C R UART1 Modem状态寄存器 0x0
Reserved 0x5000801C R 保留 -
字段名 位 意 义 初值
Reserved 3 保留(为 0) 0
Delta CTS 2 nCTS引脚信号自上次读后变化状态。0:未改变; 1:已改变。 0
Reserved 1 保留(为 0) 0
Clear to Send 0 nCTS引脚信号状态。 0,nCTS为高电平; 1,nCTS引脚为低电平,有效。 0
9、发送缓冲寄存器( UTxH)
Register Address R/W Description Reset Value
UTxH0 0x50000020(L)0x50000023(B) W(byte) UART0 发送缓冲寄存器 -
UTxH1 0x50004020(L)0x50004023(B) W (byte) UART1发送缓冲寄存器 -
UTxH2 0x50008020(L)0x50008023(B) W(byte) UART2发送缓冲寄存器 -
字段名 位 意 义 初值
Tx DATAn 7:0 UARTn发送的一个字节数据 -
10、接收缓冲寄存器( URxH)
Register Address R/W Description Reset Value
URxH0 0x50000024(L)0x50000027(B) R(byte) UART0 接收缓冲寄存器 0x00
URxH1 0x50004024(L)0x50004027(B) R (byte) UART1接收缓冲寄存器 0x00
URxH2 0x50008024(L)0x50008027(B) R(byte) UART2接收缓冲寄存器 0x00
字段名 位 意 义 初值
Rx DATAn 7:0 UARTn接收的一个字节数据。 -
11、波特率除数寄存器( UBRDIV)
Register Address R/W Description Reset Value
UBRDIV0 0x50000028 R/W UART0 波特率除数寄存器 -
UBRDIV1 0x50004028 R/W UART1 波特率除数寄存器 -
UBRDIV2 0x50008028 R/W UART2 波特率除数寄存器 -
字段名 位 意 义 初值
UBRDIV 15:0 波特率除数值。 UBRDIVn >0 -
四,UART应用举例编写一程序,使用 S3C2410X的 UART2进行串行数据收发,要求用脉冲请求中断的方式、使用收 /发 FIFO,8个数据位,1个停止位、不校验,波特率为 125kb/s。设 Pclk为
50MHz。(提示:主程序对 UART2初始化、引脚配置、中断初始化等,并进行一次发送;中断服务程序进行数据收发,标签清除中断请求标志和中断服务标志)
解:
( 1)计算波特率除数:
由公式,UBRDIVn=(int)( CLK/( f B*16))- 1
这里,Pclk=50MHz,f B = 125kb/s
计算得,UBRDIVn=25 -1=24
( 2) UART2控制寄存器:
线路控制寄存器,ULCON2=0b 0 000 0 11=0x03
含义:非红外、不校验,1个停止位,8个数据位控制寄存器,UCON2=0b 0 0 0 0 0 0 0 01 01=0x05
含义,选 Pclk、发 /收中断脉冲请求、关闭接收超时中断、
允许接收错误中断,不回送、不发送暂停信号、发 /收用中断方式。
FIFO控制寄存器,UFCON2=0b 10 01 0 0 0 1=0x91
含义,发 /收 FIFO选 8字节触发、保留位为 0、不复位发 /收
FIFO、使能 FIFO。
( 3)引脚配置需要设置 TxD2,RxD2,它们对应 GPH6,GPH7,在
GPH配置寄存器 GPHCON中的位置为:
0b 1 0 1 0 ** ** ** ** ** **
方法,GPHCON= GPHCON&~(0xF<<12)|(0xA<<12)
( 4)中断寄存器设置中断模式寄存器,INTMOD&=~(1<<15)
INT_UART2位于第 15位,将 UART2设置为 IRQ中断中断屏蔽寄存器,INTMSK&=~(1<<15)
中断优先级寄存器 PRIORITY:
不设置,使用固定优先级。
子中断屏蔽寄存器,INTSUBMSK&=~(7<<6)
INT_ERR2,INT_TXD2,INT_RXD2位于子中断屏蔽寄存器中的 8,7,6位。
( 5)在中断服务程序中对寄存器的操作清除中断标志寄存器相应位:
SRCPND&=~(1<<15)
清除中断服务寄存器相应位:
INTPND&=~(1<<15)
第 16讲到此
4.11 实时钟 RTC
主要内容概述结构寄存器应用举例重点:
( 1)控制寄存器、线路控制寄存器、
发 /收状态寄存器;
( 2) RTC应用
4.9 SPI接口主要内容概述结构寄存器应用举例重点:
( 1)控制寄存器、线路控制寄存器、
发 /收状态寄存器;
( 2) RTC应用一,SPI接口概述
SPI接口,SPI( Serial Peripheral Interface,串行外设接口 )是 Motorola公司开发的一种同步串行外设接口标准。
SPI接口信号,有 4个信号:数据发送、数据接收、时钟和片选。在时钟信号的作用下,发送的同时,接收对方发来的数据;也可以只发送、或者只接收。 SPI的波特率可以达到 20Mb/s以上。
S3C2410 ARM9有 2个 SPI接口,既可以作为主 SPI使用,
也可以作为从 SPI使用。
主要特点:
– 与 SPI 协议 (ver,2.11) 兼容;
– 8位发送移位寄存器;
– 8位接收移位寄存器;
– 8位预分频器;
– 具有查询、中断,DMA传输模式。
二,S3C2410 SPI结构与工作原理
1,SPI结构
SPI主要由 4部分构成:时钟分频器、发送移位寄存器、
接收移位寄存器、控制逻辑等。如下图所示。
2,SPI设备系统组成系统可以多个 SPI设备组成,任何一个设备都可以为主
SPI,但是任一时刻只能有一个主 SPI设备。如下图所示。

SPI
设备从 SPI 1 从 SPI 2 从 SPI n……
SCK MOSIMISO
nSS
3,SPI工作时序下图为时序的一部分。

( A)

( B)
Format CPOL和 CPHA 第一位数据输出 其它位数据输出 数据采样
A CPOL=0,CPHA=0 第 1个 SCK上升沿前 SCK下降沿 SCK上升沿
B CPOL=0,CPHA=1 第 1个 SCK上升沿 SCK上升沿 SCK下降沿
A CPOL=1,CPHA=0 第 1个 SCK下降沿前 SCK上升沿 SCK下降沿
B CPOL=1,CPHA=1 第 1个 SCK下降沿 SCK下降沿 SCK上升沿三,SPI专用寄存器
2个 UART,每个都有 6个专用寄存器,共 12个寄存器
Register Address R/W Description Reset Value
SPCONn 0x590000x0 R/W SPI控制寄存器 0x00
SPSTAn 0x590000x4 R SPI状态寄存器 0x01
SPPINn 0x590000x8 R/W SPI引脚控制寄存器 0x02
SPPREn 0x590000xC R/W SPI预分频寄存器 0x00
SPTDATn 0x590000x0 R/W SPI数据发送寄存器 0x00
SPRDATn 0x590000x4 R SPI数据接收寄存器 0x00
1,SPI控制寄存器( SPCON)
Register Address R/W Description Reset Value
SPCON0 0x59000000 R/W SPI0 控制寄存器 0x00
SPCON1 0x59000020 R/W SPI1 控制寄存器 0x00
字段名 位 意 义 初值
SMOD 6:5 SPI模式选择。 00:查询模式;01:中断; 10,DMA模式; 11:保留 00
ENSCK 4 时钟 SCK控制。 0:禁止; 1:允许。 0
MSTR 3 SPI主、从选择。 0:从 SPI; 1:主 SPI 0
CPOL 2 时钟极性选择。 0:高电平有效; 1:低 0
CPHA 1 时钟相位选择。 0:格式 A; 1:格式 B 0
Tx Auto Garbage
Data Mode
Enable (TAGD)
0 仅接收模式控制。 0:正常收发;1:仅接收(此时 (自动 )发送任意数据) 0
2,SPI状态寄存器( SPSTA)
Register Address R/W Description Reset Value
SPSTA0 0x59000004 R SPI0 状态寄存器 0x01
SPSTA1 0x59000024 R SPI1 状态寄存器 0x01
字段名 位 意 义 初值
reserved 7:3 保 留
Data Collision Error
Flag (DCOL) 2
数据写碰撞 (正在发送时写 SPTDAT)
错误标志。 0:无错; 1:碰撞错误 0
Multi Master Error
Flag (MULF) 1
多主 SPI错误标志。
0:无错; 1:多主 SPI错误。 0
Transfer Ready
Flag (REDY) 0
收发就绪 标志 。
0:未就绪; 1:收或发就绪。
写 SPTDAT后该位自动清 0
1
3,SPI引脚控制寄存器( SPPIN)
Register Address R/W Description Reset Value
SPPIN0 0x59000008 R/W SPI0 引脚控制寄存器 0x02
SPPIN1 0x59000028 R/W SPI1 引脚控制寄存器 0x02
字段名 位 意 义 初值
reserved 7:3 保 留
Multi Master error
detect Enable
(ENMUL)
2
引脚多主 SPI错误测试设置。
0:禁测; 1:允许多主错误测试。
测试结果在 SPSTAn中的 MULF位
0
reserved 1 该位应该为 1 1
Master Out Keep
(KEEP) 0
1字节发完后 MOSI的控制与释放
0:释放; 1:保持 MOSI原电平 0
4,SPI预分频寄存器( SPPRE)
Register Address R/W Description Reset Value
SPPRE0 0x5900000C R/W SPI0 预分频寄存器 0x00
SPPRE1 0x5900002C R/W SPI1 预分频寄存器 0x00
字段名 位 意 义 初值
Prescaler value 7:0 预分频值波特率计算:
Baud tate = Pclk/2/( Prescaler value + 1 )
提示,SPI的波特率必须 <25MHz。
5,SPI发送数据寄存器( SPTDAT)
Register Address R/W Description Reset Value
SPTDAT0 0x59000010 R/W SPI0 发送数据寄存器 0x00
SPTDAT1 0x59000030 R/W SPI1 发送数据寄存器 0x00
字段名 位 意 义 初值
Tx data 7:0 SPI所发送的 8位数据 0x00
提示,在同时双向传输时,从 SPI设备必须先把所发送的数据写到“发送数据寄存器” SPTDATn中,然后再写主
SPI设备的“发送数据寄存器” SPTDATn。
6,SPI接收数据寄存器( SPRDAT)
Register Address R/W Description Reset Value
SPRDAT0 0x59000014 R SPI0 接收数据寄存器 0x00
SPRDAT1 0x59000034 R SPI1 接收数据寄存器 0x00
字段名 位 意 义 初值
Tx data 7:0 SPI所接收的 8位数据 0x00
提示,在同时双向传输时,启动发送后,应该先读取数据,然后再发送数据。
四,SPI应用方法
1、一般操作步骤如果 SPI控制寄存器 SPCON已经设置过,则写数据发送寄存器 SPTDAT启动发送。对 SPI卡操作步骤如下:
( 1)设置预分频寄存器 SPPRE;
( 2)设置控制寄存器 SPCON;
( 3)设置一个 GPIO引脚,使选中的 MMC或 SD卡的片选信号 nSS有效;
( 4)向数据发送寄存器 SPTDAT写 10次 0xFF,对
MMC或 SD卡初始化;
( 5)发送数据,先要查询 Tx/Rx REDY是否为 1,然后向数据发送寄存器 SPTDAT写数据;
( 6)接收数据:
一般方式( 同时收发,TAGD=0):向数据发送寄存器 SPTDAT写 0xFF,查询并确认 Rx REDY为 1,然后从数据接收寄存器中读取数据。
仅接收方式 ( TAGD=1):并确认 Rx REDY为 1,然后从数据接收寄存器中读取数据。读取数据的同时启动一次发送。
( 7)设置 GPIO引脚,使选中的 MMC或 SD卡的片选信号 nSS无效,结束传输。
2,DMA模式发送对 SPI的 DMA模式发送操作步骤如下:
( 1)设置预分频寄存器 SPPRE;
( 2)设置控制寄存器 SPCON,并且设为 DMA
模式;
( 3) SPI请求 DMA服务;
( 4) DMA发送 1字节数据给 SPI;
( 5) SPI给卡发送数据;
( 6)返回到( 3),直到 DMA的计数器为 0;
3,DMA模式接收对 SPI的 DMA模式接收操作步骤如下:
( 1)设置预分频寄存器 SPPRE;
( 2)设置控制寄存器 SPCON,并且设为 DMA模式;
( 3)将 SPI设置为仅接收模式,设置引脚控制寄存器
SPPIN中的 TAGD为 1;
( 4)当 SPI从卡接收到 1字节数据后,请求 DMA服务;
( 5) DMA从 SPI读取数据;
( 6) SPI自动启动一次无用数据 (0xFF)的发送;
( 7)返回到( 4),直到 DMA的计数器为 0;
( 8)设置控制寄存器 SPCON,改设为其它模式,如查询、中断模式;
( 9)如果 Rx REDY被设置为 1,则需要读取最后接收的数据。
注意,DMA第 1次接收的是数据的无效的。
4,SPI从设备以格式 B接收的问题当 SPI从设备以格式 B接收,DMA的读信号比数据接收的锁存信号早,在数据未锁存之前,读信号就出现了。因此使用 DMA模式不能够正确接收。如下图所示。
对于中断和查询模式,可以延时半个时钟,能够正确读取数据。
五,SPI接口应用举例把 S3C2410的 SPI0设为主设备,同时把 SPI1设为从设备,
将二者的 MOSI,MISO交叉相连,二者的 SCL对连,用
GPG0引脚控制 nSS1。编写程序,SPI0用中断方式,SPI1
用查询方式,采用格式 B,1Mb/s的波特率,SPI0和 SPI1在发送的同时接收数据,双方都发送、接收 100个字节的数据。
设系统 Pclk=50MHz。
解:
( 1) SPI计算预分频值:
由 Baud tate = Pclk/2/( Prescaler value + 1 )
Prescaler value = Pclk/2/Baud tate - 1=24
( 2) SPI控制寄存器值
SPCON0=0b 01 1 1 0 1 0 = 0x3A
含义:中断模式、使用时钟、主设备,0极性、格式 B、
一般收发传输。
SPCON1=0b 01 0 0 0 1 0 = 0x22
含义:中断、不用时钟、从设备,0极性、格式 B、收发
( 3) SPI引脚控制寄存器
SPPIN0=0b 0 1 1 = 0x03
含义:不检测多主错误、保留 1、输出引脚保持输出。
SPPIN1=0b 0 1 1 = 0x03
( 4) SPI引脚配置
GPECON=0b ** ** 10 10 10 ** ……
先清 0,&~(0xFC<<20);再设置,|(0xA8<<20)
GPGCON=0b …… 11 11 11 ** 11 11 ** 01
先清 0,&~0xFCF3);再设置,|(0xFCF1)
SPI0引脚 29 28 27 26 25 24 23 22 21 20
GPECON * * 1 0 1 0 1 0 * *
CLK0 MOSI0 MISO0
SPI0引脚 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
GPGCON 1 1 1 1 1 1 * * 1 1 1 1 * * 0 1
CLK1 MOSI1MISO1 * nSS1 nSS0 * 输出
( 4)中断寄存器设置中断模式寄存器:
INTMOD &=~(1<<22)
INT_UART2位于第 15位,将 UART2设置为 IRQ中断中断屏蔽寄存器:
INTMSK&=~ (1<<22)
中断优先级寄存器 PRIORITY:
不设置,用复位值 0x7F,优先级为循环方式。
( 5)在中断服务程序中对寄存器的操作清除中断标志寄存器相应位:
SRCPND&=~ (1<<22)
清除中断服务寄存器相应位:
INTPND&=~ (1<<22)
#include "2410header.h"
void Main(void)
{
sysinit();
while(1)
{
Uart_Printf("\n 2410 Board SPI TEST!\n");
Test_SPI( );
}
}
char tran_data0[100],rec_data0[100],num0=0;
char tran_data1[100],rec_data1[100],num1=0;
void Test_SPI(void)
{
rSPPRE0=24; rSPPRE1=24;
rSPCON0=0x3A;
rSPCON1=0x22;
rSPPIN0=0x03;
rSPPIN1=0x03;
rGPECON = rGPECON & ~(0xFC<<20)|(0xa8<<20);
rGPGCON = rGPGCON & ~0xFCF3 | 0xFCF1;
rGPGDAT = rGPGCON & ~1; //使 GPG0输出 0
INTMOD &=~(1<<22);
INTMSK &=~(1<<22);
pISR_SPI0=(U32)spi0_int;
rSPTDAT1=tan_data1[num1];
rSPTDAT0=tan_data0[num0];
for(;num1<100;)
{
while(rSPSTA1&1==0);
INTMSK |=(1<<22); //关闭 SPI0中断
rec_data[num1] = rSPRDAT1;
num1++;
if(num1<100)
rSPTDAT1=tan_data1[num1];
INTMSK &=~(1<<22); //打开 SPI0中断
}
INTMSK |=(1<<22); //关闭 SPI0中断
rGPGDAT |= 1; //使 GPG0输出 1,nSS1为高
}
void _irq spi_int(void)
{
rec_data[num0]=rSPRDAT0;
num0++;
if(num<100)
rSPTDAT0 = tran_data[num0];
SRCPND &=~ (1<<22); //清除中断标志寄存器相应位
INTPND &=~ (1<<22); //清除中断服务寄存器相应位
}
#define rSPTDAT0 (*(volatile unsigned *)0x59000010) //SPI0 Tx data
#define rSPRDAT0 (*(volatile unsigned *)0x59000014) //SPI0 Rx data
#define rSPTDAT1 (*(volatile unsigned *)0x59000030) //SPI1 Tx data
#define rSPRDAT1 (*(volatile unsigned *)0x59000034) //SPI1 Rx data