Home » 插件 » Arm 裸机开发 LED

Arm 裸机开发 LED

编 辑:Y ┊ 时 间:2022年03月05日 ┊ 访问: 20 次

逻辑开发步骤

83460-3h1ep89krhz.png

  1. 看电路图
  2. 看芯片手册
  3. 编程

点灯

电路图:
fs4412-dev-v0.pdf
TOPEET_coreboard4412_scp.pdf
SEC_Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary.pdf

找到led
21254-ixwa2zrdgag.png

Tip 如果没有模拟电路数字电路基础可以去补充一下

我们的灯叫发光二极管

默认二极管是不导通的,想要发光必须在引脚输出高电平

  • CHG_COK
  • CHG_FLT
  • XvVSYNC_LDI
  • XvSYS_OE

加三极管的作用

导通后发光二极管就能接地了,就可以亮了。
如果电阻是1K 3.3V / 1K = 3.3毫安左右
一个是3.3一百个有可能会把cpu烧掉
电流越大,发热越厉害,所以一般情况下不直接接设备
都会中间加一个三极管,三极管的作用为了实现弱电流控制大电流
1、3脚基极 ,2、3脚发射极
基极可以获得比较小的电流,小的电流导通,会控制2、3脚导通

看图

先搜索有没有特殊的链接
04495-lkcoymoweog.png

没有的话我们继续找核心板电路图
96193-ilr4kaq4oq.png

由于cpu引脚太多,所以需要两个电路图比较

要想让灯点亮,就需要输出一个高电平

芯片手册

接下来需要查询芯片手册
SEC_Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary.pdf
描述CPU如何工作的
46484-cz5458jgrz7.png

Arm开发的难点就在芯片手册

看目录

介绍设备
42292-tyjy3z15z2o.png

地址映射
77334-26rota35zfm.png

看门狗
08801-naq6l179sx.png

实时时钟
42087-cbvswqvy0gm.png

音频子系统
30398-6bq28xfy2p8.png

第一次接触首先看产品介绍
70373-b4dw15yrdo8.png

这个cpu在音视频和手机方面比较擅长
看文字比较枯燥,可以直接看框图
74206-uoppb84350f.png

电灯

芯片手册控制管脚的部分
62784-oe0qcy6ti2d.png

GPIO 通用输入输出设备控制
01417-7ct76ip1dit.png

有304个管脚,手册将他们分组
02637-xsd5ijm33fp.png

我们这次灯的管脚,寻找一下寄存器
13149-o9926qr0ma.png

寻找我们的 GPX2_7
81706-9rt4kz6yc2d.png

99493-dju4mv410v.png

GPX2通过四个寄存器管理(特殊功能寄存器)
15444-em6bhig5nh.png

cpu内部有很多内容
通过不同的组和地址规划
14462-dn6zd8fz3aw.png

49906-8ojb9vewa92.png

我们主要看CON和DAT
寻找一下寄存器详细描述
20340-vk0wztzpbk.png

base address 是一个基地址
基地址+偏移量操作
24311-z5zcjx5x56.png

我们注意看CON后面的数字
这些GPX2有七个管脚
40492-lzqf2779vot.png

刚好对应我们的手册,所以我们控制这个
97893-7xa2oyde4gu.png

控制七号引脚
这里引脚复用的概念
对应不同寄存器,对应功能设置不同值
15911-nk6immnrj8.png

这里我们输出一个高电平来点亮
6.2.3.202 GPX2CON
 Base Address: 0x1100_0000
 Address = Base Address + 0x0C40, Reset Value = 0x0000_0000

0x0 = Input
0x1 = Output
0x2 = Reserved
0x3 = KP_ROW[7]
0x4 = Reserved
0x5 = ALV_DBG[19]
0x6 to 0xE = Reserved
0xF = WAKEUP_INT2[7]

输出高电平低电平,我们需要另外一个寄存器来表示 GPX2DAT
81882-jzw50u4mfxr.png

0-7对应八个引脚,我们这次输出高电平,把七号位设为1就可以
6.2.3.203 GPX2DAT
 Base Address: 0x1100_0000
 Address = Base Address + 0x0C44, Reset Value = 0x00

如果引脚设为1就是高电平

设置

我们首先设置为输出模式
Output

如果我们直接进行赋值

 @设置led灯的配置寄存器 GPX2CON为输出
    ldr r0, =0x11000C40   
    mov r1, #0x10000000
    str r1, [r0]

会导致改变其他参数,这不是我们想要的
如果这样会导致别人一使用我们的程序,可能其他程序就会出问题

汇编代码:

