首页 > 代码库 > 7.点亮led的操作
7.点亮led的操作
7.点亮led的操作
Led可以作为我调试程序的工具。
OK6410的核心板原理图:led的部分截图:
我们从上面的原理图知道,led1-4对应的是GPM0-3.
?
?
2.GPIO
GPIO是General-Purpose Input/Output Ports:通用输入/输出端口。在嵌入式系统中,CPU经常需要控制许多结构简单的外部设备或者电路,这些设备通常只要两种状态,即是开关,对这些设备的控制,使用传统的串口或者USB口就显得复杂,所以,在嵌入式为控制器上通常提供了一种"通用的可编程的I/O端口",也就是GPIO。
下面是6410GPIO的信息:GPMCON控制寄存器:
GPMDAT数据寄存器:
实现的代码:点亮。3、4灯。
编译,生成.bin文件。这是可执行文件。当我们烧写到开发板的时候,发现开发板不亮。这是因为我们在前面的操作中没有去初始化硬件的外设接口。
其中上面的orr中的0x13=0b10011,是对应256M内存。
下面是把设置好的值写到cp15:
?
?
?
代码:
.text
.global _start
_start:
????b reset
????ldr pc, _undifined_instruction
????ldr pc, _software_interrupt
????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:
????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_svc:
????mrs r0,cpsr@把cpsr里的值读到r0
????bic r0,r0,#0x1f@清除r0,即cpsr的后五位为0
????orr r0,r0,#0xd3@设置r0的后五位为10011,svc的值
????msr cpsr,r0@把值写回cpsr。svc模式设置完成
?
set_peri_port:
????ldr r0, =0x70000000
????orr r0, r0, #0x13
????mcr p15,0,r0,c15,c2,4
????mov pc, lr
?
#define pWTCON 0x7E004000
disable_watchdog:
????ldr r0,=pWTCON@把这个常量装载到r0里面
????mov r1,#0x0@这里不能直接将pWTCON的值直接mov到寄存器里面
????@mov的对象是通用寄存器。这里需要使用str指令装载。
????str r1,[r0]@把r1存到0x7E004000
?
disable_interrupt:
????mvn r1,#0x0@往r1写入全1
????ldr r0,=0x71200014
????str r1,[r0]
?
????ldr r0,=0x71300014
????str r1,[r0]
disable_mmu:
????mcr p15,0,r0,c7,c7,0@controller
????mrc p15,0,r0,c1,c0,0
????bic r0, r0, #0x00000007@设置后三位为111,关闭cachemmu等
????mcr p15,0,r0,c1,c0,0
????mov pc, lr
?
#define lGPMCON 0x7F008820
#define lGPMDAT 0x7F008824
light_led:
????ldr r0,=lGPMCON@内部寄存器不能被直接访问
????ldr r1,=0x1111
????str r1,[r0]@设置GPM的末四位为输出引脚
?
????ldr r0,=lGPMDAT
????mov r1,#0x3@往3.4led输出低电平,亮
????str r1,[r0]
????mov pc,lr
?
?
7.点亮led的操作