1. 前言
Tiny4412開發是友善之臂推出的Android、Linux學習開發板,CPU采用三星的EXYNOS4412,32位芯片,屬于Cortex-A系列,主頻是1.5GHZ,可以運行ubuntu、Android5.0、純Linux等操作系統。
這篇文章就介紹利用這款開發板完成裸機開發,不涉及操作系統,直接當做單片機一樣,完成LED燈、蜂鳴器的編程,了解這款芯片與常規的Cortex-M系列芯片編程有何區別。
核心板如圖:
下面是開發板的實物圖:
開發板的配置:
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燈是焊接在核心板上面,原理圖就得打開核心板這份。
(2)查看芯片手冊,了解GPIO口如何配置
配置方法也很好理解,在手冊里做了詳細介紹。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;
?}
復制代碼
(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 <要燒錄的文件>"
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
?
#
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卡,放入開發板運行!!"卡設備>
審核編輯:湯梓紅
-
led
+關注
關注
242文章
23277瀏覽量
660846 -
Linux
+關注
關注
87文章
11304瀏覽量
209483 -
Exynos4412
+關注
關注
1文章
8瀏覽量
12721
發布評論請先 登錄
相關推薦
評論