You are on page 1of 118

第3章 32 Bit RISC

微处理器 S3C2410A
 3.1 S3C2410A 简介
 3.2 S3C2410A 存储器控制器
 3.3 复位、时钟和电源管理
 3.4 S3C2410A 的 I/O 口
 3.5 S3C2410A 的中断控制
 3.6 S3C2410A 的 DMA 控制
3.1 S3C2410A 简介
 3.1.1 S3C2410A 内部结构

S3C2410 是 Samsung 公司推出的 16/32 位


RISC 处理器,
主要面向高性价比、低功耗的手持设备应用。
S3C2410 有 S3C2410X 和 S3C2410A 两个型

A 型是 X 型的改进型,具有更好的性能和更低的功耗

 S3C2410A 集成的片上功能包括:

● 内核电压 1.8V/2.0V ,存储器电压 3.3V ,外部 I/O 电压 3.3V ;


● 具有 16KB 的 I-Cache 和 16KB 的 D-Cache 以及 MMU ;
● 外部存储器控制器( SDRAM 控制和片选逻辑);
● LCD 控制器(支持 4K 彩色 STN 和 256KTFT )提供 1 通道 LCD 专用 DMA ;
● 4 通道 DMA 并有外部请求引脚端;
● 3 通道 UART ( IrDAl.0 , 16 字节 Tx FIFO 和 16 字节 Rx FIFO ) /2 通道 SPI ;
● 1 通道多主设 I2C 总线和 1 通道 I2S 总线控制器;
● 版本 1.0 SD 主接口和 2.11 兼容版 MMC 卡协议;
 S3C2410A 集成的片上功能包括:

● 2 个 USB 主设接口 /1 个 USB 从设接口(版本 1.1 );


● 4 通道 PWM 定时器和 1 通道内部定时器;
● 看门狗定时器;
● 117 位通用 I/O 口和 24 通道外部中断源;
● 电源控制模式有正常、慢速、空闲和电源关断 4 种模式;
● 8 通道 10 位 ADC 和触摸屏接口;
● 具有日历功能的 RTC;
● 使用 PLL 的片上时钟发生器。







S3C2410A
 3.1.2 S3C2410A 的技术特点

1 .体系结构
● ARM920T CPU 内核, 16/32 位 RISC 体系结构和强大的指令集;
● 增强的 ARM 体系结构 MMU ,支持 WinCE 、 EPOC 32 和 Linux ;
● 使用指令 Cache 、数据 Cache 、写缓冲器和物理地址 TAG RAM
(标记随机存储器)减少主存储器带宽和反应时间对性能的影响;
● 支持 ARM 调试体系结构;
● 先进的微控制器总线体系结构( AMBA : AHB/APB )( P57 )
2. 存储系统管理器
● 支持小/大端方式
● 8 个存储器 bank ,每 bank 128 MB (总共 1GB )
● 可编程 8/16/32 位数据总线宽度及可编程的访问周期
● 支持掉电时的 SDRAM 自刷新模式
● 支持各种类型的 ROM 启动( booting ),如 NOR/NAND Flash 和 EEPROM
3 . NAND Flash Boot Loader (启动装载)
● 支持从 NAND Flash 存储器的启动,启动之后 NAND 存储器仍然作为外
部存储器使用。

4 . Cache 存储器
● I-Cache ( 16 KB )和 D-Cache ( 16 KB )。
● 每行 8 字长度,其中每行带有一个有效位和两个脏位( dirty bits )

● 采用伪随机数或循环替换算法。
● 采用写直达( Write-through )或写回( Write-back ) Cache 操作
来更新主存储器。
● 写缓冲器可以保存 16 个字的数据值和 4 个地址值。
5 .时钟和电源管理

● 片上 MPLL 和 UPLL :
---UPLL 产生用于 USB 主机/设备操作的时钟;
---MPLL 产生操作 MCU 的时钟,频率最高可达 266 MHz ( 2.0V 内核电压)。
● 通过软件可以有选择地为每个功能模块提供时钟。
● 电源模式包括正常、慢速、空闲和掉电模式:
--- 正常模式为正常运行模式;
--- 慢速模式为不加 PLL 的低时钟频率模式;
--- 空闲模式只停止 CPU 的时钟;
--- 掉电模式切断所有外设和内核的电源。
● 可以通过 EINT[15:0] 或 RTC 报警中断从掉电模式中唤醒处理器。
6 .中断控制器

● 56 个中断源( 1 个看门狗定时器、 5 个定时器、 9 个


UART 、 24 个外部中断、 4 个 DMA 、 2 个 RTC 、 2 个 ADC 、 1 个
I2C 、 2 个 SPI 、 1 个 SDI 、 2 个 USB 、 2 个 LCD 和 1 个电池故障)

● 支持电平/边沿触发模式的外部中断源;
● 可编程的电平/边沿触发极性;
● 为紧急中断请求提供快速中断服务( FIQ )支持。
7 DMA 控制器
● 4 通道的 DMA 控制器;
● 支持存储器到存储器、 I/O 到存储器、存储器到 I/O 和 I/O 到
I/O 的传送;
● 采用突发传送模式提高传送速率。
8 .具有脉冲宽度调制( PWM )的定时器
● 具有 PWM 功能的 4 通道 16 位定时器,可基于 DMA 或中断操
作的 1 通道 16 位 内部定时器;
● 可编程的占空比周期、频率和极性;
● 能产生死区;
● 支持外部时钟源
9 . RTC (实时时钟)
● 完整的时钟特性:秒、分、时、日期、星期、月和年;
● 工作频率 32.768 kHz ;
● 具有报警中断;
● 具有时钟滴答中断。

10 .看门狗定时器
● 16 位看门狗定时器;
● 定时器溢出时产生中断请求或系统复位。
11 .通用 I/O 口
● 117 个多路复用的 I/O 口;
● 其中 24 个外部中断口( F 口 8 个 +G 口 16 个)。

12. UART
● 3 通道 UART ,可以基于 DMA 模式或中断模式操作;
● 支持 5 位、 6 位、 7 位或者 8 位串行数据发送/接收( Tx/Rx );
● 支持外部时钟作为 UART 的运行时钟( UEXTCLK );
● 波特率可编程;
● 支持 IrDA 1.0 ;
● 支持回环( Loopback )测试模式;
● 每个通道内部都具有 16 字节的发送 FIFO 和 16 字节的接收 FIFO 。

13 . A / D 转换和触摸屏接口
● 8 通道 10 位分辨率多路复用 ADC ;
● 转换速率最大为 500 KSPS ( Kilo Samples Per Second ,每秒采样千
点)。
11 .通用 I/O 口
● 117 个多路复用的 I/O 口;
● 其中 24 个外部中断口( F 口 8 个 +G 口 16 个)。

12 . A / D 转换和触摸屏接口
● 8 通道 10 位分辨率多路复用 ADC ;
● 转换速率最大为 500 KSPS ( Kilo Samples Per Second ,每秒
采样千点)。
14 . LCD 控制器 STN LCD ( Super Twisted Nematic 超扭曲向列型 )显示
特性
● 支持 3 种类型 STN LCD 显示屏: 4 位双扫描、 4 位单扫描和 8 位单扫描显示类型;
● 支持单色模式、 4 级灰度、 16 级灰度、 256 彩色和 4 096 彩色;
● 支持多种屏幕尺寸,如: 640×480 , 320×240 , 160×160 ;
● 最大虚拟屏幕大小是 4 MB ;
● 在 256 彩色模式下支持的最大虚拟屏幕尺寸是: 4096×1024 , 2048×2048 ,
1024×4096 或者其它尺寸。

15. TFT ( Thin Film Transistor 薄膜场效应晶体管)显示特性


● 彩色 TFT 支持 1 、 2 、 4 或 8bpp ( bit per pixel ,每像素所占位数)调色显示

● 支持 16bpp 无调色真彩显示;
● 在 24bpp 模式下支持最大 16M 彩色 TFT ;
● 支持多种屏幕尺寸,如: 640×480 , 320×320 , 160×160 或者其它尺寸;
● 最大虚拟屏大小是 4 MB ;
● 在 64 彩色模式下支持的最大虚拟屏幕尺寸是: 2048×1024 或者其它尺寸。
16 . I2C 总线接口
● 1 通道多主机 I2C 总线;
● 串行、 8 位、双向数据传送,在标准模式下数据传送速率可达 100kb/s
,在快速模式下可达 400kb/s 。

17 . I2S 总线接口
● 1 通道音频 I2S 总线接口,可基于 DMA 方式操作;
● 串行,每通道 8/16 位数据传输;
● 发送和接收( Tx/Rx )具备 128 字节 FIFO ( 64 字节发送 FIFO + 64 字
节接收 FIFO );
● 支持 I2S 格式和 MSB-justified 数据格式。
18 . USB 主设备
● 2 个 USB 主设接口;
● 遵从 OHCI Revl.0 标准;
● 兼容 USB Verl.1 标准。

