AT91SAM7S64总结笔记
- 格式:pdf
- 大小:387.35 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所示。
ARM入门笔记ISP 实验一.背景由于前面的实验都是用仿真器将代码下载到AT91SAM7S64 的SRAM 里调试的,还不能在实际的Flash ROM 里跑。
所以在这个实验中,我们将通过ATMEL 提供的SAM-BA 软件和AT91SAM7S64 自带的ROMBoot 功能,完成AT91SAM7S64 的Flash ROOM 的在线烧写。
二.实验目的用前面I/O 口输入实验的源程序生成二进制文件,下载到AT91SAM7S64 的Flash ROM 中,且能脱机正确运行。
三.操作方法1> 安装。
双击Install SAM-BA.exe 文件运行,按提示一步步安装即可。
2> 连接好硬件,且使AT91SAM7S64 处于RomBoot 状态。
3> 运行。
双击SAM-BA 图标出现如下图所示的启动窗口:图4.21 SAM 启动窗口当正确设置后,按DBGU connection 按钮将打开SAM-BA 编程环境,如下图所示:图4.22SAM-BA1.0 编程环境4> 用ADS1.2 生成二进制文件。
5> 编程。
点击Flash- >Download/Upload File->Send File Name 项的Browse 按钮打开二进制文件后,点击Send File 按钮开始下载程序。
6> 复位目标板,开始运行用户程序。
四.出现的问题与解决方法1> ADS 软件编译后不能产生二进制等目标文件第一、可以用DOS 命令手工生成二进制文件。
第二、在DebugRel Settings 中,将Target->Target Settingsr->Post-linker 项的None 修改成ARMfromELF,再在DebugRel Settings 中的Linker->ARM fromELF->Output format 中设置成Plain binary。
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。
AT91系列ARM硬件设计笔记电源问题1.VDDCORE和VDDIO引脚电源A)VDDCORE和VDDIO引脚电源必须连接到使用退耦电容的干净的直流电源上;退耦电容应尽可能的接近微控制器的VDD和GND引脚;退耦电容典型值是33nF到100nF。
B)除保证复位的延时时间大于两个电源的上升时间外,对电源的时序上没有特殊的要求。
C) 值得注意的是在VDDCORE一直给微控制器供电保存内部RAM和寄存器内容时VDDIO供电不能停止,如果这样的话他不是破坏性的,带能导致内部外围设备的输入进入一个不确定的状态。
此外,除电流连续状态下的阻性负载外,VDDIO的电流消耗依赖于连接到EBI的I/O线和PIO线切换时的负载电容。
这就是说,当CPU处于备用状态时不需要停止VDDIO.2.VPP引脚VPP用来提高FLASH的编程和擦除速度。
电压范围参见数据手册。
VPP引脚可以不连接,为防止意外,可以考虑施加一个已知的电平以防止步必要的动作。
主时钟引脚1.MCKI引脚MCKI引脚是微控制器的主时钟输入引脚。
此引脚输入一个方波时钟信号。
外部时钟的高半周期(tCH)和低半周期(tCL)有一个最小值,见数据手册。
AT91X40X系列没有内部振荡器,仅仅连接一个晶振是不可以的。
2.MCKO引脚MCKO引脚提供一个延时的MCKI引脚的时钟输入信号的镜像以提供系统内的其他设备使用。
MCKO驱动能力低,用它来驱动几个TTL负载是不可行的。
当使用BGA封装的AT91X40X系列微控制器时,如果这个引脚不使用,强烈建议你将它作为PCB上的测试点。
这样用来快速判断微控制器是否有一个正确的时钟NRST输入引脚NRST引脚用于主系统复位。
它为低时复位所有内部设备寄存器,ARM内核的程序计数器和JTAG/ICE端口。
在系统引导时他采样BMS和NTRI引脚。
NRST 必须被保持到提供给微控制器的电源稳定和依照外部振荡器的启动时间。
在释放NRST引脚前必须保持0电平至少10个时钟周期以便能够正确的采样BMS和NTRI引脚。
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)”启动时序。
学号:常州大学毕业设计(论文)(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数据接收模块设计.............................................................................................. 错误!未定义书签。
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],
因版权原因,仅展示原文概要,查看原文内容请购买。
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里。