LED裸机程序(IAR)
一、实验环境
开发环境:IAR5.30
开发板:UT-S3C6410
开发工具:JLINK V8
二、实验目的
在无操作系统的开发板上,运行程序,掌握裸机程序的开发过程,熟悉IAR和JLINK的使用。
三、实验步骤
1、准备工作
找一份S3C6410X芯片手册和开发板原理图,还要找根跳线把调试端口JTAG傍边的第二个和第三个引脚连起来。
没有操作系统的ARM和51单片机没有多大的差别,所以一开始大家就不要有畏惧感。
先准备点理论知识,外围设备会映射到内存地址空间,地址是固定不变的,因不同的芯片而不同,可以从S3C6410X.PDF的资料上找映射的详细信息。找到外围设备对应的内存地址后,就可以对外围设备进行操作了,如果用C语言,用指针就可以对其进行读写操作,之后的事一切都变得很简单。
2、创建工程,修改参数
打开IAR,新建一个工程。然后打开配置选项project> option:
我的开发板的内核是ARM1176JF-S(在S3C6410X的芯片资料上能找到),所以选上。
然后:
配置好,点击OK。
3、添加启动代码
添加一个启动代码文件(cstartup.s)到工程中,这个代码的作用是初始化中断和7种异常情况并建立异常向量表,完成后会跳到main函数的入口地址执行。
启动代码文件放在C:\Program Files\IAR Systems\Embedded
Workbench 5.4 Kickstart\arm\src\lib\arm目录下,先把它复制到自己的工程目录下。
步骤1:
步骤2:
点击打开,添加完成。
4、添加.ICF文件
.ICF文件的作用是告诉linker怎么把数据和代码分布到物理内存中,和MDK中的scatter
file是相同作用。
本实验用的.ICF文件放在C:\Program Files\IAR Systems\Embedded
Workbench 5.4 Kickstart\arm\config目录下,复制到工程目录下,并改名为6410.icf
从图中可以得知rom是从0X0C00000地址开始的,这个区间(0x0c000000~0x0fffffff)正是我们经常烧写bootloader的地址,我们正真能操作的空间大小只有4K,所以生成的可执行文件不能大于4K,详细信息芯片资料上有介绍。所以对.icf文件进行如下修改:
define symbol __ICFEDIT_intvec_start__ = 0x0c000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__= 0x0c000000;
define symbol __ICFEDIT_region_ROM_end__= 0x0c000FFF;
define symbol __ICFEDIT_region_RAM_start__= 0x0c000000;
define symbol __ICFEDIT_region_RAM_end__= 0x0c000FFF;
然后设置一下:
4、查找LED1的映射地址
打开开发板核心板的原理图:
不难找到LED1对应的引脚是GPM0,然后找打开S3C6410的芯片资料,找到GPM映射的详细信息。
可以看到GPMCON GPMDAT两个寄存器映射到的内存地址空间,GPMPUD就别不要管了。
这是LED1映射到的具体的地址,可以同过对GPMCON设置把GPM0设置为OUTPUT模式。
这是LED的数据地址,没个LED占了一个bit,对这个地址上相应的位写数据就能控制LED的亮和灭(1/0)。
5、编写代码
#include
int main(void)
{
int i;
int *pcon = NULL;
int *pdat = NULL;
pcon = (int *)0x7f008820;
*pcon = 0x1; //bit0 : 0001 means GPM0 output
pdat = (int *)0x7f008824;
while(1)
{
*pdat = 0x0; //0 - LED OFF
//delay
for(i = 0;i<500000;i++);
*pdat = 0x01; //1 -- LED ON
for(i = 0;i<500000;i++);
}
}
编好后添加到工程中。
上面的程序风格显然是不可取,只是为了直观,具体请参考附件: LED.zip
接好JLINK,点击DEBUG AND DOWNLOAD按钮就能在板子上看到现象并能进行调试。
水平有限,如果有错误的地方,请指正,thanks
cjok.liao@gmail.com