ARM系统代码固化的串口实现方法
定寄存器写入地址和数据命令,就可对Flash存储器进行烧写、擦除等操作。编程指令只能使“1”变为“0”,而擦除命令则可使“0”变为“1”,因此正确的操作顺序是先擦除、后编程。当Flash被擦除后读出的数据应为0xff。写指令编程如下:
*((volatile uint16 *)start_addr + addr_unlock1)=data_unlock1;
start_add为Flash起始地址,addr_unlock1为0x555,//data_unlock1为0xaaaa
*((volatile uint16 *)start_addr +addr_unlock2)= data_unlock2;
//addr_unlock2为0x2aa,data_unlock2为0x5555
*((volatile uint16 *)start_addr +addr_unlock1)= setup_write;
//setup_write为0xa0a0
*to_add=data_pra;//写入数据
应在每个单元烧写命令发出后进行检测,以保证前一个单元烧写结束后再进行下一个存储单元的烧写,当然也可采用延时等待的方法进行连续的烧写。
2.3 编译与执行
由于日本OKI公司的小灵通芯片ml7338是基于ARM7TDMI核,所以系统采用ARM集成开发调试环境ADS1.2,使用TechorICE仿真器。具体编译语句如下:
armlink Startup.o main.o
-rw-base 0x10000000
-first Startup.o(vectors)//中断向量表位于映像头部
-o loader.axf
-info totals
其中,0x10000000是ml7338内部RAM的起始地址,编译完成后生成loader.axf文件。
需要注意的是,要固化的代码应转化为SRecord文件。可在编译器下ARM fromELF﹥Output format中选择Motorola 32 bit Hex,或者使用以下编译语句处理:
>fromelfnodebug filename.axfm32 filename.txt
以上两种方式都将产生SRecord文件。通过仿真器把烧写程序下载到ml7338的内部RAM中,运行后即可固化PC端通过串口工具发送过来的应用程序代码。固化完成后拔掉仿真器,当系统复位或上电后Flash存储器被映射到起始地址0x0处,装入的可执行映像文件即可得到执行。
结语
本文所写的烧写程序虽然是针对小灵通芯片ml7338的,但是已经把它拓展到了基于ARM的32位嵌入式系统,开发人员只需对框架略做修改即可编写自己的烧写程序。整个系统采用ARM汇编语言和C语言开发,因此可以方便地移植,而且对编写基于网口的监控程序也具有重要的参考价值。
- 基于ARM的嵌入式系统程序开发要点(12-02)
- ARM·系统时钟(MPLL,UPLL)(11-24)
- ARM系统中函数调用时参数传递规则(11-21)
- ARM应用系统开发详解 第4章 ARM程序设计基础(11-20)
- 关于ARM系统的堆栈(11-20)
- ARM系统中断产生流程(11-20)