- UID
- 1029342
- 性别
- 男
|
一.测试板
所用实验板是参考ATMEL公司官方网站上发布的《AT91SAM7S-EK Evaluation Board User Guide》设计的,相当于AT91SAM7Sxx评估测试板,主要用于各种外围实验。大家可以自己搭板子,或者直接购买现成的AT91SAM7Sxx评估板。
实验板主要以AT91SAM7S64微控制器为核心,外部扩展4路模拟量输入,4个按钮和4个LED, I2C接口存储器,两个UART接口(其中一个可作程序下载的DBUG接口),1个USB设备接口。
AT91SAM7S系列微控制器是ATMEL公司最近推出的全球首个起步价低于3美元的ARM7内核闪存控制器,共有AT91SAM7S32/64/128/256四个型号,内部分别具有32KB/64KB/128KB/256KB的Flash ROM和8KB/16KB/16KB/32KB的SRAM,无需扩展存储器;除AT91SAM7S32外,其它都集成了USB 2.0 Device,另外还有10位的ADC、12路的DMA、I2C、SPI、PWM、实时时钟等众多外围部件,功能强大,特别适合具有8位单片机基础转学32位ARM的用户。
AT91SAM7S的中文手册,我随后放到资源下载区里,供大家交流。
二.开发工具
在8位单片机的开发过程中,都会用到诸集成调试环境和仿真器。同8位单片机一样,ARM也有自己的集成开发环境和硬件访真器。本次实验就是使用ADS1.2集成开发环境和技创的TecorICE并口JTAG仿真器,使用时类似于51的仿真器直接挂接在keil下使用那样。
我个人认为无论是ARM、DSP还是51或PIC等,其开发工具和开发过程都是类似的。简单的讲都是先在集成开发环境中编辑用户程序,然后经过编译、连接产生目标文件,再通过硬件仿真器进行仿真调试。而对于普通51仿真器与ARM仿真器,使用起来并没明显的不同,主要的差别大概在于仿真接口(或者说是仿真头)。普通51仿真器是使用与目标单片机管脚兼容的仿真头替代目标单片机,用户程序是在仿真器内部的仿真芯片上运行。ARM核处理器内置ICE(仿真调试模块),该模块通过标准的JTAG接口引脚与ARM仿真器相连,此时ARM仿真器作为上位调试软件与ARM核芯片之间的协议转换器。用户的目标调试文件被下载到目标板上的存储器(可以是外部的或ARM处理器内部的存储器)中,通过控制目标芯片的仿真模块实现仿真调试。
第一个实验
一.背景
有了仿真器与AT91SAM7S64实验板后,像拿到一个不熟悉的普通单片机一样,希望能够写个小程序在里面跑跑,来开始第一步!在做这个实验前,我快速的阅读了AT91SAM7S64数据手册和《ARM体系结构与编程》(我认为这本书非常不错),还有techorICE仿真器的使用手册,并着重阅读了ADS软件、仿真器的使用以及起动代码方面的知识,因为这些都是马上要用到的。
二.实验目的
运用ADS编写一个小程序,使程序能够从起始的汇编代码运行到C程序的main()函数(这也可称作非常简单的起动代码),并通过仿真器连接目标板,最终能够在AT91SAM7S64里正确运行。
三.实验程序和参数设置
1. 连接器的选项设置
选项设置如图2-1所示。因为在AT91SAM7S64中FLASH存储器的地址是以0x0开始,而SRAM的地址是以0x00200000开始,所以我将参数设置的RO Base和RW Base分别设置成了0x0和0x00200000。
注:ADS的使用,我将重新写篇笔记来说明。
2. 启动代码
在ARM应用系统中,芯片复位后,在进入C语言的main()函数前,都要执行一段启动代码。该代码一般都是用汇编语言编写,用来完成系统运行环境和应用程序的初始化,详情请参考有关书籍。由于本实验的目的很简单,就是想让程序复位后,进入main()函数,所以有些初始化代码尽量精简,留下了下述代码。另外,__main是C语言的内部库函数,可以在进入用户main()之前完成内部RAM的初始化工作,类似KeilC51中的startup.a51。当执行完__main这段代码后,再跳转到main()函数。
AREA init,CODE,READONLY
CODE32
Mode_USR EQU 0x10 ;CPSR中各种处理器模式对应的控制位
I_Bit EQU 0x80 ;CPSR中的中断禁止位
F_Bit EQU 0x40
USR_Stack EQU 0x00203000 ;定义RAM的最高地址,无重映射
ENTRY
B InitReset ; 0x00 Reset handler
undefvec B undefvec ; 0x04 Undefined Instruction
swivec B swivec ; 0x08 Software Interrupt
pabtvec B pabtvec ; 0x0C Prefetch Abort
dabtvec B dabtvec ; 0x10 Data Abort
rsvdvec B rsvdvec ; 0x14 reserved
irqvec B irqvec ; 0x18 IRQ
fiqvec B fiqvec ; 0x1c FIQ
InitReset
MSR CPSR_c,#Mode_USR | I_Bit | F_Bit ;改成用户模式且禁止IRQ和FIQ中断
LDR SP,=USR_Stack
IMPORT __main
b __main ;跳转到__main执行,它位于C运行时库中
END
3. C语言主函数
v在C语言主函数中做了一个死循环,如下述所示。
int main(void)
{
while (1);
} |
|