第 5 章 S3C2440 嵌入式系统( 共 63 分 )
一、简述启动代码存储在 NAND Flash 存储器上时, S3C2440 的启动过程。 ( 6 分)
为了支持 NAND Flash 的 boot loader , S3C2440A 配备了一个内部的 SRAM 缓冲器名
为 “ Steppingstone ”(垫脚石)。 (2 分)
启动时, NAND Flash 上的前 4KByte 字节 将被装载到 Steppingstone 中,并且装载
到 Steppingstone 上的启动代码会被执行。 (2 分)
一般情况下,启动代码会拷贝 NAND Flash 上的内容到 SDRAM 中,在引导代码执行
完毕后就跳转到 SDRAM 执行。 (2 分)
二、功率管理模块能够使系统工作在哪四种模式下?并分别对每种模式进行简
单描述。 ( 12 分)
(1)正常模式:功率管理模块向 CPU 和所有 外部设备 提供时钟。这种模式下,系统
功率将达到 最大 。 (3 分)
(2)低速模式:低速模式直接使用 外部时钟 ( XTIpll 或者 EXTCLK) 作为 FCLK ,没有使
用 PLL 产生的 时钟。这种模式下,功率仅由 外部时钟 决定。 (3 分)
(3)空闲模式:仅关掉 FCLK ,停止为 CPU 提供时钟信号,而继续提供时钟给其他外
设。 (3 分)
(4)掉电模式:功率管理模块断开内部电源,因此 CPU 和除 唤醒逻辑单元 以外的外
设都不会 产生功耗 。要执行掉电模式需要有 两个 独立的电源,其中一个给 唤醒逻辑单元
供电,另一个给 包括 CPU 在内的其他模块 供电。在掉电模式下,第 二个 电源将被关掉。
(3 分)
三、 DMA 的主要优点是什么?简单描述 S3C2440 的 DMA 不同源和目的设备
的四种情况。 ( 11 分)
DMA 的主要优点是:可以不通过 CPU 的中断来实现数据的传输, DMA 的运行可以通
过软件或者通过外围设备的中断和请求来初始化。 (3 分)
(1) 源设备和目标都在系统总线 AHB 上; (2 分)
(2) 源设备和目标都在外围总线 APB 上; (2 分)
(3) 源设备在系统总线,而目标设备位于外围总线; (2 分)
(4) 源设备在外围总线,而目标设备位于系统总线。 (2 分)
四、简单描述 DMA 传输时,需求模式和握手模式的区别。 ( 8 分)
主要区别如下:
在一次传输结束时, DMA 检查 DMA 请求信号 的状态。 (2 分)
在需求模式下:如果 DMA 请求信号仍然有效,则传输马上再次开始,否则等待; (3 分)
在握手模式下:如果一次传送结束, DMA 的请求信号还是有效的,那 DMA 控制器,
不会进行下一次传送,而是要等待,直到 DMA 请求信号变得无效后,下一次请求到来时,
才能进行新的一次传输。每请求一次传输一次。 (3 分)
五、简单描述 S3C2440 的 PWM 模块的自动加载模式和双缓冲模式的主要作用。 ( 6 分)
自动加载模式:自动加载模式 使能 时,当 TCNTn 的值到 0 时,自动加载操作 复制 TCNTBn 的值到 TCNTn 中。但是如果自动加载模式没有使能, TCNTn 将不进行任何操
作。 (3 分)
双缓冲模式:脉宽调制定时器有一个双缓冲功能 ,在这种情况下,改变 下次加载值 的
同时不影响当前 定时周期 。因此,尽管设置一个新的定时器值,当前定时器的操作将会继
续完成而不受影响。 (3 分)
六、假如 CPU 响应 TIMER1 中断进入中断服务程序,为了避免该中断请求信号
再次引起中断响应,需要把 SRCPND 和 INTPND 寄存器中相关标志位清除 ( 12 分)
(1) 请写出相关的汇编语言程序代码。(注:只需写出相关指令代码,不需要写出完整的汇
编程序结构)( 8 分 )
(2) 请写出相关的 C 语言程序代码。假设寄存器名称与寄存器的地址已经相关联(在头文
件或其他文件中定义),对 S3C2440 中相关接口的控制寄存器的访问,可以直接使用该
寄存器的名称。 (注:只需写出相关代码,不需要写出完整的程序结构)( 4 分 )
解:
(1)汇编程序代码如下:
LDR R1,=0X4A000000 ;读取源挂起寄存器(SRCPND)的地址
LDR R2,[R1]
ORR R2,R2,#0x800 ;R2第11位写1清零
STR R2,[R1]
LDR R1,=0X4A000010 ;读取中断挂起寄存器(INTPND)的地址
LDR R2,[R1]
ORR R2,R2,#0x800 ;R2第11位写1清零
STR R2,[R1]
(2)C语言程序代码如下:
#define SRCPND (*(volatile unsigned int *)0x4A000000) //定义SRCPND寄存器的地址
#define INTPND (*(volatile unsigned int *)0x4A000010) //定义INTPND寄存器的地址
#define BIT_TIMER1 (1 << 11) // 定义TIMER1中断标志位
void clearTimer1Interrupt() {
SRCPND = BIT_TIMER1; // 清除TIMER1中断请求标志位
INTPND = INTPND; // 清除TIMER1中断挂起标志位
}
七、如果程序要屏蔽 INT_TICK 中断,请写出相关汇编语言程序代码(注:其余
的屏蔽标志位要保持其原值不变。只需写出相关指令代码,不需要写出完整的
汇编程序结构) ( 8 分)
LDR R1,=0x4A000008 ;获取中断屏蔽寄存器的地址
LDR R2,[R1]
ORR R2, R2, #0x100 ;中断屏蔽寄存器第8为设置为1
STR R2,[R1]