免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 899 | 回复: 0
打印 上一主题 下一主题

LPC2124 C LEDFlash [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-09 10:25 |只看该作者 |倒序浏览

在ARM中不能直接运行C程序,先要用汇编语言来配置C运行的环境才行
初始化C运行环境的汇编文件:Startup.s
说明:|Image$$RO$$Limit|=|Image$$RO$$Base|+code size+RO data size
;导入ADS定义的变量
IMPORT |Image$$RO$$Limit| ;只读区域的末地址
IMPORT |Image$$RW$$Base|;读写区域的首地址
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
;声明要调用C的入口点
IMPORT main
AREA init,CODE,READONLY
ENTRY
CODE32
Reset
LD SP,=0X40003F00 ;设置堆栈指针
;初始化C的运行环境
LDR R0,=|Image$$RO$$Limit|
LDR R1,=|Image$$RW$$Base|
LDR R3,=|Image$$ZI$$Base|
CMP R0,R1 ;将Ro limit跟Rw base相比较
BEQ LOOP1 ;如果相等则说明Rwbase紧跟在Rolimit后跳至LOOP1
LOOP0
;如果RW区域不为空则将RO数据拷贝至RW区域
CMP R1,R3 ;将Rw base跟ZI base比较(CC无符号数小于)
LDRCC R2,[R0],#4 ;如何RW区域不为空则将加载的RW数据拷贝到运行域(R2做临时寄存器)
STRCC R2,[R1],#4 ;由于ARM指令是32位,4字节对齐则地址每次要加4
BCC LOOP0
LOOP1
LDR R1,=|Image$$ZI$$Limit|
MOV R2,#0
LOOP2
CMP R3,R1;将ZIbase跟ZIlimit比较(CC无符号数小于)
STRCC R2,[R3],#4 ;如果小于则说明区域不为空则清零
BCC LOOP2 ;继续
;跳至C程序的入口
B main
END
C程序
#include "LPC2124.h"
#define uint32 unsigned int
//延时函数
void delay(uint32 time){
uint32 i;
for(;time>0;time--)
  for(i=0;i
int main(void){
//设置P0所有管脚连接GPIO
PINSEL0=0x00000000;
//设置P0所有管脚方向为输出
IO0DIR=0xFFFFFFFF;
while(1){
  ;P0口置位
  IO0SET=0xFFFFFFFF;
  ;延时
  delay(10);
  ;P0口清零
  IO0CLR=0xFFFFFFFF;
  delay(10);
}
return 0;
}
//LPC2124.h头文件中包含了一些寄存器的地址定义
//寄存器具体的地址可根据LPC2124UserManual中给出的定义
/*Pin Connect Block*/
//管脚连接模块控制寄存器,为防止编译器优化加上volatile关键字
//使每次的读取写入都物理的进行
#define PINSEL0 (*(volatile unsigned long*)0xe002c000)
#define PINSEL1 (*(volatile unsigned long *)0xe002c004)
//#define PINSEL2 (*(volatile unsigned long *)0xe002c014)
/*Genral Purpose Input/Output(GPIO)*/
//通过并行I/0口寄存器
#define IO0PIN (*(volatile unsigned long*)0xe0028000)
#define IO0SET (*(volatile unsigned long*)0xe0028004)
#define IO0DIR (*(volatile unsigned long*)0xe0028008)
#define IO0CLR (*(volatile unsigned long*)0xe002800c)
#define IO1PIN (*(volatile unsigned long*)0xe0028010)
#define IO1SET (*(volatile unsigned long*)0xe0028014)
#define IO1DIR (*(volatile unsigned long*)0xe0028018)
#define IO1CLR (*(volatile unsigned long*)0xe002801c)
配置ADS,DebugRelSettings->Target Settings->Post-linker选择ARM fromElf
   ->ARM Linker->Output->RO Base: 0x00 RW Base:0x40003000
  ->Options->Image entry point:0x00
  ->Layout->Object/Symbol:Startup.o Section:init
  (Startup.o就是由Startup.s汇编引导文件生成的目标文件名,init就是ARM的第一个引导段名)
  ->ARM fromELF->Output format: Intel 32 bit Hex
            ->Output filename:flashled.hex

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/56374/showart_1895161.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP