关于FS4412的ARM开发环境搭建并点亮LED灯

一、ARM开发环境搭建

我的计算机操作系统: Windows11

1、安装 GCC 编译工具

双击安装yagarto-bu-2.21_gcc-4.6.2-c-c++_nl-1.19.0_gdb-7.3.1_eabi_20111119.exe

2、安装 Yagarto 工具包

双击安装yagarto- - tools- - 20100703- - setup.exe

3、安装FS-JTAG调试软件

双击 setup.exe 安装 FS-JTAG 工具

4、安装JRE

双 击 安 装jre- - 6u7- - windows- - i586- -p p- - s.exe

5、安装FS-JTAG驱动

将 FS-JTAG 通过 USB线与 PC 连接,右键点击“我的电脑”选择“管理”,左侧栏里选择“设备管理”,找到该项设备右键点击选择“更新驱动”,选择“浏览计算机以查询驱动程序软件(R)”。
tip:此安装过程需要进行3次,直到设备管理器中没有感叹号标记或问号未知设备标记

6、安装USB转串口驱动

安装CH340

7、安装MobaXterm远程终端软件

安装MobaXterm

8、建立串口终端会话

选择USB转串口线所接端口COM,然后波特率选择115200,建立新会话,将FS4412板子关闭电源,再将拨码开关SW1调至0110(EMMC启动模式),然后打开板子电源。此时串口终端会话中会显示
Hit any key to stop autoboot:5
并且一直倒计时,在数字变成0之前按下空格(任意键)
tip:以后每次连接仿真前,都需要确定处于此状态,保证不要启动到 Linux ,因为启动到 Linux 后, MMU 功能会打开,导致仿真器无法正常使用

9、Eclipse for ARM使用

下载解压eclipse.exe(32位)文件

二、创建一个工程点亮LED

1、新建一个工程

在一个 C 工程中,必须包含如下必要的文件:
├─工程名称
│ ├─common //存放华清远见 FS_4412 通用库,已囊括本开发板所有硬件资源
│ │ ├─include
│ │ ├─src
│ ├─start //存放汇编工程原代码
│ │ ├─start.S
│ ├─main.c //C 工程源码
│ ├─Exynos4412.init //存放仿真用初始化文件
│ ├─map.lds //链接脚本文件
│ ├─Makefile //用来定义整个工程的编译规则
tip:在 C 实验过程中,common 文件夹、start 文件夹、Makefile 文件、map.lds 文件、Exynos4412.init 文件是通用的,我们可以直接拷贝已有 C 工程中的这些文件或者自行对这些文件进行修改编写

进入主界面后,选择“File→New→C Project”命令,Eclipse 将打开一个标准对话框,输入希望新建
工程的名字并单击“Finish”按钮即可创建一个新的工程.
创建完成后,会在工程工作界面里有你创建的工程名,接下来添加工程必要文件。

(1) 添加common 文件夹

拷贝 common 文件夹(华清远见 FS_4412 通用库)到 eclipse 工作目录下。如D:\eclipse_projects\FS4412 目录,复制 common 文件夹,进入 Eclipse 界面,右键点击我们新建的c 工程,选择 Paste。

(2) 新建一个 MakeFile 文件

选择“File→New→Other”命令,在弹出的对话框 New 中的“General”下单击 File,然后单击 Next;
然后选择所要指定的工程后,在文件名文本框中输入文件名 MakeFile,单击“Finish”按钮。

(3) 新建一个Exynos4412.init脚本文件

选择“File→New→Other”命令,在弹出的对话框中的 General 下单击 file,然后单击 next;然后选择
所要指定的工程后,在文件名文本框中输入文件名 Exynos4412.init,单击“Finish”按钮。

(4)新建一个map.lds连接脚本文件

选择“File→New→Other”命令,在弹出的对话框中的 General 下单击 file ,然后单击 next;然后选择所要指定的工程后,在文件名文本框中输入文件名 map.lds,单击“Finish”按钮。

(5)新建一个start汇编源文件

首先在工程目录下创建 start 文件夹,“File→New→Other”命令,在弹出的对话框中的 General 下单击Folder ,然后单击 next;然后选择所要指定的工程后,在文件名文本框中输入文件夹名 start,单击“Finish”按钮。
创建好 start 文件夹之后选择“File→New→Other”命令,在弹出的对话框中的 General 下点击 File ,单击 next;然后选择所要指定的工程文件(这里选择刚创建的 start 文件),在文件名文本框中输入文件名start.S(注 start 扩展名.S 为大写),单击“Finish”按钮。

(6) 新建一个 main 文件

