S3C6410裸板纯汇编流水灯的实现

本文介绍了一个基于ARM架构的裸机程序实现LED灯闪烁的过程。通过直接操作寄存器来控制LED的状态,并使用延时函数实现闪烁效果。程序包括Makefile配置、汇编源代码及延时和LED控制函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



(1)    Makefile


CC		:= arm-linux-gcc
AS		:= arm-linux-as
LD		:= arm-linux-ld
OBJCOPY	:= arm-linux-objcopy


BIN		:= arm.bin
ELF		:= arm
OBJS	:= ledflow.o

all:$(ELF)
	$(OBJCOPY) $< -O binary /var/lib/tftpboot/$(BIN)
$(ELF):$(OBJS)
	$(LD) $^ -o $@ -Ttext 0
%.o:%.c
	$(CC) $< -c -o $@
%.o:%.s
	$(AS) $< -o $@


.PHONY:clean
clean:
	rm -f $(OBJS) $(ELF)

(2)ledflow.s


	.align 2
	.global _start
	.text
_start:
	@从0x70000000 偏移256M的地址来操作外设 
	@Pheripheral is accessed via PERI bus, 
	@and its address range is from 0x7000_0000 to 0x7FFF_FFFF. All SFRs 
	@can be accessed in this address range. 
	@Also, if data isneeded to transfer from NFCON or CFCON, those data 		
	@should be transferred via PERI bus. 
	mov r0,#0x70000000	@S3C6410X.pdf	p114 MemoryMap	 
	orr r0,#0x13		@ARM1176jzfs.pdf	p343 0x13 -> 256M
	mcr p15,0,r0,c15,c2,4	@ARM1176jzfs.pdf	p344

	@关闭看门狗
	ldr r0,=0x7E004000 
	mov r1,#0
	str r1,[r0]
	@精确操作寄存器来关闭
	@	ldr r0,=0x7E004000
	@	bic r1,#(1 << 5)
	@	str r1,[r0]
	@	mov sp,#0x2000

	@我们写的是裸板从0x0这里开始只有8k(0x2000)的地址可以用  
	@栈放大地址(c语言的栈为满递减栈,为了保证空间大小,将栈放在高地址)
	mov sp,#0x2000	

bl	main

main:
	stmfd	sp!,{r0-r12,lr}
	
	bl	led_init

m_loop1:
	mov	r0,#0
	m_loop2:
		mov r1,r0
		bl	led_on
		mov r0,#10
		bl	delay
		mov r0,r1
		bl	led_off
		mov r0,#10
		bl	delay
		mov r0,r1

		add 	r0,#1
		cmp 	r0,#4
	bllt	m_loop2	

bl 		m_loop1
ldmfd	sp!,{r0-r12,pc}

delay:
stmfd	sp!,{r0-r12,lr}
	mov r1,#0

		d_loop1:	
			mov r2,#0
		d_loop2:
			add r2,#1
			cmp	r2,#0x2700
	blt	d_loop2
			add r1,#1
			cmp	r1,r0
	blt	d_loop1	

ldmfd	sp!,{r0-r12,pc}

led_init:
stmfd	sp!,{r0-r12,lr}     

	ldr r1,=0x7F008820
	ldr	r0,[r1]
	bic r0,#0xff			
	bic r0,#0xff00			
	orr r0,#0x11
	orr r0,#0x1100
	str	r0,[r1]
	ldr r1,=0x7F008824
	ldr r0,[r1]
	orr r0,#0xf
	str r0,[r1]
	ldr r1,=0x7F008828
	ldr r0,[r1]
	bic r0,#0xff
	str r0,[r1]
ldmfd	sp!,{r0-r12,pc}

led_on:
stmfd	sp!,{r0-r12,lr}
	ldr r1,=0x7F008824
	ldr r4,[r1]
	mov r2,#1
	
	lsl r0,r2,r0
	
	bic r4,r0
	str r4,[r1]
ldmfd	sp!,{r0-r12,pc}

led_off:
stmfd	sp!,{r0-r12,lr}
	ldr r1,=0x7F008824
	ldr r4,[r1]	
	mov r2,#1
	
	lsl r0,r2,r0

	orr r4,r0
	str r4,[r1]
ldmfd	sp!,{r0-r12,pc}










                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值