|
摘要: 目前大部分测量仪器都采用硬件开关机的方法,其缺点是在强行中断程序的运行时,不能实时保存程序运行时的参数,下次启动仪器可能造成程序的运行异常。本文介绍了一种软件开关机的方法,并且根据在 S 3C 44B0X 上的应用给出了具体的实现方法,另外还提出了改进意见。
关键字: 软件 , 开关机 , 嵌入式 , S 3C 44B0X
引言
目前采用嵌入式系统的通用测量仪器普遍采用硬件开关机的方法,其优点是开关机可靠,避免了由于程序死锁造成的仪器故障 . 但是这种开关机方法也有一定的缺点 , 由于要强行中断程序的运行 , 程序无法预知关机的时刻 , 所以无法保存关机时的运行和测量参数 , 仪器下次启动时容易出现运行异常的情况 . 采用软件开关机的方法可以有效避免上述情况的发生 .
S 3C 44BOX 是三星公司出品的一款 ARM(Advanced RISC Machines) 微控制器, CPU 核心为 ARM7TDMI 。 S 3C 44BOX 具有非常丰富的外围资源,集成 LCD 控制器、 12C 总线控制器、 I2S 总线控制器、 2 个串口控制器、 2 个通用 DMA(Direct Memory Access) 控制器、 8 个 10 位 ADC(Analog to Digital Converter) 通道、 71 个通用 I / O 引脚等,大大减少了系统成本,是各种学习板和开发板的首选 ARM 芯片。
2 .理论方法
软件开关机方法的中心思想就是将仪器的开关键连接到 CPU 的复位引脚,按动开关键不是真正的切断仪器的电源来关闭仪器,而是给控制 CPU 发出一个复位信号, CPU 接收到复位信号后进行复位使程序重新开始运行,然后在程序运行中判断存储在 RAM 中的一些标志位来决定开关机的状态。在这个过程中要保证 CPU 复位后存储在 RAM 中的标志数据不会被破坏,如果数据被破坏则无法实现用软件来控制仪器的开机和关闭。
3. S 3C 44B0X 的启动过程
S 3C 44B0X 的底层启动代码采用汇编语言编写 , 它包括 对系统硬件和软件运行环境进行初始化 。 通过对期中初始化存储器系统和初始化数据部分代码的修改来实现软件开关机,启动 过程如图 1 。

