S3C2410/S3C2440学习之GPIO点亮LED(Keil环境c语言与汇编实现)

前言:

Q:为何笔者写这篇文章?

A:笔者本人正在学习ARM开发,浏览了许多的博客分享,发现很多教程都非常的老(尤其是keil环境下的汇编方法非常不适用),入门学习非常吃力,无法进行细致的参考,本文将把笔者的学习成果进行分享,以及提及一些笔者踩过的坑。本文将主要讲解汇编的编写,因为相信大家应该都会使用C语言。


笔者使用开发板:Mini2440


第一步: keil需要安装芯片的软件支持包

S3C2440是ARM9,keil默认貌似是没有的,所以需要从keil官网下载芯片支持
点我去下载(http://www2.keil.com/mdk5/legacy)
安装完后,像一般的项目一样选择芯片创建就行了,我们选s3c2440A。

S3C2410/S3C2440学习之GPIO点亮LED(Keil环境c语言与汇编实现)_第1张图片
S3C2410/S3C2440学习之GPIO点亮LED(Keil环境c语言与汇编实现)_第2张图片



第二步(一): 选择汇编开发语言

我们选汇编,所以项目创建后去除项目内的启动文件S3C2440.s(主要是用于c语言开发的初始化,自己写汇编就是自己初始化)

在这里插入图片描述
打开option–linker,按如下配置留空
S3C2410/S3C2440学习之GPIO点亮LED(Keil环境c语言与汇编实现)_第3张图片
S3C2410/S3C2440学习之GPIO点亮LED(Keil环境c语言与汇编实现)_第4张图片
S3C2410/S3C2440学习之GPIO点亮LED(Keil环境c语言与汇编实现)_第5张图片
然后就是创建一个"*.s"文件,内容可以参考:
S3C2410/S3C2440学习之GPIO点亮LED(Keil环境c语言与汇编实现)_第6张图片


;要注意缩进格式

;---------8字节对齐-----------
	PRESERVE8		;keil下不能缺这句
;-----------------------------

GPBCON		EQU		0x56000010	;GPIOB的端口控制寄存器的地址
GPBDAT		EQU		0x56000014	;往DAT写数据,相当于控制GPIO的状态

	AREA LED,CODE,READONLY		;定义area
		
Init							;定义一个Init标号
	LDR R0,=GPBCON
	LDR R1,=0x00000400			;相当于 1<<( 5<<1 ),表示GPIO5的配置
	STR R1,[R0]
	
LED_ON							;定义一个LED_ON标号
	LDR R0,=GPBDAT
	LDR R1,=0x0010				;GPIOB5
	STR R1,[R0]	

	END							;要有END
	

经过测试,如果按照上述配置正确的话,过程应该是不会出现报错的


第二步(二): 选择C语言开发

我们选C语言,所以保留S3C2440.s(创建项目时会有,没有的话就是你点击了“否”)
和上面的汇编配置相同,唯一不同的就是option选项卡下的Asm选项卡要有如下配置,填入“__EVAL”

S3C2410/S3C2440学习之GPIO点亮LED(Keil环境c语言与汇编实现)_第7张图片
程序编写方面:成功安装芯片支持包后keil会有s3c2440.h的头文件,里面定义了所有的寄存器的地址,想用上面寄存器就查看这个头文件的定义即可,你不喜欢的话自己定义也行。

#include 

可以点我去下载例程,例程有笔者写的“ioSet.h”文件,是简化GPIO操作的宏定义

上代码,这段代码实现GPB5上的LED循环闪烁

#include 
//#include "ioSet.h"

void Delay(int tt)
{
	int a,b;
	for(a=0;a<=tt;a++){
		for(b=0;b<=1200;b++);
	}
}

void GPIO_INIT(void){
	GPBCON = 1<<( 5<<1 );
}

int main(){

	GPIO_INIT();

	while(1){
		GPBDAT |= 1<<5;
		Delay(5);
		GPBDAT &= ~( 1<<5 );
		Delay(5);
	}
	
}

后话:

写这篇文章,主要是自己走了很多弯路,以及网上的大多教程貌似都不是基于keil环境下编写,汇编格式差别非常巨大,而笔者需要用到汇编编写程序,导致学习非常难以进行,网络上也没有一篇像样的keil环境下的适合初学者的ARM汇编例程,所以诞生了这篇文章。

你可能感兴趣的:(C语言,单片机,S3C2440)