PSTN短消息终端SoC系统的软硬件设计
在reg51.h文件中添加以下语句让编译器确认扩展的寄存器: sfr SEND_MODEM_DATA = 0xf1;/* 扩展,发送Modem数据,只写 */ sfr READ_FSK_DECODE = 0xf1;/* 扩展,读FSK解调数据,只读 */ sfr READ_DTMF_DECODE = 0xf2;/* 扩展,读DTMF解调数据,只读 */ sfr MODEM_STATUS = 0xf3;/* 扩展,Modem状态,只读 */ sfr MODEM_CTRL = 0xf2;/* 扩展,Modem控制,只写 */ sfr KEYPAD_VALUE = 0xf4;/* 扩展,读键盘值,只读 */ sfr FLASH_PAGE = 0xf5; /* 扩展,页面寻址,只写 */ sfr LCD_DATA = 0xf6; /* 扩展,LCD数据,读写 */ sfr LCD_CTRL = 0xf7; /* 扩展,LCD控制,只写 */ sfr CIRCUIT_STATUS = 0xff; /* 扩展,线路状态,只读 */ sfr CIRCUIT_CTRL = 0xff; /* 扩展,线路控制,只写 */ 为了节约SFR总线地址资源,一些扩展的SFR寄存器在硬件上设计为只能写、不可读,另外一些被设计为只能读、不可写。这样,二者可以复用同一个SFR总线地址,比如MODEM_CTRL和READ_DTMF_DECODE寄存器;但是这样在需要先将那些“只写”寄存器的内容读出,运算后再进行写回操作的时候就很不方便。这里采用了镜像变量的方法,为每一个“只写”寄存器建立一个全局变量,每次写寄存器操作后,都对这个全局变量进行同样的写操作,时刻保持变量值和寄存器的内容一致,在需要读出的时候就使用此全局变量。MODEM_CTRL寄存器的bit0控制Modem是DTMF还是FSK模式。下面以对这一位的操作为例说明。 建立它的镜像全局变量: unsigned char xdata modem_ctrl_mirror; 定义控制位: #define MODEM_B0_MODE0x01// 1-DTMF, 0-FSK 图2 片上外设在SFR总线上的物理连接 设置Modem为FSK模式: void Modem_SetMode_FSK() { MODEM_CTRL = modem_ctrl_mirror (~MODEM_B0_MODE); modem_ctrl_mirror = modem_ctrl_mirror (~MODEM_B0_MODE); } 在初始化程序中对这些“只写”寄存器及其镜像全局变量进行赋值。 void DevicesInit() { MODEM_CTRL = MODEM_CTRL_INI; modem_ctrl_mirror = MODEM_CTRL_INI; } 3.3 存储空间的划分和映射 在物理上,把8KB的片内RAM分为两部分,0000H~1BFFH(共7 KB)映射到数据空间,1C00H~1FFFH(共1 KB)映射到程序空间,并覆盖Flash中程序空间的1C00H~1FFFH区域;把512 KB的Flash存储器也分成两部分,00000H~0FFFFH(共64 KB)映射到程序空间,剩下的10000H~7FFFFH(共448 KB)都映射到数据空间。 对微控制器核来说,可以寻址64 KB的程序空间和64 KB的数据存储空间。对整个SoC而言,因为Flash中的程序空间有1 KB被RAM程序空间覆盖掉,所以逻辑上它的程序空间依然是64 KB,但数据空间变为7 KB+448 KB,共455 KB。微控制器核通过扩展的SFR寄存器FLASH_PAGE按32 KB×16页的页面方式访问Flash存储器,其中包括程序空间和数据空间,如图3所示。 图3 程序空间和数据空间的划分和映射 在对Flash存储器件进行写操作后的某一段时间内(从几十μs~几百μs),对它进行读操作是不能读出一个确切值的,这是Flash存储器件的一个特性。本设计中程序和数据存放在同一个AM29LV040 Flash存储器中。在对Flash存储器进行写操作时,要不断地从其中读出进行写操作的程序指令,然后对它本身进行写操作。微控制器核在20 MHz的时钟频率下,指令周期大约是200 ns,即每隔200 ns左右,SoC就要从Flash存储器中读取一条指令。这显然和上述的Flash存储器特性发生了冲突。 通过对编译环境的设定,可以把进行写Flash操作的函数unsigned char WriteData_FLASH (unsigned char * dest, unsigned char *scr, unsigned int len) 和Flash扇区擦除函数unsigned char EraseSector_FLASH (unsigned char sector_index)定位到程序空间的1C00H~1FFFH,并备份到数据空间的0EC00H~0EFFFH。在应用程序的设备初始化函数 void DevicesInit()中,调用加载函数void LoadFLASHOpToRAM(),把对Flash进行写或者擦除操作的这1KB的程序代码从Flash加载到RAM的程序空间。以后凡是涉及到对 Flash的写或者擦除操作,都由硬件逻辑切换总线到RAM去执行这一段程序代码。这样,以不大的RAM开销,解决了不能同时对Flash进行读和写操作的矛盾。函数void LoadFLASHOpToRAM()的代码如下: #define PROG_RAM_DATA0xEC00 #define PROG_RAM_DATA_PAGE9 staTIc unsigned char xdata RAM_prog[1024] _at_ 0x1C00; void LoadFLASHOpToRAM(){ unsigned char xdata * p; FLASH_PAGE = PROG_RAM_DATA_PAGE; p = (unsigned char xdata *)PROG_RAM_DATA; memcpy(RAM_prog,p,1024
软硬件 设计 系统 SoC 短消息 终端 PSTN 相关文章:
- Android开发技巧:软硬件的巧妙整合(01-16)
- Android基本技术架构及其软硬件整合技术环节解析(01-12)
- 基于DSP的外部Flash存储器在线编程的软硬件设计(03-11)
- IEEE1394视频视觉系统中DSP软硬件设计(10-07)
- 嵌入式实时系统开发的软硬件考虑和关键工艺(10-26)
- 一种面向H.264视频编码器的SoC验证平台(06-05)