Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370771
  • 博文数量: 50
  • 博客积分: 1495
  • 博客等级: 上尉
  • 技术积分: 805
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-21 14:19
文章分类

全部博文(50)

文章存档

2011年(47)

2010年(3)

分类: 嵌入式

2011-04-28 21:14:35

LED裸机程序(IAR)

一、实验环境

开发环境:IAR5.30

开发板:UT-S3C6410

开发工具:JLINK V8

 

二、实验目的

在无操作系统的开发板上,运行程序,掌握裸机程序的开发过程,熟悉IARJLINK的使用。

 

三、实验步骤

1、准备工作

找一份S3C6410X芯片手册和开发板原理图,还要找根跳线把调试端口JTAG傍边的第二个和第三个引脚连起来。

 

没有操作系统的ARM51单片机没有多大的差别,所以一开始大家就不要有畏惧感。

先准备点理论知识,外围设备会映射到内存地址空间,地址是固定不变的,因不同的芯片而不同,可以从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

 

 

阅读(4840) | 评论(1) | 转发(0) |
0

上一篇:订阅Linux邮件列表

下一篇:十大经典理论

给主人留下些什么吧!~~

wowojyc2014-02-20 15:48:30

你好,我想问一下,如果对于别的芯片,
1:”要找根跳线把调试端口JTAG傍边的第二个和第三个引脚连起来“这个地方是必需的吗?
2:同样是别的芯片,“对.icf文件进行如下修改”的修改,有什么依据吗?

万分感谢