19 . USB 从设备
● 1 个 USB 从设接口;
● 具备 5 个 USB 设备端口;
● 兼容 USB Verl.1 标准。

20 . SD 主机接口
● 兼容 SD 存储卡协议 1.0 版;
● 兼容 SDIO 卡协议 1.0 版;
● 发送和接收采用字节 FIFO ;
● 基于 DMA 或中断模式操作;
● 兼容 MMC 卡协议 2.11 版。
21 . SPI 接口
● 兼容 2 通道 SPI 协议 2.11 版;
● 发送和接收采用 2 字节的移位寄存器;
● 基于 DMA 或中断模式操作。

22 .工作电压
● 内核电压: 1.8V ,最高工作频率 200 MHz ( S3C2410A-20 );
2.0 V ,最高工作频率 266 MHz ( S3C2410A-26 )。
● 存储器和 I/O 电压: 3.3 V 。

23 .封装
● 采用 272-FBGA ( Fine-Pitch Ball Grid Array 细间距球栅阵列)封装。

返回
3.2 S3C2410A 存储器控制器
3.2.1 S3C2410A 的存储器控制器特性

提供访问外部存储器所需要的存储器控制信号,特性如下:

● 支持小/大端(通过软件选择)。
● 总共有 8 个存储器 bank ( bank0 ~ bank7 ),每个 bank 128 MB (共 1 GB ):
---- 其中 6 个用于 ROM , SRAM 等;
----- 剩下 2 个用于 ROM , SRAM , SDRAM 等
● 除 bank0 只能是 16/32 位宽之外,其他 bank 都具有可编程位宽
( 8/16/32 位)。
● 7 个固定的存储器 bank ( bank0 ~ bank6 )起始地址。
● 最后一个 bank ( bank7 )的起始地址是可调整的。
● 最后两个 bank ( bank6 和 bank7 )的大小是可编程的。
● 所有 bank 的访问周期可编程。
● 总线访问周期可以通过插入外部等待来扩展。
● 支持 SDRAM 的自刷新和掉电模式。
3.2.2 S3C2410A 的存储器映射

复位后, S3C2410A 存储器的映射情况如下图所示


[ 不使用 NAND Flash 作为启动 ROM] [ 使用 NAND Flash
作为启动 ROM]
注意:① SROM 表示是 ROM 或 SRAM 类型的存储器;
②SFR 指特殊功能寄存器。
bank 6 和 bank 7 地址

注: bank 6 和 bank 7 必须具有相同的存储器大小。

返回
3.3 复位、时钟和电源管理

1 .复位电路

 复位电路主要完成系统的上电复位和系统在运行时用户的按键复位
功能。

 nReset 为低时,系统开始初始化设置;低位要保证足够长的时间;
 nReset 为高时,系统开始执行指令。

 复位电路可由 RC 电路构成,也可以使用专门电路。
专门的系统监视复位芯片 IMP811S

通过手动控制系统的复位。
还可以实时监控系统的电源。系统电源低于系统阈值( 2.9V ),即进行复位

专用芯片 IMP811S 复位电路


简单的 RC 复位电路

 系统上电时,通过电阻 R108 向电容 C162 充电,


 当 C162 两端的电压未达到高电平的门限电压时,
nRESET 端输出为低电平,系统处于复位状态;
 当 C162 两端的电压达到高电平的门限电压时,
nRESET 端输出为高电平,系统进入正常工作状态。
 当用户按下按钮 RESET 时, C162 两端的电荷被放掉,
 nRESET 端输出为低电平,系统进入复位状态;
 C162 充电, nRESET 输出低电平,系统进入工作状态。

两级非门电路用于按钮去抖动和波形整形;
nRESET 端的输出状态与 RESET 端相反;
通过调整 R108 和 C162 的参数,可调整复位状态的时
间。
2 .时钟电路
 在 S3C2410A 中的时钟控制逻辑能够产生 :
(1) CPU 所需的 FCLK 时钟信号
(2) AHB 总线外围设备所需的 HCLK 时钟信号
(3) APB 总线外围设备所需的 PCLK 时钟信号。
( P57 ARM AMBA 接口)

 S3C2410A 有两个锁相环( Phase Locked Loops , PLL ),


 MPLL: 用于 FCLK , HCLK 和 PCLK ,
 UPLL: 用于 USB 模块( 48 MHz )。
时钟控制逻辑可以在不需要 PLL 的情况下产生慢速时钟,并且可以通
过软件来控制时钟与每个外围模块是连接还是断开,从而降低功耗。
S3C2410A 微处理器的主时钟可以由外部时钟源提供,也可以由外部振荡器
提供,采用哪种方式通过引脚 OM[3:2] 来进行选择。

● OM[3:2]=00 时, MPLL 和 UPLL 的时钟均选择外部晶体振荡器;


● OM[3:2]=0l 时, MPLL 的时钟选择外部晶体振荡器; UPLL 选择外部时钟源;
● OM[3:2]=10 时, MPLL 的时钟选择外部时钟源; UPLL 选择外部晶体振荡器;
● OM[3:2]=11 时, MPLL 和 UPLL 的时钟均选择外部时钟源。

OM[3:2] 均接地的方式。系统时钟源直接采用外部晶振,内部 PLL 电路


可以调整系统时钟,使系统运行速度更快。
S3C2410X 微处理器外部时钟电路

外部振荡器由 12MHz 晶振和 2 个 15pF 的微调电容组成。


振荡电路输出接到 S3C2410X 微处理器的 XTIPLL 脚,输入由 XTOPLL 提供。
由于片内的 PLL 电路兼有频率放大和信号提纯的功能,因此,系统可以以较低的外部
时钟信号获得较高的工作频率,从而降低因高速开关时钟所造成的高频噪声。
3 .电源电路
S3C2410A 的电源管理模块具有 :
正常模式、慢速模式、空闲模式和掉电模式 4 种有效模式。

正常模式,为 CPU 和 S3C2410A 中的所有外围设备提供时钟,功耗达到最大。


可以通过软件来控制外设的操作。

慢速模式又称无 PLL 模式。与正常模式不同,在慢速模式不使用 PLL ,而使用


外部时钟直接作为 FCLK 。功耗大小仅取决外部时钟的频率与 PLL 无关。

空闲模式,只断开 CPU 内核的时钟( FCLK ),仍为所有外设提供时钟。空闲模


式降低了由 CPU 内核产生的功耗。中断请求可以从空闲模式唤醒 CPU 。

掉电模式,断开内部电源。除唤醒逻辑以外, CPU 和内部逻辑都不会产生功耗。


激活需要两个独立电源:为唤醒逻辑供电;为其他内部逻辑供电,电源开 / 关可以
控制。在掉电模式下,第二个电源将关断。通过 EINT[15:0] 或 RTC 报警中断
可以从掉电模式唤醒 S3C2410A 。
S3C2410A 的电源引脚分析:

 VDDalive 引脚给处理器复位模块和端口寄存器提供 1.8V 电压;


 VDDi 和 VDDiarm 为处理器内核提供 1.8V 电压;
 VDDi_MPLL 为 MPLL 提供 1.8V 模拟电源和数字电源;
 VDDi_UPLL 为 UPLL 提供 1.8V 模拟电源和数字电源;
 VDDOP 和 VDDMOP 分别为处理器端口和存储器端口提供 3.3V 电压;
 VDD_ADC 为处理器内的 ADC 系统提供 3.3V 电压;
 VDDRTC 为时钟电路提供 1.8V 电压,该电压在系统掉电后仍需要维持。
( a ) 3.3V 电源电路