图 1
4. 软件开关机的程序设计
由于采用判断存储在 RAM 中的标志位的方法来解决开关机问题,因此就要在硬件和软件两个方面保证存储在 RAM 中的标志位不会被清除。在硬件上采用复位方法,不会强行切断电源,因此能够保证存储在 RAM 中的数据不会丢失,以下主要分析软件方面遇到的问题被并给出解决方法。
4.1 RAM 自刷新
S 3C 44B0X 中有专门负责 RAM 刷新的寄存器,只要在初始化存储器系统时设置相应的寄存器即可解决 RAM 刷新带来的数据破坏问题。
REFRESH CONTROL REGISTER
Register |
Address |
R/W |
Description |
Reset |
REFRESH |
0x 01C 80024 |
R/W |
DRAM/SDRAM refresh control register |
refresh |
REFRESH |
Bit |
Description |
Initial |
REFEN |
[23] |
DRAM/SDRAM Refresh Enable
0 = Disable 1 = Enable(self or CBR/auto refresh) |
1 |
TREFMD |
[22] |
DRAM/SDRAM Refresh Mode
0 = CBR/Auto Refresh 1 = Self Refresh
In self-refresh time, the DRAM/SDRAM control signals are driven tothe appropriate level. |
0 |
Trp |
[21:20] |
DRAM/SDRAM RAS pre-charge Time
DRAM :
00 = 1.5 clocks 01 = 2.5 clocks 10 = 3.5 clocks 11 = 4.5 clocks
SDRAM :
00 = 2 clocks 01 = 3 clocks 10 = 4 clocks 11 = Not support |
10 |
Trc |
[19:18] |
SDRAM RC minimum Time
00 = 4 clocks 01 = 5 clocks 10 = 6 clocks 11 = 7 clocks |
11 |
Tchr |
[17:16] |
CAS Hold Time(DRAM)
00 = 1 clock 01 = 2 clocks 10 = 3 clocks 11 = 4 clocks |
00 |
Reserved |
[15:11] |
Not use |
0000 |
Refresh Counter |
[10:0] |
DRAM/SDRAM refresh count value. Please, refer to chap. 6 DRAM
refresh controller bus priority section.
Refresh period = (2 11 -refresh_count+1)/MCLK
Ex) If refresh period is 15.6 us and MCLK is 60 MHz,
the refresh count is as follows;
refresh count = 2 11 + 1 - 60x15.6 = 1113 |
0 |
将 REFRESH 寄存器中 REFEN 位设为 0 即可以关闭 RAM 自刷新功能。
4.2 初始化数据时的数据刷新
启动代码中初始化数据部分的代码如下:
LDR r0, =|Image$$RO$$Limit|
LDR r1, =|Image$$RW$$Base|
LDR r3, =|Image$$ZI$$Base|
CMP r0, r1
BEQ %F1
0
CMP r1, r3
LDRCC r2, [r0], #4
STRCC r2, [r1], #4
BCC %B0
1
LDR r1, =|Image$$ZI$$Limit|
MOV r2, #0
2
CMP r3, r1
STRCC r2, [r3], #4
BCC %B2
经过分析,此段代码的作用是将程序中定义的可读写数据搬移到 RAM 中,并且完成相应的初始化,将程序中定义但是没有赋值的变量清空。因此在该区域中开辟出一块不会被清空的空间用来存放关机标志位。修改后的代码如下:
LDR r0, =|Image$$RO$$Limit|
LDR r1, =|Image$$RW$$Base|
LDR r3, =|Image$$ZI$$Base|
CMP r0, r1
BEQ %F1
0
CMP r1, r3
LDRCC r2, [r0], #4
STRCC r2, [r1], #4
BCC %B0
1
LDR r1, =|Image$$ZI$$Limit|
ADD r3,r3,#1280 ;偏移 1280 个字节
MOV r2, #0
2
CMP r3, r1
STRCC r2, [r3], #4
BCC %B2
4.3 应用程序中修改
在解决了数据刷新的问题后,只需要在应用程序中定义相应的变量,通过判断变量中的数据来决定开关机的状态。第一次开机 RAM 通电后相应位置的数据为空,然后在该位置写入标志数据,再次按下开关后 CPU 复位程序重新运行,判断该位置的数据满足条件进入关机程序,其流程图如图 2 。

图 2
5 . 方法的改进
由于一些 CPU 没有控制 RAM 自刷新的寄存器,或者一些仪器采用某些操作系统(例如 Linux,WinCE 等),造成用户对 RAM 中的数据无法进行控制,如果再将标志数据写入 RAM 就会造成仪器无法关闭,这时可以将标志数据写入程序存储空间,例如 FLASH,EEPROM 等,复位后从程序存储空间读出数据进行判断,采用此方法也可以实现软件控制开关机。
结语
采用此方法来控制开关机应该先要熟悉控制 CPU 的特点,然后决定标志数据的存储方法。另外还要仔细阅读采用汇编语言编写的底层代码,可能会带来一些困难。但是此方法可以在任意系统和任意硬件平台的仪器上使用,能够有效的解决 运行和测量参数的保存问题,给使用者带来极大的方便。
参考文献
1 . < S 3C 44B0X User Manual >
2 . < ARM 指令集 >
作者 简介 :刘恋 , 天津市德力电子仪器有限公司产品经理 , 作为公司的技术骨干在模拟和数字 CATV 测试仪器的设计方面有着丰富的设计经验 , 其设计的产品性能稳定被广大有线电视台所采用 , 并远销欧美、印度及俄罗斯等地区 , 获得广大客户的一致好评 .
天津 市德力电子仪器有限公司
地址 : 天津市南开区宜宾道 40 号
邮编 :300113
电话 :022-27645003-819
E-mail: steven_7780@163.com
|