(exynos4412)Tiny4412裸机开发-点亮LED灯

举报
DS小龙哥 发表于 2022/01/24 14:55:36 2022/01/24
【摘要】 Tiny4412开发是友善之臂推出的Android、Linux学习开发板,CPU采用三星的EXYNOS4412,32位芯片,属于Cortex-A系列,主频是1.5GHZ,可以运行ubuntu、Android5.0、纯Linux等操作系统。 这篇文章就介绍利用这款开发板完成裸机开发,不涉及操作系统,直接当做单片机一样,完成LED灯、蜂鸣器的编程,了解这款芯片与常规的Cortex-M系列芯片编程有何

1. 前言

Tiny4412开发是友善之臂推出的Android、Linux学习开发板,CPU采用三星的EXYNOS4412,32位芯片,属于Cortex-A系列,主频是1.5GHZ,可以运行ubuntu、Android5.0、纯Linux等操作系统。

这篇文章就介绍利用这款开发板完成裸机开发,不涉及操作系统,直接当做单片机一样,完成LED灯、蜂鸣器的编程,了解这款芯片与常规的Cortex-M系列芯片编程有何区别。

核心板如图:

image-20220124143413952

下面是开发板的实物图:

image-20220124143157723

开发板的配置:

image-20220124143510661

2. 搭建交叉编译环境

进行裸机编程之前,需要先搭建交叉编译环境,安装arm-linux-gcc交叉编译器,交叉编译后的程序才能在开发板上运行。

什么叫交叉编译? PC机编译、在嵌入式开发板运行这种模式就叫交叉编译。

交叉编译器在开发板的光盘里有提供,直接拷贝到PC机Linux下解压,配置环境变量接口。

详细操作步骤如下:

1.	在Linux用户目录下创建一个目录:  mkdir work/arm-linux-gcc -p

2.	将交叉编译器拷贝到Linux系统共享目录。再解压到arm-linux-gcc目录下。
tar xvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz -C /home/wbyq/work/arm-linux-gcc/

3.	添加系统环境变量
 (1). root用户: 需要将代码写在/etc/profile文件中
 (2). 普通用户: 需要将代码写在 用户目录下的.bash_profile文件中
profile文件系统上电的时候会自动执行。
添加环境变量的命令:
export PATH=/home/wbyq/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin:$PATH
参数:
export  导出--全局声明
PATH  系统环境变量的名称. 作用: 保存Linux系统可执行文件的搜索路径.

输出环境变量的值:
[wbyq@wbyq ~]$ echo $PATH
/home/wbyq/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin:/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/wbyq/bin

export LD_LIBRARY_PATH=/mnt/hgfs/linux-share-dir/sum:$LD_LIBRARY_PATH
参数:
LD_LIBRARY_PATH 系统环境变量的名称. 作用: 保存Linux系统动态库的搜索路径. xxx.so

4.	生效环境变量
(1). 立即生效:  当前终端有效
[wbyq@wbyq ~]$ source .bash_profile 
(2). 退出用户、重新登录系统,实现永久生效

5.	测试交叉编译器. 学习基本用法

[wbyq@wbyq linux_2021]$ arm-linux-gcc app.c
[wbyq@wbyq linux_2021]$ ls
a.out  app.c
[wbyq@wbyq linux_2021]$ ./a.out 
bash: ./a.out: cannot execute binary file
[wbyq@wbyq linux_2021]$ gcc app.c -o app1
[wbyq@wbyq linux_2021]$ arm-linux-gcc app.c -o app2
[wbyq@wbyq linux_2021]$ ls
a.out  app1  app2  app.c
[wbyq@wbyq linux_2021]$ file app1 
app1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
[wbyq@wbyq linux_2021]$ file app2
app2: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.27, not stripped

3. 点亮LED灯

如果学习过单片机(51,STM32、MSP430、AVR之类的)编程,完成当前章节的内容应该就很容易。

要完成LED灯的控制,需要完成以下几个步骤:

1. 查看原理图

2. 配置GPIO口  

3. 控制GPIO口输出电平控制LED

4. 编译程序:
xxx.lds 链接文件
设备: 字符设备、块设备、网络设备
SD卡设备: /dev/sdb
查看块大小: cat /sys/block/sdb/size    单位是块(1块512字节)

5. 烧写到开发板测试
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=/dev/sdb seek=1
参数:
if=./E4412_N.bl1.bin  要写到SD卡上的文件
of=/dev/sdb   SD卡设备
seek=1  跳过的块.  一个块==512字节