选择“File→New→Other”命令,在弹出的对话框中的 General 下单击 file ,然后单击 next;然后选择所要指定的工程后,在文件名文本框中输入文件名 main.c,单击“Finish”按钮。

2、添加代码

至此工程及所需文件已经基本创建完成,为了能够实现工程的相关功能,我们必须在对应的文件中添
加相应的代码。

(1) 在汇编源文件(start/start.S)中输入汇编代码:
.text
.global _start
_start:
		b		reset
		ldr		pc,_undefined_instruction
		ldr		pc,_software_interrupt
		ldr		pc,_prefetch_abort
		ldr		pc,_data_abort
		ldr		pc,_not_used
		ldr		pc,_irq
		ldr		pc,_fiq

_undefined_instruction: .word  _undefined_instruction
_software_interrupt:	.word  _software_interrupt
_prefetch_abort:		.word  _prefetch_abort
_data_abort:			.word  _data_abort
_not_used:				.word  _not_used
_irq:					.word  irq_handler
_fiq:					.word  _fiq


reset:

	ldr	r0,=0x40008000
	mcr	p15,0,r0,c12,c0,0		@ Vector Base Address Register

		mrs  	r0,cpsr
		bic		r0,r0,#0x1f
		orr		r0,r0,#0xd3
		msr		cpsr,r0         @ Enable svc mode of cpu

    	mov	r0, #0xfffffff
      	mcr	p15, 0, r0, c1, c0, 2  	@ Defines access permissions for each coprocessor
									@ Privileged and User mode access

	/*
	 * Invalidate L1 I/D
	 */
	mov	r0, #0			@ set up for MCR
	mcr	p15, 0, r0, c8, c7, 0	@ invalidate TLBs
	mcr	p15, 0, r0, c7, c5, 0	@ invalidate icache


	@Set the FPEXC EN bit to enable the FPU:
	MOV r3, #0x40000000
	fmxr FPEXC, r3

	/*
	 * disable MMU stuff and caches
	 */
	mrc	p15, 0, r0, c1, c0, 0
	bic	r0, r0, #0x00002000	@ clear bits 13 (--V-)
	bic	r0, r0, #0x00000007	@ clear bits 2:0 (-CAM)
	orr	r0, r0, #0x00001000	@ set bit 12 (---I) Icache
	orr	r0, r0, #0x00000002	@ set bit 1  (--A-) Align
	orr	r0, r0, #0x00000800	@ set bit 11 (Z---) BTB
	mcr	p15, 0, r0, c1, c0, 0

/* LED Test Code */

	ldr r0, =0x114001E0
	ldr r1, [r0]
	bic r1, r1, #0xf0000
	orr r1, r1, #0x10000
	str r1, [r0]

	ldr r0, =0x114001E8
	ldr r1, [r0]
	bic r1, r1, #0x300
	str r1, [r0]

	ldr r0, =0x114001E4
	ldr r1, [r0]
	orr r1, r1, #0x10
	str r1, [r0]

init_stack:
		ldr		r0,stacktop         /*get stack top pointer*/

	/********svc mode stack********/
		mov		sp,r0
		sub		r0,#128*4          /*512 byte  for irq mode of stack*/
	/****irq mode stack**/
		msr		cpsr,#0xd2
		mov		sp,r0
		sub		r0,#128*4          /*512 byte  for irq mode of stack*/
	/***fiq mode stack***/
		msr 	cpsr,#0xd1
		mov		sp,r0
		sub		r0,#0
	/***abort mode stack***/
		msr		cpsr,#0xd7
		mov		sp,r0
		sub		r0,#0
	/***undefine mode stack***/
		msr		cpsr,#0xdb
		mov		sp,r0
		sub		r0,#0
   /*** sys mode and usr mode stack ***/
		msr		cpsr,#0x10
		mov		sp,r0             /*1024 byte  for user mode of stack*/

		b		main

	.align	4

	/****  swi_interrupt handler  ****/


	/****  irq_handler  ****/
irq_handler:

	sub  lr,lr,#4
	stmfd sp!,{r0-r12,lr}
//	bl	do_irq
	ldmfd sp!,{r0-r12,pc}^

stacktop:    .word 		stack+4*512
.data

stack:	 .space  4*512


(2) 在 map.lds 中输入如下信息

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
	. = 0x40008000;
	. = ALIGN(4);
	.text      :
	{
		start/start.o(.text)
		*(.text)
	}
	. = ALIGN(4);
    .rodata : 
	{ *(.rodata) }
    . = ALIGN(4);
    .data : 
	{ *(.data) }
    . = ALIGN(4);
    .bss :
     { *(.bss) }
}

