点亮LED(C语言版)

LED点灯 C语言程序

C语言版的点灯程序在.c文件中实现寄存器的配置,在汇编文件中调用相关的功能代码。也就是说C语言版的程序与汇编版的程序相比,实现的功能相同,只是改变了配置寄存器的方式。

下面是点亮LED的.c文件,代码如下:

int main()
{
	unsigned int *pGPFCON = (unsigned int *)0x56000050;
	unsigned int *pGPFDAT = (unsigned int *)0x56000054;

	/* 配置GPF4为输出引脚 */
	*pGPFCON = 0x100;
        /*  点亮另外两个LED 
	 配置GPF5为输出引脚 
	*pGPFCON = 0x400;
        配置GPF6为输出引脚 
	*pGPFCON = 0x1000;  */
	/* 设置GPFx输出0 */
	*pGPFDAT = 0;

	return 0;
}

说明:

*pGPFCON和*pGPFDAT分别为指向配置寄存器和数据寄存器的指针,*pGPFCON = 0x100通过向地址写入数据完成寄存器的配置。

与汇编命令相比,通过指针写入数据,而不是直接向地址写入数据,提高了程序的可读性。

同时,在后面的开发中,通常寄存器地址都记录头文件中,不需要自己定义。

上面完成了功能代码的编写,还需要一个调用者,就是下面的start.S文件。

.text
.global _start

_start:

	/* 设置内存: sp 栈 */
	ldr sp, =4096  /* nand启动 */
//	ldr sp, =0x40000000+4096  /* nor启动 */

	/* 调用main */
	bl main

halt:
	b halt

说明:

sp:sp是栈顶指针,它每次指向栈顶。它指示了程序开始的地址。程序运行时,sp的值向下增长。

由于片内内存SRAM为4k,因此将sp设置为4096。nand启动的地址是0x00000000,nor启动的地址是0x40000000。

详见:http://bbs.elecfans.com/jishu_1770367_1_1.html

bl:bl用于子程序跳转,要返回地址,返回地址存于LR中。当发生bl跳转前,会在寄存器 R14 (即LR)中保存当前PC-4,即bl跳转指令的下一条指令的地址。

程序在执行完main函数后,进入halt死循环。

Makefile的内容如下:

all:
	arm-linux-gcc -c -o led.o led.c
	arm-linux-gcc -c -o start.o start.S
	arm-linux-ld -Ttext 0 start.o led.o -o led.elf
	arm-linux-objcopy -O binary -S led.elf led.bin
	arm-linux-objdump -D led.elf > led.dis
clean:
	rm *.bin *.o *.elf *.dis

说明:

对于多文件的项目编译,是分别将源文件单独编译为.o文件,然后将.o文件进行链接操作。

程序烧写和结果部分省略。

你可能感兴趣的文章

相关问题

0 条评论&回复

请先 登录 后评论
Corason
Corason

4 篇文章

作家榜 »

  1. 百问网-周老师 18 文章
  2. st_ashang 14 文章
  3. 渐进 12 文章
  4. zxq 11 文章
  5. helloworld 8 文章
  6. 谢工 5 文章
  7. Litchi_Zheng 5 文章
  8. DebugArm 5 文章