1. 前言
Tiny4412開發(fā)是友善之臂推出的Android、Linux學(xué)習(xí)開發(fā)板,CPU采用三星的EXYNOS4412,32位芯片,屬于Cortex-A系列,主頻是1.5GHZ,可以運(yùn)行ubuntu、Android5.0、純Linux等操作系統(tǒng)。
這篇文章就介紹利用這款開發(fā)板完成裸機(jī)開發(fā),不涉及操作系統(tǒng),直接當(dāng)做單片機(jī)一樣,完成LED燈、蜂鳴器的編程,了解這款芯片與常規(guī)的Cortex-M系列芯片編程有何區(qū)別。
核心板如圖:
下面是開發(fā)板的實(shí)物圖:
開發(fā)板的配置:
2. 搭建交叉編譯環(huán)境
進(jìn)行裸機(jī)編程之前,需要先搭建交叉編譯環(huán)境,安裝arm-linux-gcc交叉編譯器,交叉編譯后的程序才能在開發(fā)板上運(yùn)行。
什么叫交叉編譯? PC機(jī)編譯、在嵌入式開發(fā)板運(yùn)行這種模式就叫交叉編譯。
交叉編譯器在開發(fā)板的光盤里有提供,直接拷貝到PC機(jī)Linux下解壓,配置環(huán)境變量接口。
詳細(xì)操作步驟如下:
1. 在Linux用戶目錄下創(chuàng)建一個(gè)目錄: mkdir work/arm-linux-gcc -p
?
2. 將交叉編譯器拷貝到Linux系統(tǒng)共享目錄。再解壓到arm-linux-gcc目錄下。
tar xvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz -C /home/wbyq/work/arm-linux-gcc/
?
3. 添加系統(tǒng)環(huán)境變量
(1). root用戶: 需要將代碼寫在/etc/profile文件中
(2). 普通用戶: 需要將代碼寫在 用戶目錄下的.bash_profile文件中
profile文件系統(tǒng)上電的時(shí)候會自動執(zhí)行。
添加環(huán)境變量的命令:
export PATH=/home/wbyq/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin:$PATH
參數(shù):
export 導(dǎo)出--全局聲明
PATH 系統(tǒng)環(huán)境變量的名稱. 作用: 保存Linux系統(tǒng)可執(zhí)行文件的搜索路徑.
?
輸出環(huán)境變量的值:
[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
參數(shù):
LD_LIBRARY_PATH 系統(tǒng)環(huán)境變量的名稱. 作用: 保存Linux系統(tǒng)動態(tài)庫的搜索路徑. xxx.so
?
4. 生效環(huán)境變量
(1). 立即生效: 當(dāng)前終端有效
[wbyq@wbyq ~]$ source .bash_profile
(2). 退出用戶、重新登錄系統(tǒng),實(shí)現(xiàn)永久生效
?
5. 測試交叉編譯器. 學(xué)習(xí)基本用法
?
[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
復(fù)制代碼
3. 點(diǎn)亮LED燈
如果學(xué)習(xí)過單片機(jī)(51,STM32、MSP430、AVR之類的)編程,完成當(dāng)前章節(jié)的內(nèi)容應(yīng)該就很容易。
要完成LED燈的控制,需要完成以下幾個(gè)步驟:
1. 查看原理圖
?
2. 配置GPIO口
?
3. 控制GPIO口輸出電平控制LED
?
4. 編譯程序:
xxx.lds 鏈接文件
設(shè)備: 字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備
SD卡設(shè)備: /dev/sdb
查看塊大小: cat /sys/block/sdb/size 單位是塊(1塊512字節(jié))
?
5. 燒寫到開發(fā)板測試
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=/dev/sdb seek=1
參數(shù):
if=./E4412_N.bl1.bin 要寫到SD卡上的文件
of=/dev/sdb SD卡設(shè)備
seek=1 跳過的塊. 一個(gè)塊==512字節(jié)
?
執(zhí)行燒寫命令:
[wbyq@wbyq sd_fuse]$ sudo ./sd_write.sh /dev/sdb ../main.bin
復(fù)制代碼
(1)查看原理圖,查找LED的接線位置
tiny4412開發(fā)板是分兩層設(shè)計(jì)的,一個(gè)核心板,一個(gè)底板,LED燈是焊接在核心板上面,原理圖就得打開核心板這份。
(2)查看芯片手冊,了解GPIO口如何配置
配置方法也很好理解,在手冊里做了詳細(xì)介紹。LED屬于輸出控制器件,需要將GPIO口配置成輸出模式。
GPIO的模式配置由CON寄存器完成,輸出控制由DAT寄存器完成。
(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;
?}
復(fù)制代碼
(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
復(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 ] #檢查傳入的第三個(gè)參數(shù)長度是否為 0
then
echo "傳參數(shù)順序: ./腳本.sh <要燒錄的文件>"
exit 0
fi
?
if [ -b $1 ] #檢查第二個(gè)參數(shù)是否是塊設(shè)備
then
echo "$1 SD卡設(shè)備正常!"
else
echo "$1 SD卡設(shè)備錯(cuò)誤!"
exit 0 #退出腳本
fi
?
if [ -e $2 ] #檢查第三個(gè)參數(shù)(就是要燒錄的文件是否存在)
then
echo "$2 文件存在."
else
echo "$2 文件不存在."
exit 0 #退出腳本
fi
?
?
BDEV_NAME=`basename $1` #變量賦值--塊設(shè)備名稱
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 #需要當(dāng)前路徑下有一個(gè)mkbl2文件
?
?
if [ ! -f ${E4412_UBOOT} ]; then #檢測文件是否是普通文件,非目錄和設(shè)備文件
echo "$2 文件非普通文件!請檢查文件是否正確!"
exit -1 #退出腳本文件
fi
?
if [ ! -f ${MKBL2} ]; then #檢測文件是否是普通文件,非目錄和設(shè)備文件
echo "當(dāng)前目錄下缺少 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
?
#
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
?
#
echo "---------------------------------------"
echo "BL2 fusing"
#燒錄命令
dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_position
?
sync
?
?
#輸出信息
echo "---------------------------------------"
echo "程序燒錄成功!"
echo "請拔出SD卡,放入開發(fā)板運(yùn)行!!"卡設(shè)備>
審核編輯:湯梓紅
-
led
+關(guān)注
關(guān)注
242文章
23153瀏覽量
658615 -
Linux
+關(guān)注
關(guān)注
87文章
11232瀏覽量
208949 -
Exynos4412
+關(guān)注
關(guān)注
1文章
8瀏覽量
12707
發(fā)布評論請先 登錄
相關(guān)推薦
評論