一灯大师之点亮OK6410开发板上4个LED裸机程序---嵌入式回归第十篇

接着上一篇关闭mmu和cache后,这一篇来点亮开发板上的一盏LED小灯,前面所作的初始化工作基本看不到效果,其实这一段也是最麻烦的!如果有问题调试很麻烦!点亮了LED之后就可以用LED来看程序是否如预期那样运行,传说中的一灯大师就要出场了,准备好了吗?

1. LED原理图分析

底板上LED部分的原理图:


然后根据核心板找到LED是由哪个GPIO控制的


可以看到LED1、LED2、LED3、LED4是在GPM这一组GPIO控制的, 依次是GPM0、 GPM1、 GPM2 、GPM3

由数据手册找到GPM部分:


2. 芯片手册导读

6410 datasheetGPIO部分(上面的截图)


3. 程序步骤流程设计

    1. 设置GPIO控制寄存器把引脚设置为输出

    2. 根据原理图设置GPIO数据寄存器,点亮LED

4. 用代码实现功能

GPIO端口至少需要两个寄存器,一个控制寄存器,一个数据寄存器


这里还要根据之前的架构步骤有一个部分是基地址初始化!

这里贴上代码:

<span style="font-size:18px;">light_led:
	ldr r1, =0x7F008820
	ldr r0, =0x1111
	str r0, [r1]
	
	ldr r1, =0x7F008824
	mov r0,#0x0
	@mov r0,#0xe
	str r0,[r1]
	mov pc, lr</span>

至此整个start.S启动代码:

<span style="font-size:18px;">.text
.global _start
_start:
	b reset
	ldr pc, _undifined_instruction @跳转到reset标号处 0地址处理就的是reset异常模式	
	ldr pc, _software_interrupt @ldr伪指令 相当于装载指令
	ldr pc, _prefetch_abort
	ldr pc, _data_abort
	ldr pc, _not_used
	ldr pc, _irq
	ldr pc, _fiq
	
@新开一个内存单元 将地址值装载到内存中
_undifined_instruction: .word undifined_instruction @这里再给每种异常模式定义一个标号
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word reset

undifined_instruction:
	nop

software_interrupt:
	nop
	
prefetch_abort:
	nop
	
data_abort:
	nop

not_used: @地址0x00000014处 这里什么也不做
	nop

irq:
	nop

fiq:	
	nop

reset:
	bl set_svc
	bl set_peri_port
	bl disable_watchdog
	bl disable_interrupt
	bl disable_mmu
	bl light_led

set_peri_port: @基地址初始化
	ldr r0, =0x70000000
	orr r0, r0, #0x13
	mcr p15,0,r0,c15,c2,4
	mov pc, lr

set_svc:
	mrs r0, cpsr
	bic r0, r0,#0x1f @后5位清零
	orr r0, r0,#0xd3 @相应位置1 10011
	msr cpsr, r0 @写入GPSR寄存器
	mov pc, lr

#define pWTCON 0x7e004000 @watchdog CON寄存器地址
disable_watchdog:
	ldr r0, =pWTCON @将地址装载到通用寄存器
	mov r1, #0x0 @将0传到r1寄存器中
	str r1, [r0] @将值传到到寄存器地址所在的内存中
	mov pc, lr

disable_interrupt:
	mvn r1,#0x0  @写入全1 取反然后填入到r1寄存器中
	ldr r0,=0x71200014 @用r0保存地址
	str r1,[r0] @然后将r1中的值写入到ro地址中去

	ldr r0,=0x71300014
	str r1,[r0]
	mov pc, lr

disable_mmu:
	mcr p15,0,r0,c7,c7,0
	mrc p15,0,r0,c1,c0,0
	bic r0, r0, #0x00000007
	mcr p15,0,r0,c1,c0,0
	mov pc, lr

light_led:
	ldr r1, =0x7F008820
	ldr r0, =0x1111
	str r0, [r1]
	
	ldr r1, =0x7F008824
	mov r0,#0x0
	@mov r0,#0xe
	str r0,[r1]
	mov pc, lr</span>
	
编译然后通过SD卡启动,连接好USB下载线,通过dnw工具将编译好的uboot.bin文件下载到目标板上运行!(前面的博文中有讲到如何下载uboot)


这里是点亮上面电路图中的四盏LED小灯,发一张效果截图:


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在SoC开发板上,可以使用汇编语言和C语言混合编写应用程序。这种混合编程的方式可以充分发挥汇编语言的高效性能和C语言的可读性和易用性。以下是一个基于Cortex-A9的LED控制应用程序的示例代码,其中包含了汇编语言和C语言代码: 汇编语言代码: ``` .global _start _start: /* 初始化GPIO控制器 */ ldr r0, =0x48002000 /* GPIO控制器基地址 */ ldr r1, =0x00000C00 /* 将GPIO1设为输出 */ str r1, [r0, #0x400] /* 设置GPIO1为输出模式 */ loop: /* 点亮LED */ ldr r1, =0x00000200 /* 将GPIO1输出设置为高电平 */ str r1, [r0, #0x190] /* 设置GPIO1输出为高电平 */ /* 延时 */ mov r2, #0 delay: add r2, r2, #1 cmp r2, #1000000 bne delay /* 熄灭LED */ ldr r1, =0x00000000 /* 将GPIO1输出设置为低电平 */ str r1, [r0, #0x190] /* 设置GPIO1输出为低电平 */ /* 延时 */ mov r2, #0 delay2: add r2, r2, #1 cmp r2, #1000000 bne delay2 /* 重复循环 */ b loop ``` C语言代码: ``` #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/mman.h> #define GPIO_BASE 0x48002000 #define GPIO_OE 0x134 /* GPIO方向控制寄存器 */ #define GPIO_OUTPUT 0x194 /* GPIO输出寄存器 */ int main(int argc, char *argv[]) { volatile unsigned int *gpio; int fd; /* 打开/dev/mem文件 */ fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); } /* 映射GPIO控制器到进程内存空间 */ gpio = (unsigned int *) mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_BASE); if (gpio == MAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); } /* 将GPIO1设为输出 */ *(gpio + (GPIO_OE / 4)) &= ~0x200; /* 循环控制LED灯亮灭 */ while (1) { /* 点亮LED */ *(gpio + (GPIO_OUTPUT / 4)) |= 0x200; /* 延时 */ volatile int i; for (i = 0; i < 1000000; i++) {} /* 熄灭LED */ *(gpio + (GPIO_OUTPUT / 4)) &= ~0x200; /* 延时 */ for (i = 0; i < 1000000; i++) {} } return 0; } ``` 这个例子中,汇编语言代码用来初始化GPIO控制器和控制LED亮灭,而C语言代码则用来完成/dev/mem文件的打开和GPIO控制器的映射,以及LED灯控制循环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值