.text
    @设置led灯的配置寄存器 GPX2CON为输出
    ldr r0, =0x11000C40   
    ldr r1, [r0] @先读
    bic r1, #0xf0000000 @清零
    orr r1, #0x10000000 
    @现在将它写回去
    str r1, [r0]
    
    @只改变最高的四位,其他位置我们不去影响
    
    @##设置LED输出高电平  GPX2DAT##@
    ldr r0, =0x11000C44
    ldr r1, [r0]
    orr r1, #0x80   @1000 0000
    str r1, [r0]
    
    @这样就将我们的引脚打开并输出高电平
    
.end

Linux下编译

我们的编译要放在Linux里面做
创建一个文件

touch led.s

复制我们上面的代码

编译

Makefile

CROSS = arm-none-linux-gnueabi-
CC=$(CROSS)gcc
LD=$(CROSS)ld
OBJCOPY=$(CROSS)objcopy
    
all : led.s
    $(CC) -g -c -o led.o led.s  
    $(LD) led.o -Ttext 0x40001000 -o led.elf
    $(OBJCOPY)  -O binary -S led.elf led.bin
    $(CROSS)objdump -D led.elf > led.dis
     
clea:
     rm -f *.o *.elf *.bin *.dis

这里不能使用gcc编译,因为我们gcc是x86的
x86只能在x86运行,arm上是不能使用x86上面的编译器的
所以我们需要使用arm交叉工具编译链
gcc-4.6.4.tar.xz
解压

tar -xvf gcc-4.6.4.tar.xz

交叉编译工具链在bin
使用这个编译可以在arm下运行

arm-none-linux-gnueabi-gcc -g -c -o led.o led.s  

我们可以使用makefile

为了方便,把gcc的路径添加到系统里面

export PATH=xxx/gcc-4.6.4/bin:$PATH

这个只是暂时设置,如果需要一直设置,需要在文件中修改

~/.bashrc

28045-xu07tyzeq2.png

接下来看看makefile
OBJCOPY=$(CROSS)objcopy 用于转换格式
-c 停在预处理编译不做链接部分
-Ttext 指定链接地址 如果不设置,则从0开始
-o 输出
$(OBJCOPY) -O binary -S led.elf led.bin 转换成 二进制文件 生成led.bin
$(CROSS)objdump -D led.elf > led.dis 反汇编的操作 反向的得到汇编程序

生成文件:

make

烧写

85480-crh6lu7t65a.png
一个地方编译,一个地方运行:交叉编译

使用串口或者网线就可以进行传输
55749-tclh5lzjvwk.png

我们这次使用串口线,串口接到com2
usb端接电脑

超级终端

07755-pv8wwy8g7ga.png

安装驱动
06239-mxmv42by8gn.png

这样表示驱动安装成功了,并且串口可用
98411-j81adarjqef.png

设置波特率115200,将数据流控制改为无
64362-g7uctnfpvts.png

把文件通过串口线传到板子
板子上预装了一个uboot
所以上电就可以看见信息

写入命令

loadb 40001000

80593-9fqrazsghqu.png

选择传送--->发送文件
协议改为Kermit
选择我们的led.bin
发送
97811-8c1fg99o632.png

成功后,我们go一下

go 0x40001000

灯点亮了
83004-oe59lar0k6.png

如果我们想点灭呢?
我们把orr改成bic指令就可以

.text
    @设置led灯的配置寄存器 GPX2CON为输出
    ldr r0, =0x11000C40   
    ldr r1, [r0] @先读
    bic r1, #0xf0000000 @清零
    orr r1, #0x10000000 
    @现在将它写回去
    str r1, [r0]
    
    @只改变最高的四位,其他位置我们不去影响
    
    @##设置LED输出高电平  GPX2DAT##@
    ldr r0, =0x11000C44
    ldr r1, [r0]
    bic r1, #0x80   @1000 0000
    str r1, [r0]
    
    @这样就将我们的引脚打开并输出低电平
    
.end

闪烁

.text
    @设置led灯的配置寄存器 GPX2CON为输出
    ldr r0, =0x11000C40   
    ldr r1, [r0] @先读
    bic r1, #0xf0000000 @清零
    orr r1, #0x10000000 
    @现在将它写回去
    str r1, [r0]
    
    @只改变最高的四位,其他位置我们不去影响
loop:
    @##设置LED输出高电平  GPX2DAT##@
    ldr r0, =0x11000C44
    ldr r1, [r0]
    orr r1, #0x80   @1000 0000
    str r1, [r0]
    
    bl  delay1s
    
    ldr r0, =0x11000C44
    ldr r1, [r0]
    bic r1, #0x80   @1000 0000
    str r1, [r0]
    
    bl  delay1s
    b loop
    
delay1s:     
     ldr      r4,=0x1ffffff  
delay1s_loop:     
     sub    r4,r4,#1
     cmp   r4,#0              
     bne    delay1s_loop     
     mov   pc,lr


.end

14146-fxruq52l0sn.png




Copyright © 2026 Y 版权所有.网站运行:13年238天21小时26分