( b ) 1.8V 电源电路(电阻 R203 = 100K , R204 = 47.5K ,阻值需要修改

 5V 输入电压经过 DC-DC 转换器可完成 5V 到 3.3V 和 1.8V 的电压转换。


 RTC 所需电压由 1.8V 电源和后备电源共同提供。
系统工作时 1.8V 电压有效;系统掉电时后备电池开始工作。 返回
3.4 S3C2410A 的 I/O 口
 3.4.1 S3C2410A 的 I / O 口配置

S3C2410A 共有 117 个多功能复用输入 / 输出端口( I/O 口),分为端口 A ~端口 H 。

 端口 A ( GPA )是 1 个 23 位输出口;
 端口 B ( GPB )和端口 H ( GPH )是 2 个 11 位 I/O 口;
 端口 C ( GPC )、端口 D ( GPD )、端口 E ( GPE )和端口 G ( GPG )是 4 个 16 位 I/O 口;
 端口 F ( GPF )是 1 个 8 位 I/O 口。

 每个 I/O 口均可以通过软件进行配置。

 端口 A 除了作为功能口外,只能够作为输出口使用。
S3C2410A 的端口 A I/O 口配置情况

端口 A 可选择的引脚端功能

GPA22 输出 nFCE –
GPA21 输出 nRSTOUT –
GPA20 输出 nFRE –
GPA19 输出 nFWE –
GPA18 输出 ALE –
GPA17 输出 CLE –
GPA16 ~ GPA12 输出 nGCS5 ~ nGCS1 –
输出
GPA11 ~ GPA1 ADDR26 ~ ADDR16 –

GPA0 输出 ADDR0 –
S3C2410A 的端口 B I/O 口配置情况

端口 B 可选择的引脚端功能

GPB10 输入 / 输出 nXDREQ0 –

GPB9 输入 / 输出 nXDACK0 –

GPB8 输入 / 输出 nXDREQ1 –

GPB7 输入 / 输出 nXDACK1 –
GPB6 输入 / 输出 nXBREQ –

GPB5 输入 / 输出 nXBACK –

GPB4 输入 / 输出 TCLK0 –

GPB3 ~ GPB0 输入 / 输出 TOUT3 ~ TOUT0 –


S3C2410A 的端口 C I/O 口配置情况

端口 C 可选择的引脚端功能

GPC15 ~ GPC8 输入 / 输出 VD7 ~ VD0 –

GPC7 ~ GPC5 输入 / 输出 LCDVF2 ~ LCDVF0 –

GPC4 输入 / 输出 VM –

GPC3 输入 / 输出 VFRAME –

GPC2 输入 / 输出 VLINE –

GPC1 输入 / 输出 VCLK –
输入 / 输出
GPC0 LEND –
S3C2410A 的端口 D I/O 口配置情况

端口 D 可选择的引脚端功能

输入 / 输出
GPD15 VD23 nSS0

输入 / 输出
GPD14 VD22 nSS1

输入 / 输出
GPD13 ~ GPD0 VD21 ~ VD8 –
S3C2410A 的端口 E 、 F I/O 口配置情况

端口 E 可选择的引脚端功能

GPE15 输入 / 输出 IICSDA –

GPE14 输入 / 输出 IICSCL –

GPE13 输入 / 输出 SPICLK0 –

GPE12 输入 / 输出 SPIMOSI0 –

GPE11 输入 / 输出 SPIMISO0 –

GPE10 ~ GPE7 输入 / 输出 SDDAT3 ~ SDDAT0 –

GPE6 输入 / 输出 SDCMD –

GPE5 输入 / 输出 SDCLK –
GPE4 输入 / 输出 I2SSDO I2SSDI

GPE3 输入 / 输出 I2SSDI nSS0

GPE2 输入 / 输出 CDCLK –

GPE1 输入 / 输出 I2SSCLK –
输入 / 输出
GPE0 I2SLRCK –

端口 F
输入 / 输出
GPF7 ~ GPF0 EINT7 ~ EINT0 –
S3C2410A 的端口 G I/O 口配置情况

端口 G 可选择的引脚端功能

GPG15 输入 / 输出 EINT23 nYPON

GPG14 输入 / 输出 EINT22 YMON

GPG13 输入 / 输出 EINT21 nXPON

GPG12 输入 / 输出 EINT20 XMON

GPG11 输入 / 输出 EINT19 TCLK1

GPG10 ~ GPG8 输入 / 输出 EINT18 ~ EINT16 –

GPG7 输入 / 输出 EINT15 SPICLK1


GPG6 输入 / 输出 EINT14 SPIMOSI1

GPG5 输入 / 输出 EINT13 SPIMISO1

GPG4 输入 / 输出 EINT12 LCD_PWREN

GPG3 输入 / 输出 EINT11 nSS1

GPG2 输入 / 输出 EINT10 nSS0

GPG1 输入 / 输出 EINT9 –

输入 / 输出
GPG0 EINT8 –
S3C2410A 的端口 H I/O 口配置情况

端口 H 可选择的引脚端功能
GPH10 输入 / 输出 CLKOUT1 –
GPH9 输入 / 输出 CLKOUT0 –
GPH8 输入 / 输出 UEXTCLK –
GPH7 输入 / 输出 RXD2 nCTS1
GPH6 输入 / 输出 TXD2 nRTS1
GPH5 输入 / 输出 RXD1 –
GPH4 输入 / 输出 TXD1 –
GPH3 输入 / 输出 RXD0 –
GPH2 输入 / 输出 TXD0 –
GPH1 输入 / 输出 nRTS0 –
GPH0 输入 / 输出 nCTS0 –
3.4.2 S3C2410A 的 I / O 口寄存器

 大多数引脚复用,需要定义其功能。

 与配置 I/O 口相关的寄存器包括:

 端口控制寄存器( GPACON ~ GPHCON )


 端口数据寄存器( GPADAT ~ GPHDAT )
 端口上拉寄存器( GPBUP ~ GPHUP )、
 杂项控制寄存器
 外部中断控制寄存器( EXTINTN )等。

在掉电模式,如果 GPF0 ~ GPF7 和 GPG0 ~ GPG7 用作为


唤醒信号,那么这些端口必须配置为中断模式。
 如果端口配置为输出口,数据可以写入到端口数据寄存器( GPnDAT )的相应位;如
果端口配置为输入口,可以从端口数据寄存器( GPnDAT )的相应位中读出数据。

 端口上拉寄存器用于控制每组端口的上拉电阻为使能 / 不使能。
如果相应位设置为 0 ,则表示该引脚的上拉电阻使能;
为 1 ,则表示该引脚的上拉电阻不使能。

 杂项控制寄存器用于控制数据端口的
上拉电阻、高阻状态、 USB Pad 和 CLKOUT 的选择。
 24 个外部中断通过不同的信号方式被请求。
 EXTINTn 寄存器用于配置这些信号对于外部中断请求采用的是低电平触
发、高电平触发、下降沿触发、上升沿触发还是双边沿触发。
 所有 GPIO 寄存器的值在掉电模式下都会被保存。
 外部中断屏蔽寄存器 EINTMASK 不能阻止从掉电模式唤醒,但是如果
EINTMASK 正在屏蔽的是 EINT[15:4 ]中的某位,则可以实现唤醒,不过
寄存器 SRCPND 的位 EINT4 和 EINT8 23 在刚刚唤醒后不能设置为 1

 相关寄存器的设置分别描述如下:
端口 A ( 23 位)控制寄存器

读/
寄存器 地址 描述 复位值

配置端口 A 引脚端,使用位
[22:0] 。
GPACON 0x56000000 R/W 0x7FFFFF
设置为 0 :输出引脚端;
设置为 1 :第 2 功能

端口 A 数据寄存器,使用位
GPADAT 0x56000004 R/W 未定义
[22:0]
未定义
保留 0x56000008 – 保留

未定义
保留 0x5600000C – 保留
端口 B ( 11 位)控制寄存器

寄存器 地址 读 / 写 描述 复位值
配置端口 B 引脚端,使用位
[21:0] ,分别对端口 B 的 11
GPBCON 0x56000010 R/W 个引脚端进行配置。 0x0
00 :输入; 01 :输出;
10 :第 2 功能; 11 :保留
端口 B 数据寄存器,使用位
GPBDAT 0x56000014 R/W 未定义
[10:0]
端口 B 上拉电阻不使能寄存器,
GPBUP 0x56000018 R/W 使用位 [10:0] 。 0x0
0 :使能; 1 :不使能
保留 0x5600001C – 保留 未定义
端口 C ( 16 位)控制寄存器

寄存器 地址 读 / 写 描述 复位值
配置端口 C 引脚端,使用位
[31:0] ,分别对端口 C 的
16 个引脚端进行配置。
GPCCON 0x56000020 R/W 0x0
00 :输入; 01 :输

10 :第 2 功能; 11 :保留
端口 C 数据寄存器,使用位
GPCDAT 0x56000024 R/W 未定义
[15:0]
端口 C 上拉电阻不使能寄存
GPCUP 0x56000028 R/W 器,使用位 [15:0] 。 0x0
0 :使能; 1 :不使能
保留 0x5600002C – 保留 未定义
端口 D ( 16 位)控制寄存器
读/
寄存器 地址 描述 复位值

配置端口 D 引脚端,使用位 [31:0]
,分别对端口 D 的 16 个引脚端进行
0x5600003
GPDCON R/W 配置。 0x0
0
00 :输入; 01 :输出;
10 :第 2 功能; 11 :保留 / 第 3 功能
0x5600003
GPDDAT R/W 端口 D 数据寄存器,使用位 [15:0] 未定义
4
端口 D 上拉电阻不使能寄存器,使用
0x5600003
GPDUP R/W 位 [15:0] 。 0xF000
8
0 :使能; 1 :不使能
0x5600003
保留 – 保留 未定义
C

返回
端口 E ( 16 位)控制寄存器
寄存器 地址 读 / 写 描述 复位值
配置端口 E 引脚端,使用位 [31:0]
,分别对端口 E 的 16 个引脚端进行
0x5600004 配置。
GPECON R/W 0x0
0 00 :输入; 01 :输出;
10 :第 2 功能; 11 :保留 / 第 3 功

0x5600004
GPEDAT R/W 端口 E 数据寄存器,使用位 [15:0] 未定义
4
端口 E 上拉电阻不使能寄存器,使用
0x5600004
GPEUP R/W 位 [15:0] 。 0x0
8
0 :使能; 1 :不使能
0x5600004
保留 – 保留 未定义
C

返回
端口 F ( 8 位)控制寄存器

寄存器 地址 读 / 写 描述 复位值
配置端口 F 引脚端,使用位
[15:0] ,分别对端口 F 的 8
GPFCON 0x56000050 R/W 个引脚端进行配置。 0x0
00 :输入; 01 :输出
10 :第 2 功能; 11 :保留
端口 F 数据寄存器,使用位
GPFDAT 0x56000054 R/W 未定义
[7:0]

端口 F 上拉电阻不使能寄存
GPFUP 0x56000058 R/W 器,使用位 [7:0] 。 0x0
0 :使能; 1 :不使能

保留 0x5600005C – 保留 未定义
端口 G ( 16 位)控制寄存器
读/
寄存器 地址 描述 复位值

配置端口 G 引脚端,使用位 [31:0]
,分别对端口 G 的 16 个引脚端进行
0x5600006 配置。
GPGCON R/W 0x0
0 00 :输入; 01 :输出;
10 :第 2 功能; 11 :保留 / 第 3 功

0x5600006 端口 G 数据寄存器,使用位 [15:0]
GPGDAT R/W 未定义
4
端口 G 上拉电阻不使能寄存器,使用
0x5600006
GPGUP R/W 位 [15:0] 。 0xF800
8
0 :使能; 1 :不使能
0x5600006
保留 – 保留 未定义
C
端口 H ( 11 位)控制寄存器
寄存器 地址 读/写 描述 复位值
配置端口 H 引脚端,使用位 [21:0]
,分别对端口 H 的 11 个引脚端进行
0x5600007
GPHCON R/W 配置。 0x0
0
00 :输入; 01 :输出;
10 :第 2 功能; 11 :保留 / 第 3 功能
0x5600007
GPHDAT R/W 端口 H 数据寄存器,使用位 [10:0] 未定义
4
端口 H 上拉电阻不使能寄存器,使用
0x5600007
GPHUP R/W 位 [10:0] 。 0x0
8
0 :使能; 1 :不使能
0x5600007
保留 – 保留 未定义
C
杂项控制寄存器
读/
寄存器 地址 描述 复位值

MISCCR
(多状态控 0x560000 上拉电阻、高阻状态、 USB 0x103
制) 80 R/W Pad 和 CLKOUT 的选择控制 30

DCLK 控制寄存器
寄存器 地址 读/写 描述 复位值
DCLK0/1 控制,
位 [27:16] 控制
DCLK1 ,
DCLKCON 0x5600008 位 [11:0] 控制
(外部时钟源时钟) 4 R/W DCLK0 0x0
外部中断控制寄存器

读/
寄存器 地址 描述 复位值

外部中断控制寄存器 0 ,使用位 [30:0] ,
分别对 EINT7 ~ EINT0 触发信号进行配置
0x5600008 。
EXTINT0 R/W 0x0
8 000 :低电平触发; 001 :高电平触发;
01x :下降沿下降; 10x :上升沿触发;
11x :双边沿触发
外部中断控制寄存器 1 ,使用位 [30:0] ,分
0x5600008
EXTINT1 R/W 别对 EINT15 ~ EINT8 触发信号进行配置。 0x0
C
配置同上

外部中断控制寄存器 2 ,使用位 [30:0] ,分


别对 EINT23 ~ EINT16 触发信号进行配置
0x5600009 。
EXTINT2 R/W 0x0
0 配置同上
位 31 为 EINT23 滤波器使能控制
1 :使能; 0 :不使能
外部中断滤波寄存器

读/
寄存器 地址 描述 复位值

0x560000
EINTFLT0 R/W 保留
94

0x560000
EINTFLT1 R/W 保留
98

0x560000 外部中断滤波寄存器 2 ,控制


EINTFLT2 R/W 0x0
9C EINT19 ~ EINT16 的滤波器时钟和带宽

0x4C6000 外部中断滤波寄存器 3 ,控制


EINTFLT3 R/W 0x0
A0 EINT23 ~ EINT20 的滤波器时钟和带宽
外部中断屏蔽寄存器
读/
寄存器 地址 描述 复位值

EINTMASK 0x560000 外部中断屏蔽寄存器,使用位 0x00FFFF
A4 R/W [23:4] 控制 EINT23 ~ EINT4 中断 F0
屏蔽。
0 :使能中断; 1 :屏蔽中断

外部中断挂起寄存器
读/
寄存器 地址 描述 复位值

0x560000
外部中断挂起寄存器,使用位 [23:4]
EINTPEND A8 R/W 0x0
控制 EINT23 ~ EINT4 中断请求。
0 :不被请求; 1 :被请求
通用状态寄存器

读/
寄存器 地址 描述 复位值

0x560000A Undefine
GSTATUS0 R 外部引脚端状态
C d
0x560000B 0x324100
GSTATUS1 R 芯片 ID
0 00
0x560000B
GSTATUS2 R/W 复位状态 0x1
4
0x560000B Infrom 寄存器,可以利用
GSTATUS3 R/W 0x0
8 nRESET 和看门狗定时器清零

0x560000B Infrom 寄存器,可以利用


GSTATUS4 R/W 0x0
C nRESET 和看门狗定时器清零
I/O 口编程实例

下面介绍一个通过 D 口的引脚 8 和 9 控制发光二极

管 LED1 和 LED2 轮流闪烁 I/O 口编程实例。

 对 I/O 口的操作是通过对相关各个寄存器的读/写实现的

 要对寄存器进行读/写操作,首先要对寄存器进行定义。
 要想实现对 D 口的配置,只要在地址 0x5600 0030
(GPDCON) 中给 32 位的每一位赋值就可以了。

 如果 D 口的某个引脚被配置为输出引脚,在 GPDDAT
(0x5600 0034) 对应位写入 1 时,该引脚输出高电平;
写入 0 时该引脚输出低电平。
对应汇编程序关键语句
LDR R0,=0X56000030 ; GPDCON
LDR R1,=0X56000034 ; GPDDAT

MVN R2 , #0X000F0000 ;( R2 ) = 1111 1111 1111 0000 1111 1111


1111 1111 B
MOV R3 , #0X00050000 ; ( R3 ) = 0000 0000 0000 0101 0000 0000
0000 0000 B
LDR R4 , [R0] ; 将 rGPDCON 的值读入 R4 中
AND R4, R4, R2 ;与操作将对应设置 8 、 9 引脚的四位清零
ORR R4, R4, R3 ;或操作将 8 、 9 引脚设置为输出功能( 0101B )
STR R4, [R0] ;将 R4 中设置好的值写入 rGPDCON ,完成设置

MOV R2, #0X100 ;( R2 ) = 0000 0000 0000 0000 0000 0001 0000
0000 B
MOV R3, #0X200 ; ( R3 ) = 0000 0000 0000 0000 0000 0010 0000
0000 B
LDR R4, [R1] ; 将 rGPDDAT 的值读入 R4 中
BIC R4, R4, R2 ; 位清除第 8 位为 0 (低电平)
ORR R4,R4,R3 ; 或操作设置第 9 位为 1 (高电平)
STR R4 , [R1] ; 将 R4 中设置好的值写入 rGPDDAT
有关 I/O 口相关寄存器的宏定义代码如下:

//Port A 控制寄存器
#define rGPACON ( * ( volatile unsigned* ) 0x56000000 );有固定地
址的整体普通变量; volatile 防止编译器优化时将变量优化掉或变成对另外一个存储空
间的操作
//Port A 数据寄存器
#define rGPADAT ( * ( volati1e unsigned* ) 0x56000004 )
//Port B 控制寄存器
#define rGPBCON ( * ( volatile unsigned* ) 0x56000010 )
//Port B 数据寄存器
#define rGPBDAT ( * ( volatile unsigned* ) 0x56000014 )
//Port B 上拉电阻禁止寄存器
#define rGPBUP ( * ( volatile unsigned* ) 0x56000018 )
//Port C 控制寄存器
#define rGPCCON ( * ( volatile unsigned* ) 0x56000020 )
//Port C 数据寄存器
#define rGPCDAT ( * ( volatile unsigned* ) 0x56000024 )
//Port C 上拉电阻禁止寄存器
#define rGPCUP ( * ( volatile unsigned* ) 0x56000028 )
//Port D 控制寄存器
#define rGPDCON ( * ( volatile unsigned* ) 0x56000030 )
//Port D 数据寄存器
#define rGPDDAT ( * ( volatile unsigned* ) 0x56000034 )
//Port D 上拉电阻禁止寄存器
#define rGPDUP ( * ( volatile unsigned* ) 0x56000038 )
//Port E 控制寄存器
#define rGPECON ( * ( volatile unsigned* ) 0x56000040 )
//Port E 数据寄存器
#define rGPEDAT ( * ( volatile unsigned* ) 0x56000044 )
//Port E 上拉电阻禁止寄存器
#define rGPEUP ( * ( volatile unsigned* ) 0x56000048 )
//Port F 控制寄存器
#define rGPFCON ( * ( volatile unsigned* ) 0x56000050 )
//Port F 数据寄存器
#define rGPFDAT ( * ( volatile unsigned* ) 0x56000054 )
//Port F 上拉电阻禁止寄存器
#define rGPFUP ( * ( volatile unsigned* ) 0x56000058 )
//Port G 控制寄存器
#definerGPGCON ( * ( volati1e unsigned* ) 0x56000060 )
//Port G 数据寄存器
#definerGPGDAT ( * ( volatile unsigned* ) 0x56000064 )
//Port G 上拉电阻禁止寄存器
#definerGPGUP ( * ( volatile unsigned* ) 0x56000068 )
//Port H 控制寄存器
#definerGPHCON ( * ( volatile unsigned* ) 0x56000070 )
//Port H 数据寄存器
#definerGPHDAT ( * ( volatile unsigned* ) 0x56000074 )
//Port H 上拉电阻禁止寄存器
#definerGPHUP ( * ( volatile unsigned* ) 0x56000078 )
 实现 LED1 和 LED2 轮流闪烁的程序代码。
void Main ( void )

int flag , i ;
Target Init (); // 进行硬件初始化操作,包括对 I / O 口的初始化操作

for (;;) // 无限循环 也可以 while(1)



if ( flag = = 0 )

for ( i = 0 ; i < 1000000 ; i++ ); // 延时

rGPDCON = rGPDCON & 0xfff0ffff | 0x00050000 ;


// 配置位 8 、 9 为输出引脚 ,每一引脚用两位设置, 01 为输出功能

rGPDDAT = rGPDDAT & 0xfeff | 0x200 ;


// 位 8 输出为低电平位 9 输出高电平

for ( i = 0 ; i< 10000000 ; i++ ); // 延时


flag = 1 ;

else {
for ( i = 0 ; i< 1000000 ; i++ ); // 延时

rGPDCON = rGPDCON & 0xfff0ffff | 0x00050000 ;


// 配置位 8 、 9 为输出引脚 ,每一引脚用两位设置, 01 为输
出功能

rGPDDAT = rGPDDAT & 0xdff | 0x100 ;


// 位 9 输出低电平,位 8 输出为高电平,每一引脚用一位输出
for ( i = 0 ; i< 1000000 ; i++ ); // 延时
flag = 0 ;


返回
3.5 S3C2410A 的中断控制
3.5.1 ARM 系统的中断处理

在 ARM 系统中,支持 7 种异常


 复位
 未定义指令
 软中断
 预取中止
 数据中止
 IRQ
 FIQ

每种异常对应于不同的处理器模式,
有对应的异常向量(固定的存储器地址)。
S3C2410 的中断系统

S3C2410 的中断系统分成两级 :
 一级是控制内部外围 I/O 端口或部件、或者芯片外部中断引脚( EINTn )的中断控制;
 另一级是 ARM920T 内核的异常中断控制,采用了固定向量中断方式。
• S3C2410 芯片中的中断控制器可以支持 56 个中断源提出的中断请
• 求。
56 个中断源中有些中断共用中断请求信号线,因此,实际中断请求信号有 32 个。
• 当 S3C2410 芯片的内部 I/O 端口或部件提出中断请求、或者芯片外部中断引
脚( EINTn )收到中断请求时,中断控制器经过仲裁之后请求 ARM9 核的 FIQ 或
IRQ 中断 (ARM 内核 2 个外部中断输入信号 nIRQ 和 nFIQ) 。
S3C2410A 的中断源( 1 )
中断源 描述 仲裁器分组
INT_ADC ADCEOC 和触摸中断 (INT_ADC/INT_TC) (2 ARB5
个)
INT_RTC RTC 报警中断 ARB5
INT_SPI1 SPI1 中断 ARB5
INT_UART0 UART0 中断(故障、接收和发送) (3 个 ) ARB5
INT_IIC I2 C 中断 ARB4
VINT_USBH USB 主设备中断 ARB4
INT_USB USB 从设备中断 ARB4
保留 保留 ARB4
INT_UART1 UART1 中断(故障、接收和发送) (3 个 ) ARB4
INT_SPI0 SPI0 中断 ARB4
S3C2410A 的中断源( 2 )
中断源 描述 仲裁器分组
INT_SDI SDI 中断 ARB3
INT_DMA3 DMA 通道 3 中断 ARB3
INT_DMA2 DMA 通道 2 中断 ARB3
INT_DMA1 DMA 通道 1 中断 ARB3
INT_DMA0 DMA 通道 0 中断 ARB3
INT_LCD LCD 中断( INT_FrSyn 、 INT_FiCnt ) (2 ARB3
个)
S3C2410A 的中断源( 3 )
INT_UART2 UART2 中断(故障、接收和发送) (3 个 ) ARB2
INT_TIMER4 定时器 4 中断 ARB2
INT_TIMERS 定时器 3 中断 ARB2
INT_TIMER2 定时器 2 中断 ARB2
INT_TIMER1 定时器 1 中断 ARB2
INT_TIMER0 定时器 0 中断 ARB2
S3C2410A 的中断源( 4 )
INT_WDT 看门狗定时器中断 ARB1
INT_TICK RTC 时钟滴答中断 ARB1
nBATT_FLT 电源故障中断 ARB1
保留 保留 ARB1
EINT8_23 外部中断 8 ~ 23 ( 16 个) ARB1

EINT4_7 外部中断 4 ~ 7 ( 4 个) ARB1

EINT3 外部中断 3 ARB0


EINT2 外部中断 2 ARB0
EINTI 外部中断 1 ARB0
EINT0 外部中断 0 ARB0
S3C2410 的中断系统逻辑图

32 个中断请求信号,在系统复位初始
状态下,按照前图中由上到下的顺序,
中断优先级由高到低排列,即 EINT0
中断优先级最高, INT_ADC 中断优先
级最低。

32 个中断请求的优先级仲裁
判决机制采用了中断优先级
编码判断电路原理。裁决逻
辑由 7 个基本裁决器组成,
其中 6 个一级裁决器和 1 个
二级裁决器。
中断控制寄存器
 用 S3C2410 的中断方式来控制 I/O 端口或部件操作
 对 I/O 端口或部件的相应寄存器进行初始化设置
 对中断控制器的控制寄存器进行初始化设置
中断控制器的特殊寄存器
寄存器 地址 R/W 描述 复位值
SRCPND 0X4A00000 R/W 中断源未决寄存器(中断挂起寄存器) 0x0000
0 无中断请求,相应位清 0 ;
有中断产生,相应位置 1 。 0000
所有中断请求首先被登记到中断源挂起寄存器中
INTMOD 0X4A00000 R/W 中断模式寄存器: 0=IRQ 模式, 1=FIQ 模式。多个 0x0000
4 IRQ 中断的仲裁过程在优先级寄存器进行。
0000
INTMSK 0X4A00000 R/W 中断屏蔽寄存器,屏蔽相应中断的请求: 0xFFFF
8 0= 允许中断, 1= 屏蔽中断。
即使中断挂起寄存器的相应位已经置 1 ,若中断屏蔽 FFFF
寄存器的相应位置 1 , CPU 也不会响应该中断请求

中断控制器的特殊寄存器(续)
寄存器 地址 R/W 描述 复位值
PRIORITY 0x4A00000 R/W IRQ 中断优先级控制寄存器 0x7F
C
INTPND 0X4A00001 R/W 中断状态指示 ( 未决 ) 寄存器 0x0000000
0 0= 该中断没有请求; 0
1= 该中断源发出中断请求
INTOFFSET 0X4A00001 R 中断偏移寄存器,指示 IRQ 中断源 ( x 位为 0x0000000
4 1 ,该寄存器的值就为 x, 值为 0-31 ) 0
SUBSRCPND 0X4A00001 R/W 子中断源状态 ( 未决 ) 寄存器,指示中断请 0x0000000
8 求的状态。 0
0= 该中断没有请求
1= 该中断源发出中断请求
INTSUBMSK 0X4A00001 R/W 定义哪几个子中断源屏蔽 0x7FF
C 0= 中断服务允许, 1= 中断服务屏蔽
其中 5 个主要的寄存器
 源未决 ( 挂起 ) 寄存器( SRCPND )
 中断模式寄存器 ( INTMOD )
 中断屏蔽寄存器 ( INTMASK )
 优先级判别寄存器( PRIORITY )只对 IRQ 模式有效
 中断未决寄存器 ( INTPND ) 只对 IRQ 模式有效
源未决寄存器 SRCPND
 32 位,每一位与一个中断请求信号相关联。
 当某个中断源请求中断服务时, SRCPND 寄存器的相应位被置为 1 ,即首先在源
未决寄存器中登记。
 该寄存器记录了哪个中断源的请求在等待处理。
注意:
 SRCPND 寄存器的每一位由中断源自动设置,而不管中断屏蔽寄存器
( INTMASK )中对应的位是否被屏蔽。
 SRCPND 寄存器也不受中断控制器的优先级逻辑影响。
中断模式寄存器 INTMOD
 S3C2410 的中断模式有 2 种: FIQ 模式和 IRQ 模式。

 32 位中每一位都与一个中断源相关联
------ 若被设置成 1 ,则相应的中断按 FIQ 模式处理。
------ 若被设置成 0 ,则相应的中断按 IRQ 模式处理。

注意:在 S3C2410 中,只能有一个中断源在 FIQ 模式下处理,


INTMOD 寄存器中只有一位可以设置为 1 。
设计者应该将最紧迫的中断源设置为 FIQ 模
式使用。
中断屏蔽寄存器 INTMSK
 32 位每一位与一个中断源相对应。
--- 某位设置为 1 ,则对应的中断源提出的中断请求不会被处理
--- 如果设置为 0 ,则对应的中断源提出的中断请求可以被处理

 即使某屏蔽位设置为 1 ,其对应的中断源产生中断请求时,
源未决寄存器 SRCPND 中的相应位也将设置成 1 。
优先级判别寄存器 PRIORITY
 IRQ 中断模式下的中断优先级控制寄存器 .

 每个中断源在寄存器中有 3 位对应 , 分别代表 ARB_SEL 的 2 位和


ARB_MODE 的 1 位。
 地址 0x4a00000c ,复位初始状态为 0x0000007f 。
中断未决寄存器 INTPND
 32 位中的每一位对应一个中断源。只有未被屏蔽且具有最高优先级、在源未决寄存器
中等待处理的中断请求可以把其对应的中断未决位置 1 。

 INTPND 寄存器中只有一位可以设置为 1 ,中断控制器产生 IRQ 信号给 RM920T 核。


 在 IRQ 的中断服务例程里,可以读取该寄存器,获知哪个中断源被处理。
 当 INTPND 寄存器的一个未决位被设置为 1 ,只要 ARM920T 核内部的状态寄存器 PSR
中的 I 标志和 F 标志被清零,对应的中断服务例程就可以开始执行。
 INTPND 寄存器是可读写的,在中断服务例程里面必须清除中断未决位。
操作 INTPND 寄存器时应注意
 如果发生了 FIQ 模式的中断,那么 INTPND 寄存器中相应的位将不会置 1 ,因为
INTPND 寄存器只对 IRQ 模式下的中断有效。
 清除 INTPND 寄存器的中断未决位时要谨慎。因为 INTPND 寄存器,
----- 通过向未决位写 1 来实现对该位清零
---- 若试图通过写数据位 0 来清除,那么 INTPND 和 INTOFFSET 寄存器
在某
些情况下可能会具有不可预料的值。
 清除 INTPND 寄存器的未决位最简捷的方法就是
将 INTPND 寄存器的值写回到 INTPND 寄存器里。
异常中断响应和返回
异常出现后, ARM 微处理器会执行以下几步操作:
1)    将下一条指令的地址存入相应连接寄存器 LR ,以便程序在处理异常
返回时能从正确的位置重新开始执行。
2)   将 CPSR 复制到相应的 SPSR 中。
3)   根据异常类型,强制设置 CPSR 的运行模式位。
4)    强制 PC 从相关的异常向量地址取下一条指令执行,从而跳转到相应
的异常处理程序处。
 这些工作是由 ARM 内核完成的 , 不需要用户程序参与。
