EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-832355010轻松入门开发ARM程序(为初学者写的入门手册)万利电子有限公司www.
manley.
com.
cnEWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-832355011目录前言2第一章EWARM集成开发环境及J-Link仿真器…3第二章在EWARM中生成一个新项目.
11第三章编译和连接应用程序.
15第四章用C-SPY调试应用程序.
21第五章如何编写STARM应用程序…29EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-832355012前言很多朋友都想自己动手开发ARM应用程序,却不知从哪儿下手.
我们编写本手册的目的就是想帮助这些初学者轻松的入门.
应该说,入门学会开发STARM应用程序并不难,但要全面掌握和融会贯通则需要付出许多努力.
因为本手册的目的只是帮助新手入门,所以我们在编写时大胆地砍去许多旁支侧节,避免过多介绍细节,紧紧地抓住如何使用ARM开发工具和使用芯片商提供的软件库为主线,单刀直入,使读者无须阅读许多资料,短时间就能掌握开发ARM应用程序的基本技巧.
本手册以IAR公司的EWARM开发环境和ST公司的STR710-EVAL评估板为基础,介绍如何编写STR710(ARM7内核)的C语言应用程序.
手册的前半部分介绍IARSystems公司的ARM开发环境EWARM的使用方法,后半部分介绍如何利用ST公司提供的STR710软件库和例子编写自己的应用程序.
用户只需按照本手册介绍的步骤,一步一步去做,相信只需几天的时间就能初步掌握使用IAREWARM开发环境和编写STARM的应用程序的基本技巧.
相对51单片机,ARM的结构和应用确实要复杂的多.
要真正熟练使用ARM处理器需要学习许多相关知识.
希望学习ARM的朋友在初步入门后,继续学习本手册中提到的相关资料,通过不断的学习和实践扩充知识和提高自己的水平.
实践ARM开发需要准备以下软硬件:1.
IAR的JTAG仿真器J-Link(从万利公司购买)2.
IAREmbeddedWorkbenchforARMversion4.
31(从IAR网站下载)3.
ST公司的ATR710-EVAL评估板(从万利公司购买)4.
ST公司的ATR710-EVAL评估板源程序包01STR71x(从万利网站下载)需要获得更多知识请参阅以下资料:1.
ARMEmbededWorkbenchUserGuide(在EWARM主菜单的Help下)2.
ARMC/C++CompilerReferenceGuide(在EWARM主菜单的Help下)3.
ARM_AssemblerReferenceGuide(在EWARM主菜单的Help下)4.
LinkerandLibraryToolsReferenceGuide(在EWARM主菜单的Help下)5.
STR71xF用户手册(从万利网站下载)6.
STR71xF教程(PPT)(从万利网站下载)EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-832355013第一章EWARM集成开发环境及J-Link仿真器1.
IAREWARM简介IAREmbeddedWorkbenchforARM(下面简称IAREWARM)是一个针对ARM处理器的集成开发环境,它包含项目管理器、编辑器、C/C++编译器和ARM汇编器、连接器XLINK和支持RTOS的调试工具C-SPY.
在EWARM环境下可以使用C/C++和汇编语言方便地开发嵌入式应用程序.
比较其他的ARM开发环境,IAREWARM具有入门容易、使用方便和代码紧凑等特点.
有关EWARM详细特点介绍请参考万利公司编写的《IAREWARM快速用户指南》.
IAREWARM的最新版本是4.
31.
为了方便用户学习评估,IAR提供一个限制32k代码的免费版本.
用户可以到IAR公司的网站www.
iar.
com/ewarm或万利电子的网站www.
manley.
com.
cn(本地网站)去寻找和下载.
IAREWARM中包含一个全软件的模拟程序(simulator).
使用它不需要任何硬件支持就可以模拟各种ARM内核、外部设备甚至中断的软件运行环境,从中可以了解和评估IAREWARM的功能和使用方法.
有关EWARM模拟程序的用法请参考万利公司编写的《IAREWARM快速用户指南》.
但本手册着重介绍针对ST公司的STR710评估板真实硬件的开发流程.
2.
IARJ-Link仿真器简介IARJ-Link是IAR为支持仿真ARM内核芯片推出的JTAG方式仿真器.
结合IAREWARM集成开发环境可支持所有ARM7/ARM9内核芯片的仿真.
J-LinkARM主要特点如下:z支持所有ARM7/ARM9内核的芯片,包括Thumb模式z下载速度高达600kB/sz最高JTAG速度12MHzz目标板电压范围1.
2V–3.
3Vz自动速度识别功能z自动监测所有JTAG信号和目标板电压zJ-Link本身使用PC机给USB端口的电源J-LINK一端通过USB口与PC连接,另一端通过标准20芯JTAG插头与目标板连接.
连接时应首先将J-LINK与PC连接,再将J-LINK与目标系统连接,最后给目标系统供电(如果目标系统为独立供电、而非由J-TAG口供电的情况).
注意:当目标系统为5V电源系统时,必须使用J-LINK提供的5V电源适配器选件.
对于1.
2V~3.
3V电源系统,可以直接使用J-Link.
使用时将适配器的20芯IDC插头插进J-Link的20芯插座,再将连接目标板的20芯扁平电缆插进适配器的插座.
5V适配器选件由目标供电(3.
3V~5V),电流New>Workspace命令.
如果目前正在开发或调试另一个项目,EWARM开发环境将提示用户保存和关闭当前活跃工作区,然后开启一个空白工作区窗口,如图2-1所示.
图2-1.
创建新工作区注意:第一次使用EWARM开发环境时也显示上述空白工作区窗口.
3.
生成新项目下一步就是在工作区中创建新项目,方法如下:EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-832355019①选择主菜单Project>CreateNewProject,弹出生成新项目窗口,见图2-2.
EWARM提供几种应用程序和库程序的项目模板.
如果选择Emptyproject,表示采用默认的项目选件设置.
在本例中我们选择Emptyproject.
图2-2.
生成新项目窗口②在Toolchain栏中选择ARM,然后点击OK按钮,弹出"另存为"窗口.
③在"另存为"窗口中浏览和选择新建的Myprojects目录,输入新项目的文件名为STR710-LED,然后保存.
这时在屏幕左边的Workspace窗口中将显示新建的项目名和输出代码模式.
见图2-3所示:图2-3.
生成新项目项目名后面的Debug表示输出含调试信息的代码文件.
EWARM能为项目提供两种输出代码模式:Debug和Release.
Debug模式生成含调试信息的程序代码,用户利用它可以在EWARM环境下调试应用程序.
而Release模式生成不含调试信息的发行版本的程序代码,其代码比较紧凑.
用户可以从WorkspaceEWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550110窗口顶部的下拉菜单中选择两种项目配置之一,本例我们选择Debug.
现在Myprojects目录下已生成一个STR710-LED.
ewp文件,该文件中将包含与STR710-LED项目设置有关的信息,如编译、连接(build)的选件等.
注意:STR710-LED-Debug后的﹡号表示当前的工作区和项目经修改后还没有被保存.
④保存工作区新生成的工作区需保存才有效,所以在添加项目后EWARM要求执行保存工作区操作.
保存工作区选择主菜单File>SaveWorkspace,浏览并选择Myprojects目录.
然将工作区取名为ST710-DEMO输进Filename输入框,按保存按钮退出.
这时在Myprojects目录下又生成一个ST710-DEMO.
eww文件.
同时在Myprojects目录下还生成一个settings子目录,这个目录下存放保存窗口设置和断点设置等与当前操作有关信息的其他文件.
注意:保存操作完成后项目名后的﹡号已经消失.
4.
给项目添加文件保存工作区后的下一步就是往项目中添加文件.
项目中的文件允许分组,用户可以根据项目的需要和自己的习惯来组织源文件.
为举例说明,我们在下面的例子中建立一个startup文件组.
注意:往项目中添加文件时只需添加汇编语言和C语言的源程序,不需要添加头文件.
但是用户必须在配置项目的编译器、连接器选件时指明包含头文件的路径和目录.
关于项目配置选件的设定我们会在后面详细介绍.
新建项目STR710-LED是一个循环点亮ATR710-EVAL评估板上的4个LED(LED11-LED14)的简单例子.
我们用它来介绍STR710应用程序的开发流程.
这个应用例子所需的所有源程序都在STR710-EVAL目录下.
其中有两个c源程序:71x_it.
c和main.
c.
另有两个ARM汇编语言程序:71x_init.
s和71x_vect.
s.
后两个属启动程序,放在01str71x\STR710-EVAL\startup目录下.
添加文件的操作方法如下:①选择工作区窗口中的ST710-LED–Debug名,使其高亮.
按鼠标右键在弹出菜单中选择AddGroup…或选择主菜单Project>AddGroup…执行添加文件组命令.
在弹出菜单中将文件组也起名为startup.
②在工作区窗口中选择刚建立的文件组目录startup,使其高亮.
然后按鼠标右键在弹出菜单中选择AddFiles…或选择主菜单Project>AddFiles…执行添加文件命令.
在弹出添加文件窗口中浏览01str71x\STR710-EVAL\startup目录,从中选择71x_init.
s和71x_vect.
s.
这两个文件将被添加到工作区窗口的startup目录下.
③重新选择工作区窗口中的ST710-LED–Debug名,按鼠标右键在弹出菜单中选择AddFiles…或选择主菜单Project>AddFiles…执行添加文件命令.
在弹出添加文件窗口中浏览01str71x\STR710-EVAL目录,从中选择71x_it.
c和main.
c.
现在的工作区窗口中的显示如图2-4所示.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550111图2-4.
添加文件后的工作区窗口5.
设置项目选件生成新项目和添加文件后的下一步是为项目设置选件.
设置项目选件是非常重要的一步,如果设置不当,编译、连接就会出错,就无法生成正确的代码文件.
大家记得,在创建新项目时我们选择了Emptyproject模板,表示采用默认的项目选件设置.
但是这些默认的设置还要根据具体项目的需要进行修改.
IAREWARM提供的项目选件内容繁多,初学者可能会感到不摸头脑、无从下手.
实际上最关键的选件并不多,只要把它们设置正确了,其它的采用默认设置就不会出错.
下面我们把这些关键选件设置逐条介绍:①通用选件设置IAREWARM允许为工作区中的任何一级目录和文件单独设置选件,但是用户必须首先为整个项目设置通用的选件GeneralOption.
设置方法是:选中工作区中的项目名STR710-LED–Debug,按鼠标右键在弹出菜单中选择Options…或选择主菜单Project>Options….
在弹出的Options窗口左边的目录(Category)中选择第一项GeneralOptions.
然后分别在:zTarget页面中,ProcessorVariant框中选择Device.
并点击右边的器件选择按钮选择芯片型号STSTR710.
同时Processormode选择ARM,Endianmode选择Little,Stackalign选择4byte.
如图2-5所示;注意:Emptyproject模板默认的处理器模式是Thumb,即生成16位指令代码.
但是在STR710-LED项目中,软件要求生成32指令代码(CODE32),所以应改选ARM.
zOutput页面中,Outputfile框下选择Executable;zLibraryConfiguration页面中,Library条目下选择Normal.
zLibraryOption页面中采用默认选择EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550112图2-5.
GeneralOption选件设置②C/C++编译器选件设置在Options窗口的目录Category中选择第二项C/C++Compiler.
C/C++编译器的选件设置如下:zLanguage页面中,分别在三个选择框中选择C,AllowIARextensions,unsigned;zOptimization页面中,根据项目需要选择按size优化还是按speed优化,再选择优化等级.
本例选择Size,Low;zOutput页面中,选择Generatedebuginformation;zList页面中,选择Outputlistfile,并选择Assemblemnemonics和Diagnostics;zPreprocessor页面中,列有标准的include文件的目录.
如果用户的include文件不在标准目录下时,必须在Additionalincludedirectories输入包含该项目include文件的目录.
一个目录用一行描述,有多个目录时允许用多行.
在本例中,我们选择01str71x\STR710-EVAL\include,见图2-6.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550113图2-6.
C/C++选件窗口③Assembler选件设置在Options窗口的目录Category中选择第三项Assembler.
汇编器的选件设置如下:zLanguage页面中,选择Usersymbolsaresensitive,并选择合适的宏汇编括号(Macroquotecharacter).
本例选用;zOutput页面中,选择Generatedebuginformation;zList页面中,选择Outputlistfile,并根据需要选择各子项;zPreprocessor页面中,列有标准的include文件的目录.
如果用户的include文件不在标准目录下时,必须在Additionalincludedirectories输入包含该项目include文件的目录.
一个目录用一行描述,有多个目录时允许用多行.
zDiagnostic页面中,选择Enable和Allwarning.
④Linker选件设置在Options窗口的目录Category中选择第六项Linker.
连接器的选件中最重要的设置是以下几个:zOutput页面,选择合适的输出格式十分重要.
如果需要将输出文件送给一个调试器进行调试,则要求输出格式带有调试信息.
本例选择DebuginformationforC-SPY.
以及此选项下的选件Withruntimecontrolmodules,WithI/Oemulationmodules和AllowC-SPY-specificextraoutputfile.
见图2-7.
注意:I/Oemulationmodules指示连接器将stdin和stdout指向C-SPY的I/O窗口的低级例程.
在没有真实硬件采用模拟仿真时应选择此项选件.
zExtraOutput页面选择Generateextraoutputfile.
输出格式选择simple-code和None;EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550114zDiagnostics页面选择Generateerrors;zList页面,选择Generatelinkerlisting和Segmentmap(见图2-8),允许生成存储器分配MAP文件.
图2-7.
连接器Output选件设置图2-8.
连接器List选件设置zConfig页面,主要是定义连接器命令文件(LinkerCommandFile).
这是连接器选件中最重要同时也是最复杂的设置.
连接器命令文件中包含连接器的各项命令行参数,主要用于控制程序各种代码段和数据段在存储器中如何分布.
用户一定要吃透和掌握如何生成正确的连接器命令文件.
为了帮助初学者理解,我们增加了下面一段介绍:EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550115附注:段的存储器分配方法用户在开发以ARM7或ARM9为内核的嵌入式应用系统时会采用不同半导体厂家的产品,每种芯片内部SRAM和FLASH的大小和地址分布都不同,另外用户目标系统配置的外部存储器也不同,用户应用软件要求的存储器分配也不相同.
以上所有的不同最后落实到在运行时不同的代码段和数据段的存储器地址分配方案.
而这种运行时存储器分配必需在连接器命令文件中说明,并由连接器IARXLINK生成.
经XLINK连接生成的代码文件下载到目标板时的地址,由FlashLoader执行,后面将介绍.
IAREWAR提供默认的连接器命令文件,它在IAREWAR安装目录的ARM\config目录下,名字叫lnkarm.
xcl.
但是默认的连接器命令文件lnkarm.
xcl不能完全适用特定的目标系统,必须加以修改.
下面介绍几个连接器命令选件的功能和用法:命令选件功能举例-DROMSTART=0x40000000-DROMEND=0x4003FFFF说明STR710内部Flash的地址分布说明存储器块的起始地址和结束地址-DROMSTART=0x2000000-DROMEND=0x2000FFFF说明STR710内部RAM的地址分布-D说明段(堆栈)的空间大小-D_CSTACK_SIZE=100CSTACK是在启动程序71x_init.
s中定义的段,此命令给它分配100字节按段出现的顺序进行段定位-Z(CODE)ICODE=0x40000000-0x4003FFFF-Z(CODE)CODE_ID=0x40000000-0x4003FFFF把代码段ICODE和CODE_ID顺序放置在STR710内部Flash地址0x4000000-0x4003FFFF内.
-Z按段出现的顺序进行段定位,同时分配空间-Z(DATA)CSTACK+2000=20000000-2000FFFF-Z(DATA)IRQ_STACK+100=20000000-2000FFFF分配堆栈CSTACK2000个字节,分配)IRQ_STACK100个字节,顺序放置在STR710内部RAM地址0x20000000-0x2000FFFF内.
-P把离散的存储器空间分配给段-P(DATA)MYDATA=10000-101FFF,110000-111FFF用-P命令后,就不能用汇编命令SFB和SFE获得该段的起始地址和结束地址.
-carm采用的CPU-carm表2-1.
主要的连接命令选件用户可以使用上述命令选件进行段的存储器地址分配.
在连接器命令文件中需要对两种段进行说明.
一是IARC/C++编译器定义的段名,二是启动程序(汇编语言程序)中定义的堆栈.
下面分别叙述:ⅰ)IARC/C++编译器定义了许多不同用途的段名,其种类繁多,简单介绍请见表2-2.
用户应该查阅《EWARMCCompiler.
pdf》中的Segmentreference章节详细了解.
在默认的lnkarm.
xcl文件中,几乎对所有C/C++编译器定义的段都已经有默认的说明,用户不必去修改.
但是需要在默认的lnkarm.
xcl文件的头部(-carm命令选件的前面)增加以下语句:EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550116-DROMSTART=0x-DROMEND=0x-DRAMSTART=0x-DRAMEND=0x-DVECSTART=ROMSTART以上语句是定义片内ROM和RAM的地址范围,数值用16进制表示.
XLINK对所有段的地址分配都被限定在前4句定义的范围内.
第5句指定INTVEC段的起始地址在ROM起始地址,INTVEC用于保存复位和异常向量.
用户应注意INTVEC段必须放在ROM(当指定程序在ROM中运行时)或RAM(当指定程序在RAM中运行时)的起始地址0-3F处.
因为在STR710-LED项目中,INTVEC至少需要428个字节,低于此数值连接处理将出错.
所以将lnkarm.
xcl文件中原来的-Z(CODE)INTVEC=0-3F修改成:-Z(CODE)INTVEC=VECSTART:+0x428ⅱ)启动程序(71x_init.
s)中定义的所有堆栈和堆(Heap)必须在连接器命令文件中加以说明,缺一不可,否则就会报错.
根据STR710-LED项目启动程序选择以下命令:-Z(DATA)CSTACK+2000=RAMSTART-RAMEND-Z(DATA)IRQ_STACK+100=RAMSTART-RAMEND-Z(DATA)FIQ_STACK+100=RAMSTART-RAMEND-Z(DATA)SVC_STACK+100=RAMSTART-RAMEND-Z(DATA)ABT_STACK+100=RAMSTART-RAMEND-Z(DATA)UND_STACK+100=RAMSTART-RAMEND-Z(DATA)HEAP+8000=RAMSTART-RAMEND以上命令为各堆栈和堆分配存储空间,同时把它们顺序地放置在片内RAM空间内.
用户可以根据应用的需要为堆栈分配空间.
经过上述修改后,保存文件,并在Linker选件config页面中指定新文件的路径.
此连接命令文件就可以使用了.
修改后的xcl文件指定程序在片内ROM中运行.
如果要求连接后的程序在RAM中运行,只需修改前面4条命令就可以了.
-DRAMSTART=0x20000000-DRAMEND=0x2000FFFF-DROMSTART=RAMSTART-DROMEND=RAMEND上面的命令先规定片内RAM地址范围.
然后将片内ROM地址范围指向与RAM相同的空间.
编译连接后的文件可以通过FlashLoader直接下载到片内RAM,并将STR710的BOOT0和BOOT1脚设置成从RAM引导,Reset后就可以在RAM运行了.
下面是两个完整的连接命令文件例子.
请注意其中-Z命令的用法的差异,但连接处理结果是一样的.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550117连接命令文件例1(在ROM中运行)://Codememoryinflash-DROMSTART=0x40000000定义片内ROM起始地址-DROMEND=0x4003FFFF定义片内ROM结束地址-DVECSTART=ROMSTART定义INTVEC段起始地址//Datamemory-DRAMSTART=0x20000000定义片内RAM起始地址-DRAMEND=0x2000FFFF定义片内RAM结束地址-carm-Z(CODE)INTVEC=VECSTART:+0x428把INTVEC段放在ROM起始地址,保留428字节-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND把段ICODE和DIFUNCT顺序放在片内ROM空间-Z(CODE)SWITAB=ROMSTART-ROMEND把段SWITAB顺序放在片内ROM空间-Z(CODE)CODE=ROMSTART-ROMEND把段CODE顺序放在片内ROM空间-Z(CONST)CODE_ID=ROMSTART-ROMEND把段CODE_ID顺序放在片内ROM空间-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND把段INITTAB,DATA_ID和DATA_C放在片内ROM空间-Z(CONST)CHECKSUM=ROMSTART-ROMEND把段CHECKSUM顺序放在片内ROM空间-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND把段DATA_I,DATA_Z和DATA_N顺序放在片内RAM空间-Z(DATA)CODE_I=RAMSTART-RAMEND把段CODE_I顺序放在片内RAM空间-QCODE_I=CODE_ID把CODE_ID中的内容拷贝到CODE_I-D_CSTACK_SIZE=1000给堆栈CSTACK分配1000字节-D_SVC_STACK_SIZE=100给堆栈SVC_STACK分配100字节-D_FIQ_STACK_SIZE=100给堆栈FIQ_STACK分配100字节-D_ABT_STACK_SIZE=100给堆栈ABT_STACK分配100字节-D_UND_STACK_SIZE=100给堆栈UND_STACK分配100字节-D_IRQ_STACK_SIZE=400给堆栈IRQ_STACK分配400字节-D_HEAP_SIZE=400给堆HEAP分配400字节-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND把上述堆栈顺序放在片内RAM中-Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND-Z(DATA)ABT_STACK+_ABT_STACK_SIZE=RAMSTART-RAMEND-Z(DATA)UND_STACK+_UND_STACK_SIZE=RAMSTART-RAMEND-Z(DATA)FIQ_STACK+_FIQ_STACK_SIZE=RAMSTART-RAMEND-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND-Z(DATA)HEAP+_HEAP_SIZE=RAMSTART-RAMENDEWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550118连接命令文件例2:(连接结果和第一个例子一样)-carm-Z(CODE)INTVEC=40000000-40000428-Z(CODE)ICODE,DIFUNCT=40000000-4003FFFF-Z(CODE)SWITAB=40000000-4003FFFF-Z(CODE)CODE=40000000-4003FFFF-Z(CONST)CODE_ID=40000000-4003FFFF-Z(CONST)INITTAB,DATA_ID,DATA_C=40000000-4003FFFF-Z(CONST)CHECKSUM=40000000-4003FFFF-Z(DATA)DATA_I,DATA_Z,DATA_N=20000000-2000FFFF-Z(DATA)CODE_I=20000000-2000FFFF-QCODE_I=CODE_ID-Z(DATA)CSTACK+1000=20000000-2000FFFF-Z(DATA)SVC_STACK+100=20000000-2000FFFF-Z(DATA)ABT_STACK+100=20000000-2000FFFF-Z(DATA)UND_STACK+100=20000000-2000FFFF-Z(DATA)FIQ_STACK+100=20000000-2000FFFF-Z(DATA)IRQ_STACK+400=20000000-2000FFFF-Z(DATA)HEAP+400=20000000-2000FFFFEWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550119下表对上面出现的段名做一简单介绍:段名功能说明段类型属性INTVEC保存Reset和异常向量,含跳转到cstartup或中断服务程序的指令.
必须在0x00-0x3F地址范围内.
CODE只读ICODE保存启动代码,位于能被INTVEC中的转移指令达到的前32MB字节内.
CODE只读DIFUNCT包含指向C++建构模块的指针.
该模块在调用main之前由cstartup执行.
CODE只读SWITAB保存软件中断向量表CODE只读CODE保存程序代码,可以在ROM中执行.
CODE只读CODE_I上电后保存声明为_ramfunc的程序代码,掉电后丢失.
初始化时从CODE_ID(ROM)拷贝到CODE_I中,然后在RAM中执行.
DATA读/写CODE_ID永久性保存声明为_ramfunc的程序代码.
这些代码初始化时从CODE_ID拷贝到CODE_I中(RAM),然后在RAM中执行.
CONST只读INITTAB保存需要在启动时初始化的段地址和段长度表格.
CONST只读DATA_ID保存DATA_I段中变量的初值,这些值在系统初始化时由cstartup从DATA_ID拷贝到DATA_I.
CONST只读DATA_C保存常数数据,包括文字字符串CONST只读CHECKSUM保存段的校验和CONST只读DATA_I保存声明为非零初值的静态全局变量,其初值开始在DATA_ID中,系统初始化时由cstartup从DATA_ID拷贝到DATA_I.
DATA读/写DATA_Z保存声明初值为零或没有声明初值的静态全局变量DATA读/写DATA_N保存非易失存储器中,用_no_init关键字声明的静态全局变量DATA读/写CSTACKC/C++内部数据堆栈(用户模式)DATA读/写SVC_STACK操作系统堆栈(管理模式,用于具有特权的操作系统任务)DATA读/写ABT_STACK数据访问中止模式堆栈(用于虚拟存储器及存储器保护)DATA读/写UND_STACK未定义指令中止模式堆栈(支持硬件协处理器软件仿真)DATA读/写FIQ_STACK快中断模式堆栈(用于高速数据传输或通道处理)DATA读/写IRQ_STACK中断模式堆栈(用于通用中断处理)DATA读/写HEAP堆(Heap)是C\C++中为malloc和free或new和delete保留的动态分配存储空间.
DATA读/写表2-2.
段名及其功能表2-2中属性中的CODE是在ROM中的代码.
CONST是在ROM中的数据,DATA是在RAM中的数据.
表2-2中列出的所有段除了INTVEC必须放在运行存储器(不管是ROM还是RAM)的0-3F地址空间和ICODE必须放在前32MB空间外,其他的段都可以放在符合其属性存储器空间的任何地址.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550120第三章.
编译和连接应用程序1.
编译连接处理选择主菜单Project>Make,或选中工作区中的项目名STR710-LED–Debug,按鼠标右键在弹出菜单中选择Make.
EWARM将执行编译连接处理,生成可调试代码文件.
Build消息窗口中将显示连接处理的消息.
连接的结果将生成一个带调试信息的代码文件STR710-LED.
d79和一个存储器分配(MAP)文件STR710-LED.
map.
同时生成项目中汇编源程序和c源程序的lst文件.
编译连接后的工作区窗口如图2-11所示.
图2-11.
编译连接处理后的项目文件结构从编译连接后的工作区窗口中树结构中,我们可以看到每个源文件访问关联了哪些头文件,同时生成了哪些输出文件.
因为我们在建立新项目时选择Debug配置,所以在Myprojects目录下自动生成一个Debug子目录.
Debug子目录下又包含另3个子目录,名字分别为List、Obj、Exe.
它们的用途如下:zList目录存下放列表文件,列表文件的后缀是lst;zObj目录下存放Compiler和Assembler生成的目标模块文件,这些文件的后缀为r79,可以用作IARXLINK连接器的输入文件;zExe目录下存放可执行文件,这些文件的后缀为d79,可以用作IARC-SPY调试器的输入文件,注意在执行连接处理之前这个目录是空的.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-83235501212.
查看汇编器/编译器List文件编译连接处理中难免发现各种各样错误.
出错后用户可以从Build消息窗口中获得错误信息,也可以从List文件中获得错误信息.
双击Workspace窗口中的*.
lst文件,就可以打开该List文件,它包含以下信息:z文件头—显示编译器的版本信息,列表文件生成时间,source文件、list文件和object文件的名字和路径,编译命令行及选件等信息.
z文件体—显示为每条源语句生成的汇编代码和二进制代码,以及变量如何被分配到不同的段.
z文件尾—显示所需的堆栈、程序代码以及数据存储器的总量,同时报告错误和警告信息.
3.
查看MAP文件双击Workspace中的STR710-LED.
map文件名,编辑器窗口中将显示该MAP文件.
从MAP文件中我们可以了解以下内容:z文件头中显示连接器版本,输出文件名以及连接命令使用的选件.
zCROSSREFERENCE部分显示程序入口地址.
zRUNTIMEMODEL部分显示使用的运行时模块的属性.
zMODULEMAP部分显示所有被连接的文件.
每个文件中,作为应用程序一部分加载的有关模块的信息,包括各段和每个段中声明的全局符号都列出来.
zSEGMENTSINADDRESSORDER部分列出了组成应用程序的所有段的起始地址和结束地址,字节数,类型和对齐标准等.
zENDOFCROSSREFERENCE部分显示总的代码和数据字节数.
如果编译连接没有任何错误,则生成STR710-LED.
d79应用程序代码,并可以用于在IARC-SPY中调试.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550122第四章用C-SPY调试应用程序编译连接生成的STR710-LED.
d79现在可以用C-SPY调试器进行调试.
用户利用调试器可以查看变量、设置断点、观察反汇编代码、监视寄存器和存储器、在TerminalI/O窗口打印输出.
1.
设置Debugger选件在开始调试之前必须为C-SPY调试器设置选件,具体操作如下.
选择主菜单Project>Option,选择Category中的Debugger.
z在Setup页面,在Driver的下拉菜单中选择J-Link/J-Trace,同时选择Runtomain(见图3-1).
如果用户没有购买IAR的JTAG仿真器,可选择Simulator模拟执行.
图3-1.
Debugger选件设置z在Download页面,选择veryfydownload和Useflashloader,见图3-2.
要进行应用程序的调试,必须将生成的STR710-LED.
d79文件下载到目标系统MCU的Flash或RAM中.
调试器C-SPY是通过一个叫做FlashLoader的程序完成下载任务的.
FlashLoader的详细工作原理以及它和C-SPY的互动机理我们不在这里介绍,用户可以参阅IAR的FlashLoaderGuide.
前面我们在设置GeneralOptions选件时,已经指定目标MCU是STSTR710.
所以EWARM已经提供了该芯片默认的FlashLoader.
如果用户选用的MCU不在EWARM的Device清单中,那就必须自己去编写该芯片的FlashLoader了.
按Download页面(图3-2)中的Edit按钮,在弹出的FlashLoaderOverview对话框(图3-3)中按new…按钮.
弹出FlashLoaderConfiguration对话框(图3-4).
因为我们要求把应用程序下载到STR710的内部Flash中,所以选择Relocate并输入起始地址0x40000000,按OK键确认.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550123图3-2.
设置Downloader参数图3-3.
设置FlashLoader参数图3-4.
设置FlashLoader下载起始地址zDebugger的其它两个设置页面ExtraOptions和Plugins可以采用默认值.
现在按OK键完成设置.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-83235501242.
加载应用程序选择主菜单Project>Debug或工具条上的Debugger按钮或者按键CTL+D,C-SPY将开始装载STR710-LED.
d79.
屏幕上将显示PC机通过J-Link加载的过程.
屏幕上除了已经原先已经打开的窗口外,将显示一组C-SPY专用窗口.
如DebugLog和Disassembly窗口.
见图3-5.
图3-5.
EWARM的Debug窗口注意:EWARM开发环境有两种工作状态,编辑状态和调试状态.
进入和退出调试状态可以分别用工具条上的Debug和StopDebugging按钮.
3.
组织窗口S-SPY可以固定窗口(所谓dock),也可以将多个窗口组织成书签形式,也可以让它们浮动.
改变浮动窗口的大小时其他窗口不受影响.
双击或用鼠标拖动窗口标题栏就可以改变窗口的形式.
4.
在源语句上调试EWARM有以下调试功能:①检查源语句,双击Workspace中的main.
c,编辑器窗口显示该文件;②用Debug>StepOver命令(或F10)步进函数调用语句;③用Debug>StepInto命令(或F11)进入函数内部;当执行StepInto后,编辑窗口上的激活窗口将切换到被进入的函数.
注意:StepOver命令用来执行源程序中的一条语句或一条指令,即使这条语句是一函数调用语句.
而StepInto命令则进入到函数或子程序调用的内部.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550125④还有一些其他调试命令,如StepOut(Shift+F11),Go(F5),Nextstatement,Break,Reset,Autostep等.
用户可以用这些命令灵活地执行自己的调试任务.
5.
查看变量C-SPY允许在源程序上查看变量或表达式,并在执行程序过程中跟踪它们的值的变化.
查看变量的方法有以下几种,它们的功能有一定的区别,用户可以根据自己的需要和喜好使用这些工具.
至于更详细的信息请查看EWARMUSERGUIDE中的Workingwithvariablesandexpressions章节.
①Tooltipwatch在Debug状态下,把光标对准编辑窗口中变量名,在该变量的旁边将显示其数据类型和当前值.
图3-6.
Tooltip工具显示变量值②Auto窗口Auto窗口自动显示当前语句的和其周围相关的变量和表达式的值,单步执行程序时可以观察这些变量如何变化.
打开Auto窗口的方法是双击变量名、使该变量名变成高亮度.
然后选择主菜单View→Auto命令.
图3-7是一个Auto窗口的例子.
图3-7.
Auto窗口中检查变量EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550126③Watch窗口打开Watch窗口的方法是选择主菜单View→Watch命令.
把变量添加到Watch窗口方法是选中变量(使其变成高亮度),然后用鼠标将其拖进Watch窗口.
或者用鼠标右键在弹出菜单中选择AddtoWatcn.
请注意:Watch窗口和Auto窗口可以平铺显示也可以按书签形式显示.
用户可以使用鼠标变换窗口显示方式.
图3-8.
Watch窗口图3-8是Watch窗口的例子,它与Auto窗口以书签方式显示.
Watch窗口和Auto窗口是最常用的变量观察窗口,实际上用户运用这两个窗口已经可以方便地进行变量查看了.
④Locals窗口打开Locals窗口的方法是选择主菜单View→Locals命令.
此窗口自动显示局部变量,即当前活跃函数的自动变量和参数.
⑤LiveWatch窗口打开LiveWatch窗口的方法是选择主菜单View→LiveWatch命令.
LiveWatch窗口用于观察静止位置上的变量,如全局变量.
变量的值在执行时连续变化.
6.
设置和监视断点IARC-SPY具有强大的断点功能.
详细请见EWARMUSERGUIDE中的131页Thebreakpointsystem.
设置断点最简单的方法是将光标定位到某条语句,然后按鼠标右键选择ToggleBreakpoint命令.
①设置断点点击要设置断点的语句,按鼠标右键,选择ToggleBreakpoint(Code).
也可以按工具条上的ToggleEWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550127Breakpoint按钮.
这时该语句上将出现断点标记.
图3-8.
设置断点和Breakpoint窗口选择主菜单View>Breakpoint可以打开Breakpoint窗口观察断点设置情况.
图3-8中的下部窗口是Breakpoint窗口.
C-SPY不限制断点设置的数量,但是任何时候最多只允许激活一个断点.
在Breakpoint窗口中定义断点语句的前面小方框中打勾的是被激活的断点.
用户可以在Breakpoint窗口中切换激活的断点,达到调试的目的.
②执行到断点按F5键或工具条上的Go按钮都可以让程序执行到断点.
DebugLog窗口将显示关于断点的信息.
③清除断点双击Breakpoint窗口中带勾的方框,可以允许或禁止断点.
用主菜单Edit>ToggleBreakpoint或按鼠标右键选择ToggleBreakpoint,可以直接从Breakpoint窗口删除该断点.
7.
在反汇编窗口上调试通常,在C\C++程序上调试应该更快速和更直接.
但是如果用户希望在反汇编程序上调试,C-SPY也提供了这种功能,而且C-SPY允许方便地在两种方式上切换.
反汇编程序的调试方法如下:①按Reset按钮复位应用程序.
②调试时反汇编窗口通常是打开的.
如果没打开可选择主菜单View>Disassembly打开反汇编窗口.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550128图3-8.
反汇编窗口③反汇编窗口如图图3-8所示,汇编代码与C语句一一对应.
执行单步命令时将执行单条汇编语句.
④如果关闭反汇编窗口,单步命令重新执行单条C语句.
8.
监视寄存器寄存器窗口允许用户监视和修改STR710寄存器的内容.
选择主菜单View>Register打开寄存器窗口,见图3-9.
图3-9.
寄存器窗口EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550129图3-9显示的是CPU寄存器.
C-SPY允许检查STR710的所有寄存器.
用户可以从寄存器窗口左上方的下拉菜单中选择需要查看的任何寄存器组.
9.
查看存储器用户可以在存储器窗口监视所选择的存储器区域.
①选择主菜单View>Memory打开存储器窗口,见图3-10(用8-bit显示数据).
②激活main.
c窗口并双击某个变量名并用鼠标将其拖到存储器窗口.
执行单步,同时观察存储器的内容是如何修改的.
用户可以在存储器窗口修改存储单元的内容.
只需把插入点放在希望修改的地方,然后输入新值就可以了.
图3-10.
存储器窗口10.
观察TerminalI/O当用户希望调试应用程序中的stdin和stdout,但是又没有实际的硬件支持时,C-SPY允许用户使用TerminalI/O模拟stdin和stdout.
在本例中没有用到此功能.
注意:TerminalI/O只有在选用了Linker选件WithI/Oemulationmodule时才可用.
也就是说,某些把stdin和stdout指向TerminalI/O的低级例程将被连接进应用程序.
选择主菜单View>TerminalI/O显示I/O操作的输出,见图3-12.
TerminalI/O窗口显示的内容取决于应用程序执行了多远.
图3-12.
TerminalI/O窗口EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-832355013010.
执行程序和暂停程序①按F5键,选择主菜单Debug>Go或工具条上的Go按钮都可以直接运行程序.
如果没有设置断点,程序一直执行到结束.
因为在本例中程序设计成无限循环,用户需要停止程序运行可以选择主菜单Debug→Break.
DebugLog窗口中显示程序运行状态的消息.
②如果要求复位应用程序,选择主菜单Debug>Reset或工具条上的Reset按钮.
③如果要退出C-SPY,选择Debug>StopDebugging,或工具条上的StopDebugging按钮.
C-SPY还提供许多其他的调试功能,如宏和中断模拟等,在再线帮助Help下的ARMEmbededWorkbenchUSERGUIDE中有详细介绍.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550131第五章如何编写STARM应用程序ARM芯片生产商为了推销自己的产品,通常都为每一款新芯片设计和生产可以展示该芯片所有功能或主要功能的评估板,同时提供Demo程序的源码和所有片上外设的驱动程序.
这些源程序通常都是高手写成,所以打算使用该芯片的用户用不着自己再花力气开发底层程序.
ST公司也是如此.
我们在下面以ST的STR710为例,帮助初学者理解c语言ARM应用程序的组织结构,学习如何利用ST公司提供的底层程序开发自己的应用程序.
我们先介绍ST公司为STR710提供了哪些底层程序及每个程序的功能.
然后再详细介绍其中几个重要程序.
最后介绍如何利用这些资源编写自己的程序.
1.
ST公司为STR710提供的源程序源文件头文件功能71_init.
s启动程序.
在进入c语言的main()之前完成对芯片的初始化,存储器分配及地址重映射.
71x_vect.
s定义Reset、异常和外设中断向量表.
71x_it.
c71x_it.
h所有异常和片上外设的中断服务程序.
全是空函数,由用户根据需要添加内容.
71x_map.
h以结构的形式描述所有片上外设的控制、状态和数据寄存器.
同时定义每种片上外设基地址.
71x_type.
h定义统一的项目数据类型.
71x_conf.
h芯片配置文件.
只需把目标系统所用外设名前面的//符号去掉就可定制目标系统配置.
71x_lib.
h根据配置文件包含相应的外设头文件71x_lib.
c给外设结构指针赋初值(基地址)adc12.
cAdc12.
h12位A/D转换器的设备驱动程序和头文件apb.
capb.
hAPB总线设备驱动程序和头文件bspi.
cbspi.
hBSPI接口设备驱动程序和头文件can.
ccan.
hCAN总线设备驱动程序和头文件eic.
ceic.
hEIC中断控制器驱动程序和头文件flash.
cflash.
h片内FLASH驱动程序和头文件gpio.
cgpio.
hGPIO驱动程序和头文件i2c.
ci2c.
hI2C总线驱动程序和头文件pcu.
cpcu.
h电源管理控制程序和头文件rccu.
crccu.
hRCCU控制程序和头文件rtc.
crtc.
hRTC控制程序和头文件uart.
cuart.
hUART驱动程序和头文件wdg.
cwdg.
hWatchDog驱动程序和头文件xti.
cxti.
h外部中断控制程序和头文件表5-1.
STR710源程序清单EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-83235501322.
几个主要程序的功能介绍建立一个最小结构的ARM项目,至少需要以下几个程序:z71x_init.
sz71x_vect.
sz71x_it.
cz71x_it.
hz71x_map.
hzmain.
c其中71x_init.
s是启动程序.
71x_vect.
s生成中断向量表即段INTVEC.
71x_it.
c存放中断服务程序,该文件只列出函数框架,用户根据需要填写服务程序内容.
main是主函数.
我们在前面介绍EWARM时举的例子STR710-LED就是一个最简单结构的ARM应用例子.
请注意,在71x_it.
c文件中的定时器中断服务程序中添加了以下内容:U32counter=1;//在文件开始时定义全局变量countervoidT1TIMI_IRQHandler(void){TIM1->SR&=~0x2000;//清除TIM1中断标志GPIO2->PD=GPIO2->PD4){counter=1;GPIO2->PD=0x0800;}}其主程序如下:#include"71x_map.
h"intmain(void){EIC->SIR[19]|=0x00000001;//配置通道19的优先级EIC->IER|=1ICR|=0x00000001;//允许中断//把GPIO2配置成Push-Pulloutput模式GPIO2->PC0=0xFFFF;GPIO2->PC1=0x0000;GPIO2->PC2=0xFFFF;EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550133GPIO2->PD=0x0800;//复位引脚//配置TIM1TIM1->CR2&=~0x2000;TIM1->CR2=0x2009;TIM1->CR1=0x8000;TIM1->CNTR=0xFFFF;while(1);//无限循环}启动运行上面的简单程序后,STR71-EVAL评估板上的4个发光二极管LD11,LD12,LD13和LD14无限制地循环点亮.
LED的轮流点亮是中断服务程序T1TIMI_IRQHandler中执行的.
而定时器1的配置和启动是在主程序main中完成的.
在大家注意,上述程序中用到结构指针TIM1、EIC和GPIO,这些都是在71x_map.
h文件中定义的.
我们在后面将对其做进一步介绍.
①启动程序的功能什么是启动程序它干什么用其实在编写8051的C语言程序时就有启动程序,它完全是C编译器生成的,很多人只是没注意到罢了.
例如,用户如果在main()之前定义了一个数据数组,而且还赋予每个元素以初值.
那么这个赋初值的任务就是由启动程序完成的.
下面让我们深入查看本手册例子中71x_init.
s的内容.
;程序状态处理器模式域设置值,对应于CPSR中的0-5位Mode_USRDEFINE0x10;用户模式Mode_FIQDEFINE0x11;快中断模式Mode_IRQDEFINE0x12;中断模式Mode_SVCDEFINE0x13;管理模式Mode_ABTDEFINE0x17;中止模式Mode_UNDEFDEFINE0x1B;未定义指令模式Mode_SYSDEFINE0x1F;系统模式I_BitDEFINE0x80;IBit置1时,,禁止IRQF_BitDEFINE0x40;FBit置1时,禁止FIQEIC_Base_addrDEFINE0xFFFFF800;EIC基地址ICR_off_addrDEFINE0x00;InterruptControlregister偏移量CIPR_off_addrDEFINE0x08;CurrentInterruptPriorityRegister偏移量IVR_off_addrDEFINE0x18;InterruptVectorRegister偏移量EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550134FIR_off_addrDEFINE0x1C;FastInterruptRegister偏移量IER_off_addrDEFINE0x20;InterruptEnableRegister偏移量IPR_off_addrDEFINE0x40;InterruptPendingBitRegister偏移量SIR0_off_addrDEFINE0x60;SourceInterruptRegister0偏移量EMI_Base_addrDEFINE0x6C000000;EMI基地址BCON0_off_addrDEFINE0x00;Bank0configurationregister偏移量BCON1_off_addrDEFINE0x04;Bank1configurationregister偏移量BCON2_off_addrDEFINE0x08;Bank2configurationregister偏移量BCON3_off_addrDEFINE0x0C;Bank3configurationregister偏移量EMI_ENABLEDEFINE0x8000;允许EMIBank(Bit15=1)EMI_SIZE_16DEFINE0x0001;16位宽度设置值(Bit0=1)GPIO2_Base_addrDEFINE0xE0005000;GPIO2基地址PC0_off_addrDEFINE0x00;PortConfigurationRegister0偏移量PC1_off_addrDEFINE0x04;PortConfigurationRegister1偏移量PC2_off_addrDEFINE0x08;PortConfigurationRegister2偏移量PD_off_addrDEFINE0x0C;PortDataRegister偏移量CPM_Base_addrDEFINE0xA0000040;CPM(MCLKDivideControlRegister)基地址BOOTCR_off_addrDEFINE0x10;CPM-BootConfigurationRegister偏移量FLASH_maskDEFINE0x0000;toremapFLASHat0x0RAM_maskDEFINE0x0002;toremapRAMat0x0;|-APBBridge(SystemPeripheral)|APB1_base_addrDEFINE0xC0000000;APBBridge1基地址APB2_base_addrDEFINE0xE0000000;APBBridge2基地址CKDIS_off_addrDEFINE0x10;APBBridge1-ClockDisableRegister偏移量SWRES_off_addrDEFINE0x14;APBBridge1-SoftwareResetRegister偏移量CKDIS1_config_allDEFINE0x27FB;Toenable/disableclockofallAPB1'speripheralsSWRES1_config_allDEFINE0x27FB;ToresetallAPB1'speripheralsCKDIS2_config_allDEFINE0x7FDD;Toenable/disableclockofallAPB2'speripheralsEWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550135SWRES2_config_allDEFINE0x7FDD;ToresetallAPB2'speripherals;program_startMODULEprogram_start;开始一个库模块RSEGIRQ_STACK:DATA(2)RSEGFIQ_STACK:DATA(2)RSEGUND_STACK:DATA(2)RSEGABT_STACK:DATA(2)RSEGSVC_STACK:DATA(2)RSEGCSTACK:DATA(2)RSEGICODE:CODE:NOROOT(2);NOROOT指定此段中如果没有代码,在连接时可抛弃PUBLIC__program_start;ExportsymblestoothermoduleEXTERNmain;ImportanexternalsymbleCODE32;Generate32-bitARMinstruction;定义两个宏;*Macro名:EIC_INIT;*功能:定义初始化EIC的宏,执行以下操作;-禁止IRQ;-禁止FIQ;-中断向量寄存器IVR包含loadPCopcode(0xF59FF00);-当前优先级=0;-禁止所有中断通道;-所有中断优先级=0;-所有SIR寄存器包含到相关IRQ表入口的偏移量;*Input:无;*Output:无EIC_INITMACROLDRr3,=EIC_Base_addrLDRr4,=0xE59F0000STRr4,[r3,#IVR_off_addr];WritetheLDRpc,[pc,#offset];instructioncodeinIVR[31:16]EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550136LDRr2,=32;32ChanneltoinitializeLDRr0,=T0TIMI_Addr;ReadtheaddressoftheIRQs;addresstableLDRr1,=0x00000FFFANDr0,r0,r1LDRr5,=SIR0_off_addr;ReadSIR0addressSUBr4,r0,#8;subtract8forprefetchLDRr1,=0xF7E8;addtheoffsettothe0x00000000;address(IVRaddress+7E8=0x00000000);0xF7E8usedtocompletethe;LDRpc,[pc,#offset]opcodeADDr1,r4,r1;computethejumpoffsetEIC_INIMOVr4,r1,LSL#16;LeftshifttheresultSTRr4,[r3,r5];StoretheresultinSIRxregisterADDr1,r1,#4;NextIRQaddressADDr5,r5,#4;NextSIRSUBSr2,r2,#1;DecrementthenumberofSIRregisters;toinitializeBNEEIC_INI;IfmorethencontinueENDM;*Macro名:PERIPHERAL_INIT;*功能:复位所有外设.
;*Input:无.
;*Output:无PERIPHERAL_INITMACROLDRr1,=APB1_base_addr;r0=APB1baseaddressLDRr2,=APB2_base_addr;r0=APB2baseaddressLDRr0,=CKDIS1_config_allSTRHr0,[r1,#CKDIS_off_addr];ClockDisablingforallAPB1peripheralsLDRr0,=CKDIS2_config_allSTRHr0,[r2,#CKDIS_off_addr;ClockDisablingforallAPB2peripheralsLDRr0,=SWRES1_config_allSTRHr0,[r1,#SWRES_off_addr];KeepunderresetallAPB1peropheralsEWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550137LDRr0,=SWRES2_config_allSTRHr0,[r2,#SWRES_off_addr];KeepunderresetallAPB2peropheralsMOVr7,#10;Waitthattheselectedmacrocellsexitfromresetloop1SUBSr7,r7,#1BNEloop1MOVr0,#0STRHr0,[r1,#SWRES_off_addr];EnableallallAPB1peropheralsSTRHr0,[r2,#SWRES_off_addr];EnableallallAPB2peropheralsSTRHr0,[r1,#CKDIS_off_addr];ClockEnablingforallAPB1peripheralsSTRHr0,[r2,#CKDIS_off_addr];ClockEnablingforallAPB2peripheralsMOVr7,#10;Waitthattheselectedmacrocellsexitfromresetloop2SUBSr7,r7,#1BNEloop2ENDM;重映射请求;Reset后,STR710的两个引脚BOOT0和BOOT1的状态(外部设定)被锁存进BOOT配置;寄存器PCU_BOOTCR中(0xA0000050).
引导方式通常由此两引脚决定,但是在启动程序;中允许在Reset后由软件修改硬件设置.
如果用户希望在启动程序中规定引导方式,可以删除;下面的注释符号.
这样BOOT引脚上的设置将不影响引导方式.
;#defineremapping;然后确定将哪块存储器映射到地址0x00000000;如果希望重映射到RAM,删除下一行的注释;#defineremap_ram;如果希望重映射到FLASH,则删除下一行的注释;#defineremap_flashIMPORTT0TIMI_Addr;定义外部符号T0TIMI_Addr__program_startLDRpc,=NextInstNextInstNOP;WaitforOSCstabilizationNOPNOPNOPEWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550138NOPNOPNOPNOPNOP;ARM处理器支持7种运行模式,其中6种是特权模式,一种是用户模式.
除用户模式和系;统模式外其他都是异常模式.
每种处理器模式使用不同的寄存器组,并有自己独立的物理;寄存器R13(SP).
所以在初始化时要将SP指向其运行模式的栈空间.
堆栈的大小和地址;是在连接命令文件中定义的.
MSRCPSR_c,#Mode_ABT|F_Bit|I_Bitldrsp,=SFE(ABT_STACK)&0xFFFFFFF8;指向ABT_STACK栈底MSRCPSR_c,#Mode_UNDEF|F_Bit|I_Bitldrsp,=SFE(UND_STACK)&0xFFFFFFF8;指向UND_STACK栈底MSRCPSR_c,#Mode_SVC|F_Bit|I_Bitldrsp,=SFE(SVC_STACK)&0xFFFFFFF8;指向SVC_STACK栈底;如果要求复位所有外设,删除下一行注释;PERIPHERAL_INIT;调用宏PERIPHERAL_INIT;如果要求初始化EIC,删除下一行注释EIC_INIT;调用宏EIC_INIT;REMAPPING根据前面的重映射请求决定是否做重映射处理;Description:RemappingmemorywhetherRAM,FLASH;atAddress0x0aftertheapplicationhasstartedexecuting.
;RemappingisgenerallydonetoallowRAMtoreplaceFLASH;at0x0.
;theremappingofRAMallowcopyingofvectortableintoRAM;下面的程序修改BOOTCR[1:0]的内容.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550139#ifdefremapping#ifdefremap_flashMOVr0,#FLASH_mask#endif#ifdefremap_ramMOVr0,#RAM_mask#endifLDRr1,=CPM_Base_addrLDRHr2,[r1,#BOOTCR_off_addr];读BOOTCR的低2位BICr2,r2,#0x03;清除BOOTCR的低2位ORRr2,r2,r0;根据R0修改BOOTCR的低2位STRHr2,[r1,#BOOTCR_off_addr];写回BOOTCR寄存器#endifMSRCPSR_c,#Mode_FIQ|I_Bit;ChangetoFIQmodeldrsp,=SFE(FIQ_STACK)&0xFFFFFFF8;指向FIQ_STACK栈底MSRCPSR_c,#Mode_IRQ|I_Bit;ChangetoIRQmodeldrsp,=SFE(IRQ_STACK)&0xFFFFFFF8;指向IRQ_STACK栈底MSRCPSR_c,#Mode_USR;ChangetoUsermode,EnableIRQandFIQldrsp,=SFE(CSTACK)&0xFFFFFFF8;指向CSTACK(user)栈底;现在跳转到C库函数mainbmain;注意只能用指令B不能用BL,因为不再返回.
LTORGEND从上面的STR710-LED的启动程序清单中我们可以看到,启动程序执行以下任务:z定义了CSPR寄存器中处理器模式控制字段的值和中断控制字段值;z定义了EIC、EMI、GPIO、APB1和APB2的基地址和相关控制寄存器的偏移量;z定义了各种处理器模式的堆栈;z定义了初始化EIC和外部设备的2个宏;z决定是否重映射;z加载各处理器模式的堆栈指针EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550140z跳转到C的库程序main上面STR710-LED的启动程序在很多情况下是可以通用的,几乎不做任何修改就可以用于其他项目.
当然有时候也需要做一定的修改才能使用.
建议初学者先直接引用这个启动程序,等到熟悉以后再根据项目需要做修改.
②71x_vect.
s71x_vect.
s建立Reset、异常中断处理程序以及外设中断的向量表,初学者可以直接引用这个启动程序.
③71x_it.
c和71x_it.
h71x_it.
c中包含所有中断服务程序的空函数,用户可以选择加进自己中断服务程序.
就象前面介绍的.
④71x_cofg.
h71x_cofg.
h是目标系统配置文件,它是用户开发自己的项目时唯一要修改的文件.
用户应根据目标板上使用到的芯片资源定制自己的项目配置文件,方法是删除使用设备前面的注释.
注意,在STR710-LED例子中没有利用71x_cofg.
h.
请看下面例子:#ifndef__71x_CONF_H#define__71x_CONF_H/*Commentthelinebelowtoputthelibraryinreleasemode*/#defineDEBUG#defineinlineinline/*系统不用的设备名前加注释*/#define_ADC12/*起用ADC12*//*#define_APB*//*#define_APB1*//*#define_APB2*//*#define_BSPI*//*#define_BSPI0*//*#define_BSPI1*//*#define_CAN*//*#define_EIC*//*#define_EMI*//*#define_FLASH*/EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550141#define_GPIO/*起用GPIO0和1*/#define_GPIO0#define_GPIO1/*#define_GPIO2*//*#define_I2C*//*#define_I2C0*//*#define_I2C1*/#define_PCU/*起用PCU*/#define_RCCU/*起用RCCU*//*#define_RTC*//*#define_TIM*//*#define_TIM0*//*#define_TIM1*//*#define_TIM2*//*#define_TIM3*//*#define_UART*//*#define_UART0*//*#define_UART1*//*#define_UART2*//*#define_UART3*//*#define_USB*//*#define_WDG*//*#define_XTI*//*#define_IRQVectors*/#endif/*__71x_CONF_H*/在这个例子中我们为目标系统配置了ADC12、GPIO0、GPIO1、PCU和RCCU这几个设备.
EWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550142⑤71x_map.
h在71x_map.
h文件中以结构的形式定义片上外部设备的控制、状态和数据寄存器.
我们以12位A/D为例:z定义AD转换器寄存器组的结构如下:typedefvolatilestruct{vu16DATA0;vu16EMPTY1[3];//EMPTY是寄存器之间的空地址单元(6个字节)vu16DATA1;vu16EMPTY2[3];vu16DATA2;vu16EMPTY3[3];vu16DATA3;vu16EMPTY4[3];vu16CSR;vu16EMPTY5[7];vu16CPR;}ADC12_TypeDef;z定义A/D转换器寄存器组的基地址因为A/D转换器连接在APB2总线上,先定义APB2的基地址#defineAPB2_BASE0xE0000000然后根据偏移量定义A/D转换器寄存器组的基地址#defineADC12_BASE(APB2_BASE+0x7000)⑥71x_lib.
c71x_lib.
c根据用户的配置文件(71x_conf.
h)自动初始化目标系统起用的外设指针.
仍以A/D转换器为例,见下面:#ifdef_ADC12ADC12=(ADC12_TypeDef*)ADC12_BASE#endifEWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-8323550143此后用户在应用程序中需要引用A/D转换器的某个寄存器时只需用以下方法即可:ADC12->CSR=0x00;⑦71x_lib.
h71x_lib.
h根据用户的配置文件(71x_conf.
h)包含需要访问的头文件,还是以ADC12举例来说明.
如果我们在71x_conf.
h中配置了AD转换,即删除了#define_ADC12前的注释.
那么在71x_lib.
h中有:#ifdef_ADC12#include"adc12.
h"#endif注意:ST的所有源文件最初是为RealView开发环境编写的.
在RealView中其输出代码是否带调试信息是根据在71x_cofg.
h中是否保留语句#defineDEBUG决定的.
在71x_map.
h中有#ifdefDEBUG的定义.
而在IAREWARM开发环境中,输出DEBUG还是RELEASE版本,是在EWARM开发环境中选择的.
用户应注意在利用ST的源程序时应该怎样处理两者之间关系.
3.
如何利用ST源程序着手编写应用程序写到这里相信大家已经看出着手编写STSTR710的应用程序是多么容易了.
为了清晰起见,我们把流程列在下面:①建议备份ST的01STR71x软件包,以防无意修改或破坏.
②建立新工作区和新项目,并根据前面介绍设置项目选件.
③给项目添加文件.
必须添加的文件有:71x_init.
s(注:在项目下建立一个startup组,把71x_init.
s和71x_vect.
s放在此组)71x_vect.
s71x_it.
c(注:如不需要定时器1的中断处理,就把voidT1TIMI_IRQHandler(void)函数内部写空)71x_lib.
c目标系统所用到设备驱动c程序;④在连接器指向的include目录中,必须包含以下文件71x_it.
h71x_map.
h71x_type.
h71x_conf.
hEWARM应用入门指南万利电子有限公司整理地址:南京市新模范马路17号02幢2层电话:025-83235502/83235503邮编:210003传真:025-832355014471x_lib.
h至少包含目标系统所用到设备的头文件(﹡.
h),一般include目录应包含所有头文件;⑤根据用户目标系统的外设配置要求修改71x_cong.
h文件;⑥添加或编写用户自己的main主程序,在程序头上添加语句#include71x_lib.
h,在程序中调用ST提供的外设驱动程序完成自己的操作需求.
01STR71x软件包中有很多单个的片上外设的例子.
初学者可以去再试验和了解如何操作这些设备.
简介华圣云 HuaSaint是阿里云国际版一级分销商(诚招募二级代理),专业为全球企业客户与个人开发者提供阿里云国际版开户注册、认证、充值等服务,通过HuaSaint开通阿里云国际版只需要一个邮箱,不需要PayPal信用卡,不需要买海外电话卡,绝对的零门槛,零风险官方网站:www.huasaint.com企业名:huaSaint Tech Limited阿里云国际版都有什么优势?阿里云国际版的产品...
昨天,有在"阿里云秋季促销活动 轻量云服务器2G5M配置新购年60元"文章中记录到阿里云轻量服务器2GB内存、5M带宽一年60元的活动,当然这个也是国内机房的。我们很多人都清楚备案是需要接入的,如果我们在其他服务商的域名备案的,那是不能解析的。除非我们不是用来建站,而是用来云端的,是可以用的。这不看到其对手腾讯云也有推出两款轻量服务器活动。其中一款是4GB内存、8M带宽,这个比阿里云还要狠。这个真...
我们一般的站长或者企业服务器配置WEB环境会用到免费版本的宝塔面板。但是如果我们需要较多的付费插件扩展,或者是有需要企业功能应用的,短期来说我们可能选择按件按月付费的比较好,但是如果我们长期使用的话,有些网友认为选择宝塔面板企业版或者专业版是比较划算的。这样在年中大促618的时候,我们也可以看到宝塔面板也有发布促销活动。企业版年付899元,专业版永久授权1888元起步。对于有需要的网友来说,还是值...