AT91SAM7S64调试笔记
- 格式:pdf
- 大小:391.55 KB
- 文档页数:28
ARM入门笔记(1)前言如果您是一个单片机爱好者,当见到一款功能强大、性价比高的处理器时,一定会有一股很想掌握它、运用它的冲动,起码我是这样。
5年前第一次接触单片机(标准的51系列),就被它强大的功能所吸引,而痴迷于它,一直到今天。
在这期间的不同时期,各种增强型51,PIC、AVR,DSP和ARM等不同程度的吸引和诱惑着我。
有的已经玩过了,有的则没有,但很想玩的这股冲动一直存在心里,特别是对ARM。
记得2002年我就知道了ARM这个东东,眼睁睁地看着它一天天的火热,但由于对其开发工具及开发过程的不了解等原因一直只处于认识的阶段,尽管也曾玩过ZLG的2104开发板!可能是ZLG团队做的太出色的原因吧(详细的教材与源码,还有非常方便的工程模板),没过多久、没费多少劲就把里面的实验做完了,然后由于自已性格上的缺陷把它给扔在了一边,导致不到一个月就把大部分的东东还给了周老师。
直到前段时间,让我有机会真真正正的玩起了ARM!像最初玩8051那样的尽兴(出现问题时,吃不下饭、睡不着觉的那种痛苦和解决问题后的那种畅快)。
这篇文档就是记录了我在前段时间学习、调试目前最低价的ARM核处理器——AT91SAM7Sxx 时出现的问题与解决方法。
它尽量完整地记录了我从开始不懂ARM,到最终完成AT91SAM7S64各种外围实验的各个环节及整个过程,包括我在开始一个实验前的一些想法,实验目的,以及各个实验中,我以单片机的思维去思考时遇到的各种问题,和这些问题的解决方法。
现将自己的一点经验以及体会拿出来与大家共同分享,一来是希望能够为那些在ARM门口徘徊迷茫的人提供一些借鉴,使他们顺利越过这道门槛;二来是希望能够抛砖引玉,以结识更多有共同爱好的朋友。
由于我也是新手上路,文章中难免疏漏与错误,希望大家不吝指正,如果在调试AT91SAM7Sxx时有什么问题,欢迎大家共同讨论。
第一章开发工具与调试环境一.目标板所用实验板是参考ATMEL公司官方网站上发布的《AT91SAM7S-EK Evaluation Board User Guide》设计的,相当于AT91SAM7Sxx评估测试板,主要用于各种外围实验,结构框图如图1-1所示。
AT91SAM7S的中断AT91SAM7S的中断2010年07月02日星期五13:11关于中断大体可以这样理解:处理器内核有两个中断接口FIQ(快速中断请求)和IRQ(标准中断请求),而片内高级中断控制器利用这两个接口将外设的中断请求有序的传递到内核。
而如何将多达32个中断请求只用两根线传递到内核呢?这是借助硬件软件两方面的分发处理来完成的。
首先AIC为每一个外设或中断源提供了一个中断源向量寄存器(AIC_SVR0~AICSVR31),在配置使能相应外设时用户将设备的中断处理函数地址存入对应的源向量寄存器,而当中断请求发生时AIC将对应的源向量寄存器中的地址复制到中断向量寄存器(AIC_IVR)并向内核发出IRQ请求。
以上是硬件实现的中断分发过程,然而在用户程序中也必须做相关处理才能完成IRQ的分发处理,对于内核来讲IRQ只是一个中断向量,当IRQ中断请求时内核会跳到一个固定的地址(即IRQ向量)处理中断,用户程序(ARM的启动代码)必须在这个IRQ中断程序中分发处理才能分辨不同的设备的中断请求,但有了上面这样硬件的预处理过程,软件分发处理变得比较简单,跳到AIC中断向量寄存器中地址处即可,下面具体看一下启动代码:PROGRAM?RESET RSEG INTRAMSTART_REMAP RSEG INTRAMEND_REMAP RSEG ICODE:CODE:ROOT(2)CODE32;Always ARM mode after reset org 0reset BInitReset;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:;此处是IRQ向量,它是固定的地址B IRQ_Handler_Entry;0x18 IRQ fiqvec:;0x1c FIQFIQ_Handler_Entry:IRQ_Handler_Entry:;IRQ处理例程;-Manage Exception Entry;-Adjust and save LR_irq in IRQ stack sub lr,lr,#4 stmfd sp!,{lr};-Save SPSR need to be saved for nested interrupt mrs r14,SPSR stmfd sp!,{r14};-Save and r0 in IRQ stack stmfd sp!,{r0};-Write in the IVR to support Protect Mode;-No effect in Normal Mode;-De-assert the NIRQ and clear the source in Protect Mode ldr r14,=AT91C_BASE_AIC ldr r0,[r14,#AIC_IVR]str r14,[r14,#AIC_IVR];-Enable Interrupt and Switch in Supervisor Mode msr CPSR_c,#ARM_MODE_SVC;-Savescratch/used registers and LR in User Stack stmfd sp!,{r1-r3,r12,r14};-Branch to the routine pointed by the AIC_IVR跳到AIC_IVR寄存器内地址处,这便是软件分发处理过程mov r14,pc bx r0;-Restore scratch/used registers and LR from User Stack ldmia sp!,{r1-r3,r12,r14};-Disable Interrupt and switch back in IRQ mode msr CPSR_c,#I_BIT|ARM_MODE_IRQ;-Mark the End of Interrupt on the AIC ldr r14,=AT91C_BASE_AIC str r14,[r14,#AIC_EOICR];-Restore R0 ldmia sp!,{r0};-Restore SPSR_irq and r0 from IRQ stack ldmiasp!,{r14}msr SPSR_cxsf,r14;-Restore adjusted LR_irq from IRQ stack directly in the PC ldmia sp!,{pc}^这样,我们就知道:某一片内外设使用了AIC的哪一个输入通道是与内核无关的,它与具体芯片厂家的设计有关。
lib_AT91SAM7S64: 09/01/2004lib_AT91SAM7S64: 01/23/2006//函数使用的方式:1>AT91F_PIO_Enable(AT91C_BASE_PIOA,LED1);2>AT91S_PMC *pPMC = AT91C_BASE_PMC;pPMC->PMC_SCER=AT91C_PMC_PCK0;3>*AT91C_PIOA_PER= LED1;异同:1>对于如下,编译器编译结果会不同:if(AT91F_PIO_GetInput(AT91C_BASE_PIOA) &(LED2)==LED2)与if((AT91F_PIO_GetInput(AT91C_BASE_PIOA) &(LED2))==LED2) [程序中要使用这种方式]其中LED2为(#define LED2 (1<<1))如果LED2为(#define LED2 (1<<0))则没区别2>//基本地址( AT91SAM7S64)#define AT91C_BASE_SYS ((AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address#define AT91C_BASE_VREG ((AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address#define AT91C_BASE_PDC_SPI ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI) Base Address#define AT91C_BASE_SPI ((AT91PS_SPI) 0xFFFE0000) // (SPI) Base Address#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address #define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address #define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address//外设ID( AT91SAM7S64)#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) #define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller#define AT91C_ID_3_Reserved ((unsigned int) 3) // Reserved#define AT91C_ID_ADC ((unsigned int) 4) // Analog-to-Digital Converter#define AT91C_ID_SPI ((unsigned int) 5) // Serial Peripheral Interface#define AT91C_ID_US0 ((unsigned int) 6) // USART 0#define AT91C_ID_US1 ((unsigned int) 7) // USART 1#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2#define AT91C_ID_15_Reserved ((unsigned int) 15) // Reserved#define AT91C_ID_16_Reserved ((unsigned int) 16) // Reserved#define AT91C_ID_17_Reserved ((unsigned int) 17) // Reserved#define AT91C_ID_18_Reserved ((unsigned int) 18) // Reserved#define AT91C_ID_19_Reserved ((unsigned int) 19) // Reserved#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) #define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1)//[AT91F_PIO_CfgPeriph]AT91F_PWMC_CH3_CfgPIO:设置PIO控制器驱动PWM3 [AT91F_PIO_CfgPeriph]AT91F_PWMC_CH2_CfgPIO: 设置PIO控制器驱动PWM2 [AT91F_PIO_CfgPeriph]AT91F_PWMC_CH1_CfgPIO: 设置PIO控制器驱动PWM1 [AT91F_PIO_CfgPeriph]AT91F_PWMC_CH0_CfgPIO: 设置PIO控制器驱动PWM0 [AT91F_PMC_EnablePeriphClock]AT91F_SSC_CfgPMC:使能SSC在PMC中的时钟[AT91F_PIO_CfgPeriph]AT91F_SSC_CfgPIO: 设置PIO控制器驱动SSC[AT91F_PMC_EnablePeriphClock]AT91F_SPI_CfgPMC:使能SPI在PMC中的时钟[AT91F_PIO_CfgPeriph]AT91F_SPI_CfgPIO: 设置PIO控制器驱动SPI[AT91F_PMC_EnablePeriphClock]AT91F_PWMC_CfgPMC: 使能PWM在PMC中的时钟[AT91F_PMC_EnablePeriphClock]AT91F_UDP_CfgPMC: 使能UDP在PMC中的时钟1)PIO I/O逻辑:a)时钟使能时读引脚电平才有效b)时钟使能时输入引脚变化中断才有效c)PIO可控制外围引脚(0-31)是由PIO控制还是外设A/B(其中外设A/B是IC内部的功能模块)d) D要注意的是,所有I/O 输出的电流之和不能超过150 mA。
ATMEL SAM-BA™ and SAM-PROG用户手册译者:版本:Rev2.0日期:2007-06目录一、SAM-BA™ and SAM-PROG 简介二、SAM-BA™ 工作流程三、SAM-BA™ 安装四、SAM-BA™ 烧写AT91SAM7S的具体操作五、SAM-BA™ 烧写AT91SAM7X系列的注意事项六、SAM-BA™ 烧写AT91SAM9260/9261的具体操作一、SAM-BA™ and SAM-PROG: Atmel's Flasher Tools术语:——SAM-BA GUI(SAM-BA图形用户界面)和SAM-PROG为PC端应用程序——SAM-BA BOOT为固化于微控制器端的应用程序SAM-BA™ BootATMEL的应用程序(SAM-BA GUI和SAM-PRO)均使用了嵌入在ROM 中的SAM-BA Boot固件。
SAM-BA Boot固件对芯片进行如下初始化:——启动PLL输出,为USB外设提供一个48MHz的工作频率,——连接USB外设,——连接USART外设,——等待一个来自于USB或者COM的主机连接(PC)。
SAM-BA的主要特性如下:——通过RS232或者USB接口提供ISP操作,——可以通过基于Windows的GUI或者基于DOS的命令行进行操作,——运行于Win2000和WinXP,——可以显示存储器和外设的内容,——目标器件存储器(FLASH)操作:读、写、擦除、配置、校验等——允许使用用户脚本二、SAM - Boot Assistant (SAM-BA™)——第一点:本快速入门适用于以下器件:——AT91SAM7S32和AT91SAM7S64适用于REV E及以上版本(产品ID:58814E)——AT91SAM7S321适用于REV A及以上版本(产品ID:58837A)——AT91SAM7S128和AT91SAM7S256适用于REV B及以上版本(产品ID:58818B)——第二点:——AT91SAM7S-EK(或者用户自己的基于AT91SAM7S的应用)必须遵从包含两个步骤的“系统恢复程序(System Recovery Procedure)”启动时序。
AT91SAM7S64 SPI主机模式固定外设使用技巧
王娜
【期刊名称】《单片机与嵌入式系统应用》
【年(卷),期】2008(000)003
【摘要】AT91SAM7S64是Atmel公司基于32位ARMRISC处理器的微控制器,支持多种外围设备,包括1个USB2.0全速设备口和主/从同步串行外设接口(SPI)。
【总页数】4页(P72-75)
【作者】王娜
【作者单位】北京工业大学
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于AT91SAM7S64与MAX7219间SPI通信设计与实现 [J], 米红菊;吴志红;
王百彦;彭文彬;陈红
2.计算机外设的主机侧软件设计模式 [J], 李顺达
3.外设接口(SPI)版本电机驱动器 [J],
4.专为串行外设接口(SPI)通信系统而优化的新型数字隔离器系列 [J],
5.26MHz SPI接口USB外设控制器 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。
使用SAM-BA调试的初始步骤AT91SAM7S板可以使用SAM-BA?软件通过DBGU或者USB口编译。
但是AT91SAM7S 系列芯片,出厂后并没有将SAM-BA Boot 固件复制到FLASH 存储器的头两个区,所以当第一次通过USB 连接目标板和PC 机的时候,需要按照“以下的步骤来复制SAM-BA Boot 固件到FLASH 并运行。
1.1.关闭AT91SAM7S板电源;2.2.把板上的TST跳线连接;3.3.打开AT91SAM7S板电源;4.4.等10秒;5.5.关闭AT91SAM7S板电源;6.6.把板上的TST跳线断开;7.7.打开AT91SAM7S板电源;8.8.安装USB驱动程序:插上USB线,将提示“无法识别的硬件”,此时可以安装atm6124驱动程序9.9.打开“SAM-BA GUI”,就可以接着使用USB口下载文件到AT91SAM7S板。
SAM-BA调试的硬件要求:-∙DBGUG的硬件要求o使用3~20MHz的石英震晶(软件自调适);∙-USB的硬件要求o使用18.432MHz的石英震晶;o U SB的PIOA16口需要上拉电阻;/dev/SAM-BA%20Notes.htmSAM-BA Notes V1.0 - May 2005The below procedure is applicable to:AT91SAM7S32 & AT91SAM7S64 starting from rev E (product ID: 58814E)AT91SAM7S128 & AT91SAM7S256 starting from rev C (product ID: 58818C)Getting Started with SAM-BA on the SAM7S-EK Evaluation KitThe AT91SAM7S-EK is ready to use the SAM-BA™ software through DBGU or USB. Before being able to use SAM-BA, a recovery procedure which consists of copying the SAM-BA Boot Assistant into Flash must be performed as follows:1.Power down the SAM7S-EK2.Close the Jumper JP5 named TST3.Power up the SAM7S-EK4.Wait 10s5.Power down the SAM7S-EK6.Remove the Jumper JP5 named TST7.Power up the SAM7S-EKSAM-BA Boot Assistant is now available in the first two sectors of the on-chip flash and ready to use.Then, you can start using the SAM-BA GUI to interface with the SAM-BA Boot Assistant as described in the SAM-BA User Guide available in the "on-line" help.How to use SAM-BA on your AT91SAM7S-based devices application ?The AT91SAM7S devices feature the System Recovery procedure which restores the SAM-BA™ Boot Assistant inside the Flash.System Recovery ProcedureWhen the TST pin is set during power-up and PGMEN0, PGMEN1 and PGMEN2 are set, the device is entering is a specific test mode and performs a SAM-BA™ Boot System Recovery which consists in copying the SAM Boot Assistant (SAM-BA™) in the first two sectors of the on-chip Flash memory. The system recovery procedure takes 10s.In normal mode, the TST pin can be left unconnected thanks to the internal pull down.Please note that on the SAM7S-EK, PGMEN0, PGMEN1 and PGMEN2 are set by using the internal pull-up resistors enabled by default after power-up.SAM-BA Boot Assistant is now available in the first two sectors of the on-chip flash and ready to use. Then, you can start using the SAM-BA GUI to interface with the SAM-BA Boot Assistant as described in the SAM-BA User Guide available in the "on-line" help.SAM-BA hardware requirements:-∙DBGU Requirementso W ide range of Quartz from 3 to 20MHz Quartz (software auto detection) ∙-USB Requirementso L imited to a 18.432MHz Quartzo P IOA16 dedicated for the USB Pull-up (refer to the AT91SAM7S-EK Board Schematics)原文地址/testcode/123399/message.aspxSAM-BA BOOT (转自芯艺)2008-05-29 16:08一.原理AT91SAM7S64内部“隐藏”着一段程序叫SAM-BA BOOT,它是在出厂时被固化的,不会被擦除,也不会被重写。
常州大学毕业设计任务书信息科学与工程学院计算机专业093 班侯松同学:现给你下达毕业设计(论文)任务如下,要求你在预定时间内,完成此项任务。
一、毕业设计(论文)题目基于AT91SAM7S64的USB通信模块设计二、毕业设计(论文)背景USB 技术已经越来越普及和成熟,低成本、高稳定性、较高的数据传输速率和即插即用的方便性,使其备受硬件厂商的青睐。
目前许多微型计算机和工业计算机的配置中,RS232串口通信已经逐步被USB通信接口替代。
因此开发工业控制领域中的USB 通信电路是非常有价值的。
目前有很多可以用于嵌入式系统的USB Device模块,还有一些Soc 芯片集成了USB Device模块。
其中ATMEL公司的AT91SAM7SXX系列ARM芯片内部就集成有USB Device部件。
三、毕业设计(论文)目标、研究内容和技术要求基于AT91SAM7S64的ARM平台,设计其USB通信功能,具体完成如下工作:(1) 熟悉USB接口规范,设计AT91SAM7S64 下的USB接口电路;(2) 完成上位机的USB的驱动程序(3) 编写AT91SAM7S64下的USB通信程序,(4) 编写PC机方的应用测试程序,实现和AT91SAM7S64 的USB双向通信过程。
四、课题所涉及主要参考资料[1] 刁志刚. 基于ARM单片机的USB数据传输的设计与应用[J].信息技术:2010(8):181-183[2] 蔡欣荣.基于ARM的HID类自定义功能键盘研究与实现[J]. 工业控制计算机:2011,24(57):14-18[3] 仲伟峰,李全利,徐军. 基于ARM的嵌入式USB主机系统设计[J].哈尔滨理工大学学报:2010,15(6):42-46[4] 张永安,杨松,孙丽. 基于ARM架构的嵌入式USB驱动的设计[J]. 内蒙古农大学学报:2008,29(4):200-202[5] 黄敏. 基于ARM下的USB设备固件程序初始化设计[J]. 六盘水师范高等专科学校学报:2007,19(6) :25-26[6] 方旭.基于STM32处理器和PC主机的USB通信协议的实现[D].山东:山东大学,2009.[7] 王平,施文灶,黄唏,江华丽. 基于嵌人式ARM9的USB设计与实现[J]. 现代电子技术:2009 :33-36[8] 熊骁. USB2.0运用ARM芯片进行通信接口的设计[J].软件导刊:2010,9(8):96-97五、进度安排周次工作内容预定目标1 毕业设计调研实习明确毕业课题的意义;实习总结撰写规范2-4 翻译相关英文资料;熟悉任务要求,熟悉AT91SAM7S64平台及相关编程软件。
学号:常州大学毕业设计(论文)(2013届)题目基于AT91SAM7S64的无线温湿度监控系统设计学生学院信息科学与工程学院专业班级通信工程091 校内指导教师专业技术职务讲师二○一三年六月学位论文独创性声明本人郑重声明:所提交的学位论文是本人在导师的指导下,独立进行研究工作所取得的成果。
除文中已经注明引用的内容外,本论文不含其他个人或集体已经发表或撰写过的研究成果,也不含为获得常州大学或其它教育机构的学位证书而使用过的材料。
对本文的研究作出重要贡献的个人和集体,均已在文中以明确方式标明。
本人承担本声明的法律责任。
签名:日期:说明:本页签名及日期均为手签。
基于AT91SAM7S64的无线温湿度监控系统设计摘要:在现代科技发展过程中,嵌入式系统在诞生之初就有着独特的地位,进入信息时代,在更多的新技术支持下,走向一个新的发展时代,即从普遍的低端应用进入到一个高、低端并行发展的时代,其主要标志是32位MCU的大范围应用。
随着众多嵌入式系统厂家的参与,基于ARM系列处理器的应用技术广泛的应用到各个领域,更加的方便了人们的生活和工作。
温湿度的自动测量和现实在生活和生产中具有非常重要的意义。
以往的人工采集数据不仅占用人力资源,而且可靠性低,容易发生差错,不能满足现代化的需求。
一般的温湿度采集系统数据显示单调,而且需要在复杂的地区布线,十分的不便。
本文采用应用广泛的ARM系列微处理器AT91SAM7S64作为平台的核心构建系统。
主机负责数据的采集和发送功能,使用51单片机负责数据的接收功能,在计算机上显示数据参数。
温湿度采集模块采用温湿度传感器芯片DHT11,无线收发模块采用无线数传模块nRF24L01。
本项目能够实时采集周围环境的温度和湿度,且不受布线的约束,是适应现代社会的高价值研究。
关键字:AT91SAM7S64;温湿度监测;无线数传模块;温湿度传感器Design of Environmental Monitoring Node on Single-chipAT91SAM7S64 based wireless temperature and humiditymonitoring system designABSTRACT:In the process of development of modern science and technology, embedded system has a unique position near the beginning of the birth , into the information age, more new technology support, toward a new era of development , from the common low-end applications into a high and low end of the era of parallel development, the main sign is the widespread application of 32-bit MCU. As many embedded systems manufacturers participate in, based on ARM series processor application technology is widely applied to various fields, more convenient people's life and work.Temperature and humidity automatic measurement and practical in life and production has very important significance. Previous artificial data not only takes up human resources, and low reliability, prone to error, cannot meet the needs of modernization. Normal temperature and humidity data acquisition system show drab, and needs in areas of complex wiring, very inconvenient.Based on the widely used ARM series microprocessor AT91SAM7S64 at the core of platform build system. Host is responsible for data collection and send function, using 51 MCU is responsible for the receiving function of data, data parameters displayed on the computer. Temperature and humidity acquisition module using DHT11 temperature and humidity sensor chip, nRF24L01 wireless transceiver module USES the wireless data transmission module.This project can collect real-time temperature and humidity of the surroundings, and is not bound by wiring, the high value of research is to adapt to the modern society.Keywords:AT91SAM7S64; Temperature and humidity monitoring; Wireless data transmission module; Temperature and humidity sensor目录摘要: (II)1 引言 (1)1.1课题背景及研究的意义 (1)1.2课题研究的目的 (1)1.3国内外现状及发展趋势 (1)1.4论文结构安排 (2)2系统硬件设计 (3)2.1硬件总体设计 (3)2.2ARM系统板介绍 (3)2.3温湿度采集模块设计 (5)2.4无线收发模块设计 (6)2.4.1数据发送模块设计 (6)2.4.2数据接收模块设计.............................................................................................. 错误!未定义书签。
ATARM快速入门-基于AT91SAM7S系列ARM微控制器作者:Team Mcuzone网址:版本:Rev1.0a日期:2006-11版本信息:Rev1.0a: 2006-11成稿,原始版本版权信息:本资料部分资料取材于网络,若侵犯到某些个人或者公司的版权或其他利益,请主动和我们联系,我们将注明、更改、删除相关内容。
联系方法:QQ:8204136手机:139********MSN:hdapple_2000@目录介绍篇:1,ARM简介;2,AT91简介;3,ARM开发环境KEIL,IAR,ADS,RV,WINARM简介;4,ARM开发工具WIGGLER,MULTI-ICE,XLINK,ULINK简介;5,SAM7S32学习板介绍;6,LED范例演示;7,ARM/Thumb汇编指令集;硬件篇:1,AT91SAM7S供电(系统电源,1.8V,PLL);2,时钟设置,PLL设置,32K时钟;3,RESET电路(RESET电路);4,DBGU/ISP/BOOT;5,JTAG电路;6,ADC电路;7,IIC/TWI;8,SPI;9,USART10,PWM11,AIC;12,PMC;13,RTT;14,USB UART15,原理图介绍,分析,JTAG调试,DBGU下载演示软件篇:00,汇编指令分析;01,启动代码分析,头文件分析;1,GPIO(LED/KEY);2,UART;3,IIC/TWI(24C02);4,ADC(温度,光照度);5,Timer;6,RTT;7,PWM(LED);8,Uc/OS II;进阶篇:1,7S64的USB应用(S64-DEK);2,7X256的USB应用(7X256 LITE/EK);3,7X256的CAN应用(7X256 EK);4,7X256的NET应用(7X256 LITE/EK);附录:1,IAR下wiggler,MULTI-ICE的使用;2,SAM-BA中文用户手册;3,MULTI-ICE用户手册;4,XLINK用户手册;在开始阅读本书前,建议浏览一下ARM公司推荐的关于ARM的中文出版物,然后找几本比较适合自己的入门书籍来做一下预习工作,当然,也可以将本站整理的资料做为您的ARM入门必读书籍。
compiling spi.c...linking...LYH_HeightCtr.axf: Warning: L6305W: Image does not have an entry point. (Not specified or not set due to multiple choices.)Program Size: Code=29672 RO-data=296 RW-data=168 ZI-data=9840FromELF: creating hex file..."LYH_HeightCtr.axf" - 0 Error(s), 1 Warning(s).Warning : L6305W : Image does not have an entry point2008-10-10 14:38 KEIL 编译时出现警告:“Warning : L6305W : Image does not have an entry point”。
该编译警告将引起运行AXD调试的时候,程序直接就从__main标号的地方或者其他地方开始执行,同时在debug log 信息框还会出现“DBT Warning 00136:Image has no entry point”的提示信息。
这个问题出现的原因是由于ENTRY顶格书写,造成编译器认为ENTRY是一个普通的标号,不是关键字。
所以,该问题解决办法就不言而喻了...(在ENTRY前加空格或tab键,总之就是不能顶格书写)另外,出现该警告还跟OPTION选项里的ARM Linker设置有关,先设置好,再编译连接.具体参考如下:linker 页里 RO Base 设成 0x40000000,RW Base 设成 0x40003000入口地址。
Project - Options - Linker--Misc Controls貌似沒有將 Startup.a 加入到 keil 工程內,找不到從何而入的狀況吧?!找到原因了,是scf文件没有导进去。
基于AT91SAM7S64与MAX7219间SPI通信设计与实现米红菊;吴志红;王百彦;彭文彬;陈红【摘要】随着电子技术的进步,发展出了很多总线接口,如USB, I2C, CAN, SPI等.它们的特点都采用了串行接口,只需一根或几根线就可以实现数据的传输.在嵌入式设备的开发中,这些接口的应用,使得处理器和其他外设很容易实现串行通信,大大的简化电路,提高了传输的可靠性.详细介绍了以ARM7TDMI为核心的芯片AT91SAM7S64的串行外设接口SPI,同时给出了带SPI接口的LED驱动芯片MAX7219的工作原理,并从硬件和软件上实现两芯片的SPI数据通信,最终驱动LED,得到一种稳定、可靠、高速的显示技术方案.【期刊名称】《现代电子技术》【年(卷),期】2008(031)013【总页数】4页(P96-99)【关键词】串行外设接口;AT91SAM7S64;MAX7219;keil uv3 for arm【作者】米红菊;吴志红;王百彦;彭文彬;陈红【作者单位】四川大学电气信息学院,四川成都,610064;解放军后勤工程学院,重庆,400041;四川大学计算机学院,四川成都,610064;视觉合成图形图像技术国防重点学科实验室,四川成都,610065;四川大学电气信息学院,四川成都,610064;四川大学电气信息学院,四川成都,610064;四川大学电气信息学院,四川成都,610064【正文语种】中文【中图分类】TP312;TP368.1AT91SAM7S64是Atmel公司推出的以ARM7TDMI为核心的32位总线RISC 处理器,在具有与32位ARM处理器的内核一致,功能强大等优点的同时不失操作和编程的方便性。
它拥有64 kB的高速FLASH和16 kB的SRAM,其外设功能的应用,如UART,SPI,PWM,TWI,USB 2.0,ADI及定时器等都极大地丰富了芯片的外围扩展。
同时,它极具竞争力的性价比进一步拓展了它在低成本、大产量的嵌入式产品中的应用。
芯片基本功能模块分析• 集成了ARM7TDMI® ARM® Thumb® 处理器–高性能的32 位RISC架构–高密度的16 位指令集–性能/功耗(MIPS/Watt) 的领先者–嵌入式ICE电路仿真,支持调试通讯分析:可以由FOUNDRY厂家license ARM7来解决,属于普通的ARM7内核• 64K 字节的片内高速Flash存储器,共512 页,每页128 字节–在最坏的条件下可以30 MHz 的速度进行单时钟周期访问,预取(Prefetch) 缓冲器可以实现Thumb指令的优化,使处理器以最快的速度执行指令–页编程时间为4 ms,包括页自动擦除,全片擦除时间为10 ms– 10,000 次的写寿命,10 年数据保持能力,扇区锁定功能,Flash 安全锁定位–适合量产的快速Flash编程接口分析:高速Flash也是由工艺厂家提供解决,但要分析性能与参数是否满足要求非易失性掉电检测控制掉电检测(BOD) 由两个通用的NVM (GPNVM)位控制。
因此即使没有了电源,掉电检测仍然可以保持用户的定义。
两个GPNVM 位的清除和设置分别通过EFC 用户接口的“清除通用NVM 位”命令和“设置通用NVM 位”命令来实现。
GPNVM 位0用于控制掉电检测的使能。
设置GPNVM0 将使能BOD,清除它即禁止BOD。
拉高ERASE 将清除GPNVM0,从而禁止BOD。
GPNVM 位1控制掉电检测信号是否可以用于系统复位。
置位GPNVM1使能这个功能,清零GPNVM1 则禁止掉电检测信号复位整个芯片。
拉高ERASE 将禁止掉电检测复位。
8个NVM位用于标定掉电检测器及电压调节器。
• 16K 字节的片内高速SRAM,可以在最高时钟速度下进行单时钟周期访问操作分析:由厂家提供解决,但控制器需要前端设计解决• 存储器控制器(MC)–嵌入式Flash控制器,异常中断(Abort)状态及未对齐(Misalignment) 检测分析:还需要分析这个MC详细的功能包括哪些?• 复位控制器(RSTC)–上电复位和经过工厂标定的掉电检测–提供复位源信息以及给外部电路使用的复位信号分析:需要详细分析功能,尤其掉电检测机制• 时钟发生器(CKGR)–低供耗RC 振荡器,3 到20MHz 的片上振荡器和一个PLL分析:RC振荡器应该由厂家解决,PLL应该可以免费得到• 电源管理控制器(PMC)–可以通过软件进行电源优化,包括慢速时钟模式( 低至500 Hz)和空闲(Idle)模式–三个可编程的外部时钟信号分析:类似SOC时钟模块,提供一些可编程控制,时钟切换,需要前端设计实现• 先进的中断控制器(AIC)–可以单独屏蔽的、具有8 个优先级的向量式中断源–两个外部中断源和一个快速中断源,可以防止虚假(spurious)中断分析:需要分析功能,要看看网上是否由可用的免费模块• 调试单元(DBGU)– 2线UART,支持调试通讯通道中断;可通过程序来禁止通过ICE进行访问分析:仅仅是uart?• 周期性间隔定时器(PIT)– 20位可编程的计数器,加上12 位的间隔计数器分析:类似timer,但12bit的间隔计数器要分析• 11 个外设数据控制器(PDC) 通道外设数据控制器(PDC) 在诸如UART、USART、SSC、SPI、MCI 等片上外设与片内或片外存储器间传输数据。
特点Array•集成了ARM7TDMI® ARM® Thumb®处理器–高性能的32位RISC架构–高密度的16位指令集–性能/功耗(MIPS/Watt)的领先者–嵌入式ICE电路仿真,支持调试通讯•64K字节的片内高速Flash存储器,共512页,每页128字节–在最坏的条件下可以30 MHz的速度进行单时钟周期访问,预取(Prefetch)缓冲器可以实现Thumb指令的优化,使处理器以最快的速度执行指令–页编程时间为4 ms,包括页自动擦除,全片擦除时间为10 ms–10,000次的写寿命,10年数据保持能力,扇区锁定功能,Flash安全锁定位–适合量产的快速Flash编程接口•16K字节的片内高速SRAM,可以在最高时钟速度下进行单时钟周期访问操作•存储器控制器(MC)–嵌入式Flash控制器,异常中断(Abort)状态及未对齐(Misalignment)检测•复位控制器 (RSTC)–上电复位和经过工厂标定的掉电检测–提供复位源信息以及给外部电路使用的复位信号•时钟发生器(CKGR)– 低耗RC 振荡器,3 到20MHz 的片上振荡器和一个PLL•电源管理控制器(PMC)–可以通过软件进行电源优化,包括慢速时钟模式(低至500 Hz)和空闲(Idle)模式–三个可编程的外部时钟信号•先进的中断控制器(AIC)–可以单独屏蔽的、具有8个优先级的向量式中断源–两个外部中断源和一个快速中断源,可以防止虚假(spurious)中断•调试单元(DBGU)–2线UART,支持调试通讯通道中断;可通过程序来禁止通过ICE进行访问•周期性间隔定时器(PIT)–20位可编程的计数器,加上12位的间隔计数器•时间窗看门狗(WDT)–12位受预设值(key)保护的可编程计数器–为系统提供复位或中断信号–当处理器处于调试状态或空闲模式时可以停止计数器•实时定时器(RTT)–32位自由运行的具有报警功能的计数器–时钟来源于片内RC振荡器•一个并行输入/输出控制器(PIOA)–32个可编程的复用I/O,每个I/O最多可以支持两个外设功能–输入电平改变时,每个I/O都可以产生中断–可以独立编程为开漏输出、使能上拉电阻以及同步输出•11个外设数据控制器(PDC)通道•一个USB 2.0全速(12 Mbps)设备端口–片上收发器,328字节可编程的FIFO•一个同步串行控制器(SSC)–每个接收器和发送器都具有独立的时钟和帧同步信号–支持I²S,支持时分多址–支持32位数据传输的高速连续数据流功能•两个通用的同步/异步收发器(USART)–独立的波特率发生器,IrDA红外调制/解调–支持ISO7816 T0/T1智能卡,硬件握手信号,支持RS485–USART1支持全功能的调制解调器信号•主/从串行外设接口(SPI)–8到16位可编程的数据长度,4个片选线•一个3通道的16位定时器/计数器(TC)–3个外部时钟输入端,每个通道有两个多功能I/O引脚–倍速PWM发生功能,捕捉/波形模式,递增/递减计数2AT91SAM7S64 Preliminary6070A–ATARM–07-Jun-05•一个4通道的16位PWM 控制器(PWMC)•一个两线接口(TWI)–只支持主机模式,支持所有的Atmel 两线EEPROM•一个8通道的10位模数转换器,其中4个通道与数字I/O 复用•IEEE 1149.1 JTAG 边界扫描支持所有的数字引脚•5V 兼容的I/O ,包括4个高达16 mA 的大电流驱动I/O •电源–片上1.8V 电压调节器,可以为内核及外部元件提供高达100 mA 的电流–为I/O 口线提供电源的3.3V VDDIO ,以及独立的为Flash 供电的3.3V VDDFLASH –内核电源为1.8V VDDCORE ,并具有掉电检测(BoD )功能•全静态操作:极限条件下(1.65V ,85°C )高达55 MHz •封装为64脚的LQFP描述AT91SAM7S64是Atmel 32位ARM RISC 处理器小引脚数Flash 微处理器家族的一员。
Keil for ARM入门教程AT91SAM7S64--------------基于powered by myhk007QQ:19695057A T91SAM7S 系列的ARM 控制器是ATMEL 公司最近新出的具有很高的性价比的ARM ARM,,优点就不说了优点就不说了。
现在来教大家如何使用Keil 公司出品的专门针对ARM7系列的IDE 编译器Keil for ARM uVISION 来编程来编程。
我先来补充一下KEIL FOR ARM 的入门手册吧的入门手册吧,,算是对新学ARM 的兄弟们的一点帮助一点帮助((偶是看完了ARM KEIL FOR ARM 的英文说明书后才知道是怎么用的的英文说明书后才知道是怎么用的的英文说明书后才知道是怎么用的,,在此算是告诉后来的兄弟们一些基本使用常识算是告诉后来的兄弟们一些基本使用常识)) 首先首先首先,,我们来新建一个PROJECT 文件文件,,这个步骤和其他编译器一样的这个步骤和其他编译器一样的,,打开KEIL KEIL FOR ARM FOR ARM FOR ARM,,然后选择最顶上的PROJECT PROJECT--NEW PROJECT NEW PROJECT,,如下如下::] ]然后然后,,选择好要保存工程的文件夹选择好要保存工程的文件夹,,保存后保存后,,就会弹出来ARM 选择向导选择向导((对新手新手很有用的很有用的很有用的!!我们可以不必知道处理器的启动代码我们可以不必知道处理器的启动代码))如下如下::这里我们选择ATMEL 公司的AT91SAM7S64AT91SAM7S64,(,(当然当然当然,,如果你用的是其他的ARM 的话,就选择其他公司的ARM 了,这个向导对初学者来说非常有帮助的这个向导对初学者来说非常有帮助的))选好后确定确定,,就会弹出下面的对话框就会弹出下面的对话框::上面的意思是问你是不是需要把S64的启动代码复制到你新建的工程的的启动代码复制到你新建的工程的同一个同一个目录下目录下,,这里一定要选择YES YES,,当然当然,,如果你是自己写的启动代码的话如果你是自己写的启动代码的话,,那就不用了用了((啊?什么是启动代码什么是启动代码??呵呵呵呵!!好好看看 置顶的帖子吧置顶的帖子吧))然后然后,,我们就可以发现我们就可以发现,,在我们的KEIL 工作窗口的左边出现了一个工作窗口的左边出现了一个“source “source g r oup 1”oup 1”的文件夹的文件夹的文件夹,,这个这个,,就是我们新建的工程就是我们新建的工程,,在它下面的就是工程里面所用到的文件了用到的文件了,,现在里面只有一个现在里面只有一个"SAM7S.S""SAM7S.S""SAM7S.S"的文件的文件的文件,,这个是刚才我们复制过来的ARM 启动代码了启动代码了。
AT91SAM7S64调试笔记AT91SAM7S64调试笔记 (1)前言 (3)第一章开发工具与调试环境 (3)一.目标板 (3)二.开发工具 (4)第二章我的第一个实验 (4)一.背景 (4)二.实验目的 (4)三.实验程序和参数设置 (4)四.出现的问题与解决方法 (6)五.总结 (7)第三章点亮我的LED (7)一.背景 (7)二.实验目的 (7)三.实验程序和参数设置 (7)四.总结 (8)第四章键盘输入 (8)一.实验目的 (8)二.实验程序和参数设置 (8)三.出现的问题与解决方法 (8)四.总结 (9)第五章模拟量输入 (9)一.目的 (9)二.实验程序和参数设置 (9)三.总结 (10)第六章 RS232串口通信 (10)一.实验目的 (10)二.实验程序和参数设置 (10)三.出现的问题与解决方法 (11)四.总结 (11)第七章串口DMA控制实验 (12)一.背景 (12)二.实验目的 (12)三.实验程序和参数设置 (12)四.总结 (13)第八章中断控制实验 (13)一.背景 (13)二.实验目的 (13)三.实验程序和参数设置 (13)四.出现的问题与解决方法 (14)五.总结 (15)第九章地址重映射控制实验与重映射后的中断实验 (15)一.背景 (15)二.实验目的 (15)三.实验程序和参数设置 (15)四.出现的问题与解决方法 (21)五.总结 (21)第十章I2C接口实验 (21)一.实验目的 (22)二.实验程序和参数设置 (22)三.出现的问题与解决方法 (24)第十一章 USB 设备实验 (24)一.背景 (24)二.USB驱动安装说明 (24)三.实验目的 (25)四.实验源程序 (25)五.出现的问题与解决方法 (25)六.总结 (26)第十二章 ISP实验 (26)一.背景 (26)二.实验目的 (26)三.操作方法 (26)四.出现的问题与解决方法 (27)五.总结 (28)前言如果您是一个单片机爱好者,当见到一款功能强大、性价比高的处理器时,一定会有一股很想掌握它、运用它的冲动,起码我是这样。
5年前第一次接触单片机(标准的51系列),就被它强大的功能所吸引,而痴迷于它,一直到今天。
在这期间的不同时期,各种增强型51,PIC、A VR,DSP和ARM等不同程度的吸引和诱惑着我。
有的已经玩过了,有的则没有,但很想玩的这股冲动一直存在心里,特别是对ARM。
记得2002年我就知道了ARM这个东东,眼睁睁地看着它一天天的火热,但由于对其开发工具及开发过程的不了解等原因一直只处于认识的阶段,尽管也曾玩过ZLG的2104开发板!可能是ZLG团队做的太出色的原因吧(详细的教材与源码,还有非常方便的工程模板),没过多久、没费多少劲就把里面的实验做完了,然后由于自已性格上的缺陷把它给扔在了一边,导致不到一个月就把大部分的东东还给了周老师。
直到前段时间,让我有机会真真正正的玩起了ARM!像最初玩8051那样的尽兴(出现问题时,吃不下饭、睡不着觉的那种痛苦和解决问题后的那种畅快)。
这篇文档就是记录了我在前段时间学习、调试目前最低价的ARM核处理器——AT91SAM7Sxx时出现的问题与解决方法。
它尽量完整地记录了我从开始不懂ARM,到最终完成AT91SAM7S64各种外围实验的各个环节及整个过程,包括我在开始一个实验前的一些想法,实验目的,以及各个实验中,我以单片机的思维去思考时遇到的各种问题,和这些问题的解决方法。
现将自己的一点经验以及体会拿出来与大家共同分享,一来是希望能够为那些在ARM门口徘徊迷茫的人提供一些借鉴,使他们顺利越过这道门槛;二来是希望能够抛砖引玉,以结识更多有共同爱好的朋友。
由于我也是新手上路,文章中难免疏漏与错误,希望大家不吝指正,如果在调试AT91SAM7Sxx时有什么问题,欢迎大家共同讨论。
第一章开发工具与调试环境一.目标板所用实验板是参考ATMEL公司官方网站上发布的《AT91SAM7S-EK Evaluation Board User Guide》设计的,相当于AT91SAM7Sxx评估测试板,主要用于各种外围实验,结构框图如图1-1所示。
大家可以自己搭板子,或者直接购买现成的AT91SAM7Sxx评估板。
图1-1. 结构框图实验板主要以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的用户。
二.开发工具在8位单片机的开发过程中,都会用到诸集成调试环境和仿真器。
同8位单片机一样,ARM也有自己的集成开发环境和硬件访真器。
本次实验就是使用ADS1.2集成开发环境和技创的TecorICE并口JTAG 仿真器,使用时类似于51的仿真器直接挂接在keil下使用那样。
我个人认为无论是ARM、DSP还是51或PIC等,其开发工具和开发过程都是类似的。
简单的讲都是先在集成开发环境中编辑用户程序,然后经过编译、连接产生目标文件,再通过硬件仿真器进行仿真调试。
而对于普通51仿真器与ARM仿真器,使用起来并没明显的不同,主要的差别大概在于仿真接口(或者说是仿真头)。
普通51仿真器是使用与目标单片机管脚兼容的仿真头替代目标单片机,用户程序是在仿真器内部的仿真芯片上运行。
ARM核处理器内置ICE(仿真调试模块),该模块通过标准的JTAG接口引脚与ARM仿真器相连,此时ARM仿真器作为上位调试软件与ARM核芯片之间的协议转换器。
用户的目标调试文件被下载到目标板上的存储器(可以是外部的或ARM处理器内部的存储器)中,通过控制目标芯片的仿真模块实现仿真调试。
第二章我的第一个实验――将程序执行到C文件的main函数一.背景当有了techorICE仿真器与AT91SAM7S64实验板后,像拿到一个不熟悉的普通单片机一样,希望能够写个小程序在里面跑跑,来开始第一步!在做这个实验前,我快速的阅读了AT91SAM7S64数据手册和《ARM体系结构与编程》(我认为这本书非常不错),还有techorICE仿真器的使用手册,并着重阅读了ADS软件、仿真器的使用以及起动代码方面的知识,因为这些都是马上要用到的。
二.实验目的运用ADS编写一个小程序,使程序能够从起始的汇编代码运行到C程序的main()函数(这也可称作非常简单的起动代码),并通过仿真器连接目标板,最终能够在AT91SAM7S64里正确运行。
三.实验程序和参数设置1>连接器的选项设置选项设置如图2-1所示。
因为在AT91SAM7S64中FLASH存储器的地址是以0x0开始,而SRAM 的地址是以0x00200000开始,所以我将下图中的RO Base和RW Base分别设置成了0x0和0x00200000。
其它设置请参考有关书籍。
图2-1.选项设置图2>启动代码在ARM应用系统中,芯片复位后,在进入C语言的main()函数前,都要执行一段启动代码。
该代码一般都是用汇编语言编写,用来完成系统运行环境和应用程序的初始化,详情请参考有关书籍。
由于本实验的目的很简单,就是想让程序复位后,进入main()函数,所以有些初始化代码尽量精简,留下了下述代码。
另外,__main是C语言的内部库函数,可以在进入用户main()之前完成内部RAM 的初始化工作,类似KeilC51中的startup.a51。
当执行完__main这段代码后,再跳转到main()函数。
AREA init,CODE,READONLYCODE320x10;CPSR中各种处理器模式对应的控制位EQUMode_USR0x80;CPSR中的中断禁止位EQUI_Bit0x40F_BitEQUEQU0x00203000 ;定义RAM的最高地址,无重映射USR_StackENTRYB InitReset ; 0x00 Reset handlerundefvec B undefvec ; 0x04 Undefined Instructionswivec B swivec ; 0x08 Software Interruptpabtvec B pabtvec ; 0x0C Prefetch Abortdabtvec B dabtvec ; 0x10 Data Abortrsvdvec B rsvdvec ; 0x14 reservedirqvec B irqvec ; 0x18 IRQfiqvec B fiqvec ; 0x1c FIQInitResetMSR CPSR_c,#Mode_USR | I_Bit | F_Bit ;改成用户模式且禁止IRQ和FIQ中断LDR SP,=USR_StackIMPORT __mainb __main ;跳转到__main执行,它位于C运行时库中END3>C语言主函数在C语言主函数中做了一个死循环,如下述所示。
int main(void){while (1);}四.出现的问题与解决方法当完成上述操作后,先用软件仿真,很快达到了目的,但将程序通过仿真器在目标板运行时出现了下述问题。
1> 当执行单步运行时,PC一直停留在0x0处,而且Debug Log窗口中显示“RDI Warning 00148:Can't set point”。
原因是仿真器在ROM中设置的断点数是有限的,且单步运行时内部还要占用断点。
可以使用“Option->Config Processor”打开“Processor Properties-ARM7TDMI”窗口,且按照下图设置以关断相应的断点。
2> 装载的代码与实践程序不一样原因是由于程序没有装载到AT91SAM7S64的FLASH ROM里,在调试器中显示的是FLASH ROM中原先就有的程序。
因为在连接器的选项设置中,将RO Base和Image entry point指向了0地址,而在AT91SAM7S64的这段空间为FLASH ROM区,而仿真器不能直接将代码下载到FLASH ROM里。