异常处理完毕之后, ARM 微处理器会执行以下几步操作从异常返回:
1)     将连接寄存器 LR 的值减去相应的偏移量后送到 PC 中。
2)    将 SPSR 复制回 CPSR 中。
3)    若在进入异常处理时设置了中断禁止位,要在此清除。
 这些工作必须由用户在中断处理函数中实现。
中断编程模式
 采用中断方式编程的内容涉及四部分:

(1) 建立系统异常向量表,并且设置 ARM920T 核的程序状态寄存器 CPSR 中的 F 位


和 I 位。一般情况下中断均需使用数据栈,因此,还需建立用户数据栈。这一部
分内容对应的程序指令,通常编写在系统引导程序中。

(2) 设置 S3C2410 芯片中 56 个中断源的中断向量。通常需要利用未决寄存器或


地址偏移寄存器来计算,若中断号还对应有子中断(如中断号为 5 时,对应
EINT8_23 ),需求出子中断的地址偏移。

(3) 中断控制初始化。主要是初始化 S3C2410 芯片内部的中断控制的寄存器。针


对某个具体的中断源,设置其中断控制模式、中断是否屏蔽、中断优先级等。

(4) 完成 I/O 端口或部件具体操作功能的中断服务程序。中断服务程序中,在返回


之前必须对中断未决寄存器( INTPND )的相应未决位进行清除操作。
 异常处理:为保证在 ARM 处理器发生异常时不至于处于未知状态,在应用