(3) 编写 MakeFile 文件编译规则,在 MakeFile 中输入如下信息:
# CORTEX-A9 PERI DRIVER CODE
# VERSION 2.0
# ATHUOR www.dev.hqyj.com
# MODIFY DATE
# 2014.05.28 Makefile
SHELL=C:\Windows\System32\cmd.exe
CROSS_COMPILE = arm-none-eabi-
NAME = led_c
CFLAGS += -g -O0 -mabi=apcs-gnu -mfpu=neon -mfloat-abi=softfp \
-fno-builtin -nostdinc -I ./common/include
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
OBJSss := $(wildcard start/*.S) $(wildcard common/src/*.S) \
	$(wildcard *.S)\
	$(wildcard start/*.c) $(wildcard common/src/*.c) \
	$(wildcard usr/*.c) $(wildcard *.c)
OBJSs := $(patsubst %.S,%.o,$(OBJSss))
OBJS := $(patsubst %.c,%.o,$(OBJSs))
%.o: %.S
	$(CC) $(CFLAGS) -c -o $@ $<
%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<
all:clean $(OBJS)
	$(LD) $(OBJS) -T map.lds -o $(NAME).elf
	$(OBJCOPY) -O binary $(NAME).elf $(NAME).bin
	$(OBJDUMP) -D $(NAME).elf > $(NAME).dis
clean:
	rm -rf $(OBJS) *.elf *.bin *.dis *.o

tip: :MakeFile 每条命令的开头必须以[Tab] 键开头 , 如该文件为拷贝 自 已 有工程, 那么直接 修改 第 行 九行 NAME 即可

(4) 在 Exynos4412.init 文件中输入如下信息:
target remote localhost:3333
monitor halt reset
(5) 在 main.c 文件中输入如下信息:

#include "exynos_4412.h"

void mydelay_ms(int ms)
{
	int i, j;
	while(ms--)
	{
		for (i = 0; i < 5; i++)
			for (j = 0; j < 514; j++);
	}
}
/*-------------------------MAIN FUNCTION------------------------------*/
/**********************************************************************
* @brief Main program body
* @param[in] None
* @return int
**********************************************************************/
int main(void)
{
	/*
	 *Config
	 */
	GPX2.CON = (GPX2.CON & ~(0xf<<28))| 1<<28;//GPX2_7:output, LED2
	GPX1.CON = (GPX1.CON & ~(0xf)) | 1; //GPX1_0:output, LED3
	GPF3.CON = (GPX3.CON & ~(0xf<<16 | 0xf<<20)) | (1<<16 | 1<<20);
	//GPF3_4:output, LED4 GPF3_5:output, LED5

	while(1)
	{
		//Turn on LED2
		GPX2.DAT |= 0x1 << 7;
		mydelay_ms(500);
		//Turn on LED3
		GPX1.DAT |= 0x1;
		//Turn off LED2
		GPX2.DAT &= ~(0x1<<7);
		mydelay_ms(500);
		//Turn on LED5
		GPF3.DAT |= (0x1 << 5);
		//Turn off LED3
		GPX1.DAT &= ~0x1;
		mydelay_ms(500);
		//Turn on LED4
		GPF3.DAT |= (0x1 << 4);
		//Turn off LED5
		GPF3.DAT &= ~(0x1 << 5);
		mydelay_ms(500);
		//Turn off LED4
		GPF3.DAT &= ~(0x1 << 4);
	}
	return 0;
}
(6)所有文件编辑完成后,保存文件
3、调试工程
(1)编译

点击编译图标

(2)配置调试工具

①选中“Run” “Debug Configuras…”
②在“Zylin Embedded debug (Native)”选项上右击鼠标,在点击“New”选项
③点击“Main”选项栏中红色框内的“Browse”选项选择将要执行的程序,调试的程序格式为 xx.elf的文件。找到 LED_GPIO 工程对应的目录,选中目录中的 led_gpio.elf 文件,然后选择“打开”
④在 Debugger 选项卡中的 Main 子选项卡中的 GDB debugger 的框中单击“Browse”按钮选择前面安装的 arm-none-eabi-gdb.exe(这里选择自己安装 gcc 编译工具的安装目录C:\ProgramFiles\yagarto\bin,在GDB Command file 中选择自己工程目录下的 Exynos4412.init 文件
⑤在 Command 选项中,在“Initialize’ commands”中添加 3 行命令

load
break main
c

⑥添加完后点击如下图所示的“ Apply”,调试选项配置完成。再点击“ Debug”选项进入就可以进
行调试了
⑦进入调试界面后,点击全速运行 的调试按钮,如果开发板上 led 灯开始闪烁,则表示整个开发
环境搭建成功。

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后天必早起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值