执行烧写命令:
[wbyq@wbyq sd_fuse]$ sudo ./sd_write.sh /dev/sdb ../main.bin 

(1)查看原理图,查找LED的接线位置

tiny4412开发板是分两层设计的,一个核心板,一个底板,LED灯是焊接在核心板上面,原理图就得打开核心板这份。

image-20220124144707586

image-20220124144724303

(2)查看芯片手册,了解GPIO口如何配置

image-20220124144846728

配置方法也很好理解,在手册里做了详细介绍。LED属于输出控制器件,需要将GPIO口配置成输出模式。

GPIO的模式配置由CON寄存器完成,输出控制由DAT寄存器完成。

image-20220124144957228

(3)编写代码

/* LED的寄存器  GPM4_0 1 2 3*/
#define GPM4CON     (*(volatile unsigned int *)0x110002E0)
#define GPM4DAT     (*(volatile unsigned int *)0x110002E4)

int main(void)
{
	/*配置GPIO口模式--配置LED灯*/
	GPM4CON&=0xFFFF0000;
	GPM4CON|=0x00001111;

	/*3. 配置GPIO口模式--配置按键*/
	GPX3CON&=0xFF0000FF;

    GPM4DAT&=~(1<<0);
    GPM4DAT&=~(1<<1);
	GPM4DAT&=~(1<<2);
    GPM4DAT&=~(1<<3);
    while(1)
    {
        
    }
    return 0;
}

(4)Makefile编写

CC=arm-linux-gcc
main_sp.bin:start.o main.o
	arm-linux-ld -Tmain.lds -o main_sp.elf $^
	arm-linux-objcopy -O binary main_sp.elf main.bin
	arm-linux-objdump -D main_sp.elf > main_sp_elf.dis
%.o : %.S
	$(CC) -o $@ $< -c
%.o : %.c
	$(CC) -o $@ $< -c 
clean:
	rm *.o *.elf *.bin *.dis  -f

(5)代码烧写脚本

#
# Copyright (C) 2011 Samsung Electronics Co., Ltd.
#              http://www.samsung.com/
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#modify by zth
#
####################################

if [ -z $2 ]  #检查传入的第三个参数长度是否为 0
then
    echo "传参数顺序: ./脚本.sh  <SD卡设备>  <要烧录的文件>"
    exit 0
fi

if [ -b $1 ]   #检查第二个参数是否是块设备
then
    echo "$1 SD卡设备正常!"
else
    echo "$1 SD卡设备错误!"
    exit 0   #退出脚本
fi

if [ -e $2 ]   #检查第三个参数(就是要烧录的文件是否存在)
then
    echo "$2 文件存在."
else
    echo "$2 文件不存在."
    exit 0    #退出脚本
fi


BDEV_NAME=`basename $1`   #变量赋值--块设备名称
BDEV_SIZE=`cat /sys/block/${BDEV_NAME}/size`

if [ ${BDEV_SIZE} -le 0 ]; then
	echo "Error: NO media found in card reader."
	exit 1
fi


if [ ${BDEV_SIZE} -gt 32000000 ]; then	echo "Error: Block device size (${BDEV_SIZE}) is too large"
	exit 1
fi


E4412_UBOOT=$2 #将要烧录文件赋值给变量E4412_UBOOT
MKBL2=./mkbl2  #需要当前路径下有一个mkbl2文件


if [ ! -f ${E4412_UBOOT} ]; then  #检测文件是否是普通文件,非目录和设备文件
	echo "$2 文件非普通文件!请检查文件是否正确!"
	exit -1  #退出脚本文件
fi

if [ ! -f ${MKBL2} ]; then       #检测文件是否是普通文件,非目录和设备文件
	echo "当前目录下缺少 mkbl2 文件!"
	exit -1 #退出脚本文件
fi

${MKBL2} ${E4412_UBOOT} bl2.bin 14336    #14K 通过mkbl2文件烧录程序 地址是14336
#./mkbl2 main.bin bl2.bin 14336

####################################
# fusing images

signed_bl1_position=1
bl2_position=17
uboot_position=49
tzsw_position=705

#<BL1 fusing>
echo "---------------------------------------"
echo "BL1 fusing"

#烧录命令 ./xx.sh /dev/sdb main.bin
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=$1 seek=$signed_bl1_position

#<BL2 fusing>
echo "---------------------------------------"
echo "BL2 fusing"
#烧录命令
dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_position

sync


#输出信息
echo "---------------------------------------"
echo "程序烧录成功!"
echo "请拔出SD卡,放入开发板运行!!"
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。