程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特
定位置放置一条跳转指令,跳转到异常处理程序。当 ARM 处理器发生异
常时,程序计数器 PC 会被强制设置为对应的异常向量,从而跳转到异常
处理程序。当异常处理完成以后,返回到主程序继续执行。

 二次跳转:由于向量表的限制,只能有一条指令 B 完成 32MB 范围内的跳


转,并不能保证所有的异常处理函数都位于 32MB 范围内。为了扩展跳转
范围,需要二次跳转才能把异常处理函数的地址传送给 PC 。

 在 S3C2410 体系中,中断的调用可以看成是经历了 2 次“中断向量表”的


查询。 2410init.s 中的代码完成查询中断偏移寄存器 INTOFFSET 功
能,得到当前中断的中断号,并根据中断号再调用相关的中断服务程序。
三星公司网站提供了 test2410_r11 软件包,其中 2410init.s 有如下代码:
HandlerXXX
sub    sp,sp,#4   ; 减少 sp ,保存跳转地址
stmfd  sp!,{r0}    ; 将工作寄存器压入堆栈
ldr   r0,=HandleXXX ; 将 HandleXXX 地址放入 r0
ldr     r0,[r0]   ; 将中断程序入口地址放入 r0
str   r0,[sp,#4]  ; 将中断程序入口地址压入堆栈
ldmfd   sp!,{r0,pc}   ; 将工作寄存器和中断程序入口地址弹出
到 r0 和 PC
 3.5.3 S3C2410A 的中断编程实例
 本小节介绍一个通过定时器 1 控制一个 led 灯每 1 秒钟改变一次状态,需要完
成的主要工作如下。

 ( 1 )对定时器 1 初始化,并设定定时器的中断时间为 1 ,具体代码参见 Timed


init ( )函数。
void Timerl_init ( void ) {
rGPBCON = rGPBCON&0xfffffffc&0x00000001;
rGPBDAT= rGPBDAT |0x001;
rTCFG0 = 255 ;
rTCFG1 = 0<<4 ;
rTCNTB1 = 48828 ; // 在 pclk = 50MHz
下, 1s 的记数值 rTCNTB1 = 50000000/4/256=48828 ;
rTCMPB1 = 0x00 ;
rTCON = ( 1+11 ) | ( 1<<9 ) | ( 0<<8 ); // 禁用定时器 1 ,手动加载
rTCON = ( 1+11 ) | ( 0<<9 ) | ( 1<<8 ); // 启动定时器 1 ,自动装载
}
 ( 2 )为了使 CPU 响应中断,在中断服务子程序执行之前,必须打开 ARM920T 的
CPSR 中的 I 位,以及相应的中断屏蔽寄存器中的位。
 打开相应的中断屏蔽寄存器中的位,是在 TimerlINT Init ()函数中实现的。
void TimerlINT_Init ( void )
{ if (( rINTPND & BIT_TIMERI )) // 定时器接口使能
{ rSRCPND | = BIT_TIMER1 ;}
pISR_TMER1= ( int ) Timerl_ISR ; // 写入定时器 1 中断服务子程序的入
口地址
rINTMSK &= ~ ( BIT_TIMERI ); // 开中断; }

( 3 )等待定时器中断,通过一个死循环,如“ while ( 1 );”实现等待过程。


( 4 )根据设置的定时时间,产生定时器中断。
中断发生后,首先进行现场保护,然后转入中断的入口代码处执行。
该部分代码通常使用汇编语言编写。
在执行中断服务程序之前,要确保 HandleIRQ 地址处保存中断分发程序
IsrIRQ 的入口地址

ldr r0 ,= HandleIRQ
ldr r1 ,= IsrIRQ
str r1 , [r0 〕
下来将执行 IsrIRQ 中断分发程序,具体代码如下。

IsrIRQ
sub sp,sp,#4 ; // 为保存 PC 预留堆栈空间
stmfd sp !,{ r8 - r9 }
ldr r9 ,= INTOFFSET
ldr r9 , [r9] ; // 加载 INTOFFSET 寄存
器值到 r9
ldr r8 ,= HandleEINT0 ; // 加载中断向量表的基地址到 r8
add r8 , r8 , r9 , lsl #2 ; // 获得中断向量
ldr r8, [r8] ; // 加载中断服务程序的
入口地址到 r8
str r8 , [sp,#8 ]; // 保存 sp ,将其作为新的 pc 值
ldmfd sp! , {r8-r9,pc} ; // 跳转到新的 pc 处执行,
// 即跳转到中断服务子程序
执行
( 5 )执行中断服务子程序 Timerl_ISR ()
该子程序实现 led 灯每一秒钟改变一次状态。

int f ;
void _ _irq Timer1_ISR(void)
{if (f= = 0)
{ rGPBDAT = rGPBDAT | 0x001;
f=1;}
if (f= = 1)
{ rGPBDAT= rGPBDAT &0x0;
f=0;}
rSRCPND |= BIT_TIMER1;
rINTPND |= BIT_TIMER1;
}
( 6 )从中断返回,恢复现场,跳转到被中断的主程序继续执行,等待下一次中
断的到来。
 标准的 ARM 指令编译器提供了一个用来声明中断处理函数的关键字 _ _irq 。
 编译后的代码在处理异常事件前保存现场信息,处理异常事件后对现场信息进行
恢复。
 可用 _ _irq 关键字来编写简单单级中断处理程序,以及调用子例程的中断处
理程序。
 不能用 _ _irq 关键字来编写 reentrant (重入)中断处理程序,因它对
SPSR 不进行存储或恢复。
 “ 重入”的含义是指处理程序能再次设置中断并能将其自身中断。
_ _irq 关键字:

 保护所有 ATPCS 易损坏的寄存器;


 保护所有被函数使用的其它寄存器(不包括浮点寄存器);
 通过将程序计数器设置到 (lr - 4) 并恢复 CPSR 的初始数据值来退出
函数。
 如果该函数调用了一个子例程, _ _irq 除保护其它易损坏寄存器外,还为
中断模式保护链接寄存器。
3.6 S3C2410A 的 DMA 控制器

 3.6.1 DMA 工作原理

 DMA ( Direct Memory Acess ,直接存储器存取)方式是指存储器与外设在 DMA 控制器


的控制下,直接传送数据而不通过 CPU ,传输速率主要取决于存储器存取速度。
 DMA 控制器负责管理整个操作,无须 CPU 介入,大大提高了 CPU 的工作效率。
 DMA 方式为高速 I/O 设备和存储器之间的批量数据交换提供了直接的传输通道。由于 I/O
设备直接同内存发生成块的数据交换,可以提高 I/O 效率。
 现在大部分计算机系统均采用 DMA 技术。许多输入/输出设备的控制器都支持 DMA 方式。
 数据传送之前, DMA 控制器会向 CPU 申请总线控制权, CPU 如果允许,则将控制权交出。
因此,在数据交换时,总线控制权由 DMA 控制器掌握,在传输结束后, DMA 控制器将总线控
制权交还给 CPU 。采用 DMA 方式进行数据传输的具体过程如下。
 ( 1 )外设向 DMA 控制器发出 DMA 请求。
 ( 2 ) DMA 控制器向 CPU 发出总线请求信号。
 ( 3 ) CPU 执行完现行的总线周期后,向 DMA 控制器发出响应请求的回答信号。
 ( 4 ) CPU 将控制总线、地址总线及数据总线让出,由 DMA 控制器进行控制。
 ( 5 ) DMA 控制器向外部设备发出 DMA 请求回答信号。
 ( 6 )进行 DMA 传送。
 ( 7 )数据传送完毕, DMA 控制器通过中断请求线发出中断信号。 CPU 在接收到
中断信号后,转人中断处理程序进行后续处理。
 ( 8 )中断处理结束后, CPU 返回到被中断的程序继续执行。 CPU 重新获得总线
控制权。
 3.6.2 S3C2410A 的 DMA 控制器

 在系统总线和外围总线之间, S3C2410A 有 4 个 DMA 控制器。每个 DMA 控


制器可以处理以下 4 种情况:
 ( 1 )源和目的都在系统总线上;
 ( 2 )源在系统总线上,目的在外围总线上;
 ( 3 )源在外围总线上,目的在系统总线上;
 ( 4 )源和目的都在外围总线上。
 如果 DCON 寄存器选择采用硬件( H/W ) DMA 请求模式, DMA 控制器可以从
对应通道的 DMA 请求源中选择一个。如果 DCON 寄存器选择采用软件( S/
W ) DMA 请求模式,那么这些 DMA 请求源将没有任何意义。
 DMA 请求源如下表所示。
DMA 请求源

通道 请求源 0 请求源 1 请求源 2 请求源 请求源 4


3
通道 0 nXDREQ0 UART0 SDI 定时器 USB 设备 EP1

通道 1 nXDREQ1 UARTI I2 SPI0 USB 设备 EP2


SSDI
通道 2 I2SSDO I2SSDI SDI 定时器 USB 设备 EP3

通道 3 UART2 SDI SPI1 定时器 USB 设备 EP4


DMA 的操作过程可以用一个 3 种状态的 FSM ( Finite State
Machine ,有限状态机)来描述,具体步骤如下:

( 1 )状态 1
状态 1 为初始状态, DMA 等待一个 DMA 请求。如果出现 DMA 请求,
进入状态 2 。在这种状态下, DMA ACK 和 INT REQ 为 0 。
( 2 )状态 2
在状态 2 , DMA ACK 变为 1 ,并且从 DCON[19:0] 寄存器向计数器
( CURR TC )加载计数值。注意,此时 DMA ACK 一直是 1 ,直到被清零。
( 3 )状态 3
在状态 3 ,子 FSM 使 DMA 的微操作被初始化。子 FSM 从源地址读取
数据,并将其写入目标地址。在这个操作过程中,需要考虑数据大小(尺
寸)和传输大小(尺寸)。这一操作重复执行,直到在整体服务模式下的计
数器 ( CURR_TC )变为 0 ;这一操作在单个服务模式下则只执行一次。子
FSM 每完成一次微操作,主 FSM 将 CURR_TC 进行一次向下计数。另外,当
CURR_TC 变为 0 时,主 FSM 将 INT REQ 信号置 1 ,并将 DCON 寄存器的
中断设置位[ 29 ]置 1 。除此以外,如果发生以下情况,则对 DMA ACK 清
零。
 在单个服务模式下,主 FSM 的 3 种状态执行完后就停止,并
等待下一个 DMA 请求。如果又产生了新的 DMA 请求,则所有
3 个状态都将被重复。因此,对于每一个微传送操作, DMA
ACK 先后置 1 和清零。相反,在整体服务模式下,主 FSM 一
直在状态 3 等待直到 CURR TC 变为 0 ,因此 DMA ACK 在整
个传送过程中都置 1 ,当 TC 为时则清零。
 S3C2410A 每个 DMA 通道有 9 个控制寄存器, 4 个通道共有 36 个寄存器。

每个 DMA 通道的 9 个控制寄存器中有 6 个用于控制 DMA 传输,另外 3 个用于


监控 DMA 控制器的状态。相关寄存器介绍如下:

( 1 ) DMA 初始化源寄存器( DISRC )


----- 用于存放要传输的源数据的起始地址。

寄存器 地址 读/写 描述 复位值


DISRCO 0x4B00 0000 DMA0 初始化源寄存器
DISRCI 0x4B00 0040 DMAl 初始化源寄存器
0x0000
读/写
DISRC2 0x4B00 0080 DMA2 初始化源寄存器 0000

DISRC3 0x4B00 00C0 DMA3 初始化源寄存器


( 2 ) DMA 初始化源控制寄存器( DISRCC )
------- 用于控制源数据在 AHB 总线还是 APB 总线上并控制地址增长方

寄存器 地址 读/ 写 描述 复位值
0x4B00
DISRCC0
0004
0x4B00 DMA0 ~ DMA3 初始化源控制寄存器。
DISRCC1 位 [1] = 0 ,源数据在 AHB 总线上;
0044 0x0000
读/ 写 位 [1] = 1 ,源数据在 APB 总线上。
0x4B00 0000
DISRCC2 位 [0] = 0 ,传送数据后,源地址增加
0084 位 [0] = 1 ,地址固定不变
0x4B00
DISRCC3
00C4
3 ) DMA 初始化目标地址寄存器( DIDST ),
--- 用于存放传输目标的起始地址。

寄存器 地址 读/写 描述 复位值

DIDST0 0x4B00 0008 DMAO 初始化目标地址寄存器

DIDST1 0x4B00 0048 DMA1 初始化目标地址寄存器 0x0000


读/写
DIDST2 0x4B00 0088 DMA2 初始化目标地址寄存器 0000

DIDST3 0x4B00 00C8 DMA3 初始化目标地址寄存器


( 4 ) DMA 初始化目标控制寄存器( DIDSTC )
---- 用于控制目标位于 AHB 总线还是 APB 总线上,并控制地址增长方式

寄存器 地址 读/写 描述 复位值


0x4B00
DIDSTC0
000C
DMAn 初始化目标控制寄存器。
0x4B00 位 [1] = 0 ,目标在 AHB 总线上;
DIDSTC1
004C 位 [1] = 1 ,目标在 APB 总线上。 0x0000
读/写
0x4B00 位 [0] = 0 ,传送数据后,目标地址增 0000
DIDSTC2 加
008C
位 [0] = 1 ,地址固定不变
0x4B00
DIDSTC3
00CC
( 5 ) DMA 控制寄存器( DCON )
------- 有 4 个 DMA 控制寄存器 DCON0 ~ DCON3

寄存器 地址 读/写 描述 复位值


0x4B00
DCON0 DMA0 控制寄存器
0010
0x4B00
DCON1 DMA1 控制寄存器
0050 0x0000
读/写
0x4B00 0000
DCON2 DMA2 控制寄存器
0090
0x4B00
DCON3 DMA3 控制寄存器
00D0
DMA 控制寄存器
DCONn 位 描述
DMD HS [31] 请求模式或握手模式选择。 0 :请求模式; 1 :握手模式
DREQ/DACK 同步模式选择。
SYNC [30] 0 : DREQ 和 DACK 与 APB 时钟同步
1 : DREQ 和 DACK 与 AHB 时钟同步
INT [29] CURR_TC 中断使能设置。 0 :禁止中断; 1 :使能中断
TSZ [28] 选择传输单位的大小。 0 :单位传输; 1 :长度为 4 的突发式传输
SERVMODE [27] 服务模式选择。 0 :单个服务模式; 1 :整体服务模式
为 DMA 设置 DMA 请求源。
DCON0 : 000 一 nXDREQ0 ; 001 一 UART0 ;
010 一 SDI ;
011 一定时器 ; 100 一 USB
设备 EP1 ;
DCONl : 000 一 nXDREQ1 ; 001 一 UART1 ;
010 一 I2SSDI ;
011 一 SPI; 100
[26:
HWSRCSEL 一 USB 设备 EP2 ;
24]
DCON2 : 000-I2SSD0 ; 001 一 I2SSDI ;
010 一 SDI ;
011 一定时器; 100 一 USB 设
备 EP3 ;
DCON3 : 000--UART2 ; 001-SDI ;
选择 DMA 软件请求源和硬件请求源。
SWHW_SEL [23] 0 :软件请求模式,通过设置 DMASKTRIG 寄存器 SW_TRIG 位触发;
1 :硬件请求模式,通过设置该寄存器的 HWSRCSEL 位触发
设置是否重新加载(当前计数器值等于零后)。
RELOAD [22]
0 :自动加载; 1 : DMA 通道关闭,不重新加载
[21: 传输数据的大小。
DSZ
20] 00 :字节 01 :半字 10 :字 11 :保留
[19:
TC 初始化计数器
0]
( 6 ) DMA 状态寄存器( DSTAT )
----- 保存 DMA0 ~ DMA3 计数寄存器状态。

寄存器 地址 读/写 描述 复位值


DSTAT0 0x4B00 只读 DMA0 ~ DMA3 计数寄存器。 0x0000
0014 位 [21:20] : 0 一 DMA 控制器就 0000
DSTAT1 0x4B00 绪;
0054 1一
DMA 控制器忙。
DSTAT2 0x4B00 位 [19:0] :传输计数的当前值
0094
DSTAT3 0x4B00
00D4
( 7 ) DMA 当前源寄存器( DCSRC )
-------- 用于保存 DMAn 的当前源地址。

寄存器 地址 读/写 描述 复位值


0x4B00
DCSRC0 DMA0 当前源寄存器
0018
0x4B00
DCSRCI DMA1 当前源寄存器
0058 0x0000
只读
0x4B00 0000
DCSRC2 DMA2 当前源寄存器
0098
0x4B00
DCSRC3 DMA3 当前源寄存器
00D8
( 8 ) DMA 当前目标寄存器( DCDST )
-------- 用于保存 DMAn 的当前目标地址。

寄存器 地址 读/写 描述 复位值


DCDST0 0x4B00 001C DMA0 当前目标寄存器
DCDST1 0x4B00 005C DMA1 当前目标寄存器
只读 0x0000 0000
DCDST2 0x4B00 009C DMA2 当前目标寄存器
DCDST3 0x4B00 00DC DMA3 当前目标寄存器
( 9 ) DMA 屏蔽触发寄存器
( DMASKTRIG )
控制 DMA0 ~ DMA3 触发状态。

寄存器 地址 / 描述 复位值

0x4B00 DMA0 ~ DMA3 屏蔽触发寄存器。
DMASKTRIG0
0020 位 [2] : STOP 位,停止 DMA 操作。
位 [2] = 1 :当前微传输操作结束后, DMA 停止。
DMASKTRIG1
0x4B00 如果当前没有微传输操作, DMA 立即停
0060 止, CURR_TC 将取值为 0 。
位 [1] : ON_OFF 位, DMA 通道开关位。
0x4B00 读 · 位 [1] = 0 :通道关闭,忽略 DMA 请求。 0x000
DMASKTRIG2
00A0 / 位 [1] = 1 :通道打开。 0
写 位 [0] : SW_TRIG 位 0000
DMA 通道通过软件请求模式触发
位 [0] = 1 :对这个 DMA 控制器请求一次 DMA 操
DMASKTRIG3
0x4B00 作
00E0 注:这个位只有在 DCONn[23 」置 1 并且 ON_OFF
位也置 1 时才能生效。当 DMA 操作开始后,本位自
动清 0 。
 S3C2410A 的 DMA 编程实例

 本小节给出一个使用 DMA 方式实现从存储器发送数据到 UART0 的实例,以


下是程序代码。

#include”config.h”
#define S_DATA (*(volatile unsigned char *)0x30800000)
#define S_ADDR ((volatile unsigned char *)0x30800000)
// 数据起始地址
void UART0_DMA(void){
volatile unsigned char*p = S_DATA ;
int i ;
Init();
Delay(5000);
S_DATA = 0x12;
for(I = 0;I <256; i++) {
*p++ = 0x12 + i; // 准备将要
发送的数据
}
rUCON0 = rUCON0&0xff3|0x8; //UART0 设置为
DMA 形式
//DMA 相关寄存器初始化
rDISRC0 = (U32)( S_ADDR);
rDISRCC0 = (0<<1)|0;
rDIDST0 = (U32)UTXH0;
rDIDSTC0(1<<1)|(1<<0);
rDCON0 = 0x0;
rDCON0 = (1<<29)|(1<<24)|(1<<23)|(1<<22)|(50);
rDMASKTRIG0 = (1<<1); // 打开 DMA 通道 0
for( ; ; );
}
第 3 章 思考题与习题
1 登录 www.samsung.com ,查阅 S3C2410A 有关资料,分析其内部结
构组成与功能。
2 简述 S3C2410A 存储器控制器的特性。
3 画出 S3C2410A 复位后的存储器映射图,并分析不同存储器的地址范
围。
4 试分析复位电路的工作过程。
5 登录 www.impweb.com ,查阅 IMP811S 有关资料,分析其内部结构
、引脚端功能与应用电路。
6 简述 S3C2410A 时钟电路的特点。
7 S3C2410A 的电源管理模块具有哪几种工作模式?各有什么特点?
8 登录 www.analogmicro.com ,查阅 AME1117 有关资料,分析其内部
结构、引脚端功能与应用电路。
9 登录 www.micrel.com ,查阅 MIC5207 有关资料,分析其内
部结构、引脚端功能与应用电路。
10 试按功能分析 S3C2410A 的端口 A I/O 口配置情况。
11 S3C2410A 与配置 I/O 口相关的寄存器有哪些?各自具有什么功能?
12 试分析 S3C2410A 端口控制寄存器 A ~ H 的功能。
13 S3C2410A 与外部中断有关的控制寄存器有哪些?各自具有什么功能?
14 试分析 S3C2410A 通用状态寄存器的功能。
15 简述 ARM 系统中的中断处理过程。
16 S3C2410A 与中断控制有关的寄存器有哪些?各自具有什么功能?
17 试按功能对 S3C2410A 的中断源进行分类。
18 简述 S3C2410A 中断控制器的特殊寄存器功能。
19 简述采用 DMA 方式进行数据传输的过程。
20 简述 S3C2410A 的 DMA 控制器功能。
21 S3C2410A 的 DMA 通道有几个控制寄存器?各自具有什么功能?
22 S3C2410A 的 DMA 初始化有几个控制寄存器?各自具有什么功能?
23 简述 DMA 控制寄存器的位功能。
24 简述 DMA 屏蔽触发寄存器的功能。

You might also like