一步一步摸索在MDK下进行S3C2440的开发
S3C2440开发板上实现按键点亮LED驱动开发的详细过程01

文章记录了作者在S3C2440开发板上实现按键点亮LED驱动开发的详细过程,还记录了一些容易出现的错误,以及怎么解决这些错误。
一、驱动开发流程Linux驱动开发不同于应用程序的开发。
驱动开发是直接和硬件打交道的,通过对硬件的操作给应用程序提供一些接口函数,使得应用程序能够“间接”的控制硬件来工作。
对于按键点亮LED的驱动开发流程如下。
二、驱动开发具体步骤1、查看开发板TQ2440底板原理图,找到按键和LED模块,如下图:图-2 按键和LED电路图从上图我们可以清楚地看到K1~K4对应的管脚是ENT1~ENT4,LED1~LED4对应的管脚是nLED_1~nLED_4.2、查看TQ2440_核心板原理图,找到对应的CPU管脚,如下图:图-3 按键和LED对应CPU管脚电路图3、查看s3c2440芯片手册,查看CPU管脚的模式,如下图从上图我们可以看出按键对应的CPU管脚GPF0~GPF4都是占两位(如:GPF0[1:0])。
按键是一种中断,要想让按键工作在中断模式下,就要设置GPF0~GPF4(GPF3除外)管脚都设置在中断模式下,即为10。
对于LED对应的CPU管脚GPB5~GPB8也是占两位。
要想让LED工作,就要让LED工作在输出模式下,即对应管脚设置为01.4、编写按键点亮LED驱动程序/*调用内核头文件,和应用程序调用的头文件不一样*/#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/delay.h>#include <asm/irq.h>#include <linux/interrupt.h>#include <asm/uaccess.h>#include <asm/arch/regs-gpio.h>#include <asm/hardware.h>#include <linux/device.h>#include <linux/poll.h>#define DEVICE_NAME "tope-buttons" //自定义驱动称为“tope-buttons”。
S3C2440开发平台基本操作

BIOS在下載完成時,會確認是否執行下載的程式,利用此 功能來引導LINUX和Windows CE及使用者自己編譯的應 用程式。
設定BIOS配置參數
圖6.9 BIOS配置畫面
❖執行功能[7],則會出現如圖6.9所示的15個配置選項。
圖6.10 下載執行位置設定
➢“USB host is connected. Waiting a download.”說明 USB驅動程式已正確啟動了, 可透過USB介面下載了。
Байду номын сангаас.1 2440開發平台的配置與連接
❖ 開始執行後續相關的實驗,因此需對S3C2440開發 平台做初步的測試與應用,以驗證本平台的相關資 源。
❖ 在實驗板中已燒錄的作業系統
Windows CE Linux 統一燒錄在NAND Flash裡面。
實驗板相關跳線設定
❖ 啟動模式的選擇,是透過J21(OM0)跳線來決定的。
DNW設定後狀態圖
圖6.2 DNW狀態列顯示圖
❖ 配置好時,在ToolBar中
選擇Serial Port->Connect,若是設定正確,在視 窗的標題列,可看到上圖顯示的狀態訊 息”COM1,115200bps”
若使用USB轉RS-232纜線的話,必須修改COM Port編號,因為虛擬的COM埠可能超過COM4編 號。
使用USB纜線將S3C2440開發平台(B型接頭)與PC主 機相連。
12V電源連接到開發平台上。
有液晶螢幕的話,可連接上液晶螢幕和觸控螢幕(J25和 JP26)。
喇叭輸入連接到J2音效輸出接頭(藍色插座)。
PC主機終端機的配置方式
RealviewMDK4.0进行2440开发快速入门

Realview MDK4.0 进行2440开发快速入门----苑臣芒(光芒)RealView MDK在中国推出已经有一段时间了,而且作为未来发展的趋势必将取代ADS1.2,成为工程师广泛应用的开发平台。
但是好多工程师还习惯于用ads环境来调试,编译,我以前也是,但毕竟ads软件已经没有技术支持了,这势必会在以后对开发工作有一定影响,ARM将Keil公司收购之后,正式推出了针对ARM微控制器的开发工具RealView Microcontroller Development Kit (简称RealView MDK 或者MDK),它将ARM开发工具RealView Development Suite(简称RVDS)的编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM微控制器开发工具。
所以将ads工程转成rvmdk工程势必会成为开发道路上的难题。
第一步:分析一下ads工程及环境。
这是我的工程文件,看一下ads的设置,首先是target setting选项,选择arm from elf接下来编译器选项总平台都选择arm920t,其余不需要修改。
如图其余几个编译器(c,c++)也相应都设置为arm920t,其他地方不需要动。
接下来就是关键的link选项了,最关键的是ro,这个是程序运行地址,也就是在ram的哪个地址运行,tq2440和mini2440都可以设置为0x30000000,也可以比这个数值稍微大些,看实际需要吧,我们设置为0x30000000.在option标签页中添加程序入口点,这个入口点就是主程序运行的第一条指令的地方,在2440init.s中可以找到是entry,所以这里填写“__ENTRY”接下来看lay out选项卡,设置如下:到这里,设置基本完工了,但还不能生成文件,在arm fromELF中我们选择plain binary,接可以生成与工程名字同名的bin文件了。
S3C2440之中断操作(MDK4.22)

S3C2440之中断操作(MDK4.22)
背景知识:2440 中断控制器接收60 个中断源。
中断被分为多种类别,此处为32 类别,正好用32 位。
图上可以很好的表示整个中断的流程。
有些中断源对应一个中断类别,比如
串口中断发送,接收最后都对应到串口中断。
submask 屏蔽子类别,未屏蔽的会引起srcpnd 相应位置位,如果mask 未屏蔽的话,就会紧接着判断优先级,最后导致intpnd 置位,然后产生了IRQ,而FIQ 不需要优先级判断,会直接产生,由intmod 设置。
注意的是:进入ISR 后,清除中断的顺序很重要,首先是srcpnd 接着是intpnd,如果还需要清除eintpnd 的话,要最先清除。
实验过程:
编译工具--MDK4.22
硬件图
首先需要配置GPF0/1/2/4 的脚为EINT0/1/2/4。
由于用到了外部4-7 中断,需要开启EINTMASK 寄存器相应位。
设置优先
级寄存器,设置INTMSK 寄存器。
在2440A.s 中已经设置了I F 位开启,可以接收中断了。
在中断初始化代码里,需要将中断函数的地址安装到中断向量表中。
程序如下:
MDK4.22 的启动代码设置
配置了堆,栈,以及中断向量表的地址为0x33ffff20 处。
配置了B 口和F 口,B 口试LED 的灯显示,F 口是连接按键的外部中断。
按一个键会亮一个LED。
int.c 代码。
S3C2440移植uboot过程全解+移植记录

一、Uboot移植前的准备1、修改makefile、配置文件在配置文件之前,需要修改makeflie相关内容:修改如下:(1)修改编译器,这里我们的makefile已经设置为arm-linux-无需再修改,如下所示:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-Endif(2)添加fl2440的配置项,如下所示:fl2440_config:unconfig@$(MKCONFIG) $(@:_config=) arm arm920t fl2440 step s3c24x0注意:在添加的fl2440_config的第二行,必须以Table开头,不能有任何多余的符号,否则极易导致编译错误。
Uboot支持多种处理器和平台,在编译uboot之前需要对其进行配置,使其支持我们自己的开发平台。
在执行编译make之前,需要进行配置即make fl2440_config。
通过查看顶层目录的makeflie文件,通过以下语句:MKCONFIG := $(SRCTREE)/mkconfig得出实际执行的命令为:./mkconfig fl2440 arm arm920t fl2440 step s3c24x0执行完这句后,产生如下结果:(1)开发板名称为fl2440;(2)将include中的头文件连接到同平台相关的头文件中,这里的连接为:asm->asm-armarch->arch-s3c24x0proc->proc-armv(3)创建顶层Makefile包含的文件inclued/config.mk,该文件内容如下ARCH = armCPU = arm920tBOARD = fl2440VENDOR = stepSOC = s3c24x0(4)创建开发板相关头文件include/config.h,该文件中包含了对开发板的相关配置,如下所示:#include <configs/fl2440.h>从上面可以知道,在将uboot配置为适合自己的平台的时候,需要在路径/include/configs下添加配置头文件fl2440.h。
keil下的s3c2440启动代码分析

由于片面问题,所以可能会看起来不太美观,可以看附件中的内容。
ARM启动代码相当于我们电脑的BIOS,也就是ARM启动时对处理器的一些初始化及嵌入式系统硬件的一些初始化。
由于它直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。
一般包括:中断向量表,初始化存储器系统,初始化堆栈,初始化有特殊要求的断口,设备初始化,变量初始化等。
这几天对着RealView MDK-ARM中自带的启动代码研究了一下,遇到问题又对着数据手册和指令表看了一下,总算对S3C2440A的硬件有了一个大致的了解。
学习嵌入式系统重在系统,学习ARM只是为学习嵌入式系统铺路,懒猫比较笨可能在上系统之前要裸奔几天以强化以下对S3C2440A内部结构的了解。
把MDK自带的S3C2440A.S文件的注释发一下,这些是懒猫结合数据手册与ARM指令表理解了,可能会有错误,放在这里只是引导一下像我一样还没有入门的兄弟们,希望你们不要害怕ARM害怕嵌入式,老毛他老人家说的对,世上无难事,只怕有心人,ARM指令就那么多,看一遍不会就多看几遍,还有一定要学习看软件自带的帮助文件.;/*****************************************************************************/;/* S3C2440.S: Startup file for Samsung S3C440 */;/*****************************************************************************/;/* <<< Use Configuration Wizard in Context Menu >>> */ ;/*****************************************************************************/;/* This file is part of the uVision/ARM development tools. */ ;/* Copyright (c) 2005-2008 Keil Software. All rights reserved. */ ;/* This software may only be used under the terms of a valid, current, */;/* end user licence from KEIL for a compatible version of KEIL softwar e */;/* development tools. Nothing else gives you the right to use this softwa re. */;/*****************************************************************************/;下面这些参数是与CPSR状态寄存器有关;参数的由来:这里各个模式的参数是由寄存器CPSR的模式位设置M[4:0]得来的,;比如这里的用户模式,CPSR的M[4:0]设置为10000就是0x10。
S3C2440裸机LCD及触摸屏应用开发

22科技资讯 SC I EN C E & TE C HN O LO G Y I NF O R MA T IO N 信 息 技 术随着各种控制系统监控界面要求的提高,触摸屏和彩色LC D屏的应用越来越受到用户的欢迎。
本文以配有3.5寸触摸屏和彩色LCD屏的32位计算机S3C2440为硬件平台,以“风帆旋转角度控制系统”的具体案例开发为背景,详细介绍在S3C2440裸机上开发LC D及触摸屏应用的方法和具体过程,经实践证明按本方法可快速开发L C D 及触摸屏监控界面且可靠性好。
1 LCD 显示函数库开发一般S3C2440开发板配套开发资料包含PutPixel(U32x,U32y,U32c)单象素显示函数,可在此基础上开发LC D显示函数库graph.h,以便用显示接口函数开发各种应用程序。
L CD 显示函数库如表1所示,各L C D 显示接口函数在本文案例应用的方法作如下简介。
以画直线、画矩形、画填充矩形和画填充圆函数为基础,编写风帆绘制风帆状态绘制函数和实时曲线绘制,利用Glib_Sail ( )在LCD屏上显示风帆当前状态图,利用Act_Curve( )绘制风帆角度实时曲线;把0~9数码和小数点制作成12×16的位图,并用BM P图片转换软件转化成数据,建立数码库sm_1216.h,以便数值显示函数显示数值;由于建立文字库工作量大,且要显示的中文字符较少,所以把连在一起要显示的文字和按钮都做成位图,并转化建立文字图片库zf_6522.h和按钮图片库anniu_7034.h,以便图片显示函数显示文字和触摸按钮。
2 触摸屏应用函数库开发一般S3C2440开发板配套开发资料中包含触摸屏触摸中断服务函数,该函数获取当前触摸点的坐标(xdata,ydata),可在此基础上开发触摸屏应用函数库Touchpanel.h,以方便开发各种应用程序。
本文应用触摸屏需完成任务有:通过触摸完成控制系统参数设定(风帆设定角度),还需通过触摸启动或停止按钮完成控制系统的启停状态的转换。
KEIL MDK 4.13 + J-Link V7 调试S3C2440的工程配置

新建工程,选择Samsung的S3C2440A:
点击“OK”,出现下面的对话框: 点击“是”,添加KEIL自带的STARTUP.s到工程中,进入下一步,管理组件:
FUNC void Init (void) { _WDWORD(0x4A000008, 0xFFFFFFFF); _WDWORD(0x53000000, 0x00000000);
// 禁用所有中断 // 禁用看门狗定时器
// 时钟配置
// FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz
关于J-Link的配置了,注意不要勾选Load Application at Startup,
还要配置Initialization File。 为什么不能勾选Load Application at Startup,勾选的后果怎样。
2 01 0-1 2 -08 09 :24
回复
网球恋人 回复chinleo:真郁闷,空间不会玩啊,留言都没提示 2 01 0-1 2 -06 2 0:49
星心乱舞——迷乱的世界
暗星不发光了,可那么多暗星,是怎么被发现的?
KEIL MDK 4.13 + J-Link V7 调试S3C2440的工程配置
2 01 0-1 2 -05 1 1 :2 7
前两天说把友善之臂的自带的那个并口调试器转接成了J-Link的,昨晚开始尝试写点小代码,结果发现对S3C2440这个片子 的配置,还要动点脑筋。不过这个脑筋我也没动,直接搜索了些东西,抄袭了些东西。说实话,网上有一点点参考资料,但
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1步:在MDK下建立一个最简单的基本S3C2440的点亮LED工程,启动代码采用MDK自带的。
编写代码控制TQ2400板子上的一个LED灯闪烁,结合TQ2440底板可找到LED连接在GPB5~GPB8。
具体代码如下:#include <S3C2440.h>#define LED1 (1<<5)#define LED2 (1<<6)#define LED3 (1<<7)#define LED4 (1<<8)void Delay(void){int i,j;for(i=0; i<1000; i++){for(j=0; j<1000; j++);}}int main(){GPBCON = 0x15555;while(1){GPBDAT &= ~LED1; //LED1闪一下Delay();GPBDAT |= LED1;Delay();GPBDAT &= ~LED2; //LED2闪一下Delay();GPBDAT |= LED2;Delay();GPBDAT &= ~LED3; //LED3闪一下Delay();GPBDAT |= LED3;Delay();GPBDAT &= ~LED4; //LED4闪一下Delay();GPBDAT |= LED4;Delay();}}第2步:对工程进行初步的配置。
为避免工程文件目录中文件比较乱,要对工程的输出文件和连接文件各单独建立一个文件夹,让它们在各自文件夹内。
点击“Select Folder For Objects”,新建一个名为out的文件夹,然后双击打开并点击OK,这样所有的输出文件就会放在这个文件夹内。
编译一下,出现如下错误:示:而2440并没有内部RAM,只有外接的SDRAM。
先将内部RAM选项去掉。
TQ2440的程序运行是在外接的SDRAM中的,SDRAM的开始地址是0x30000000,仿真的时候代码都是在SDRAM中运行的,那我们就先将代码地址和内存地址都配置为外部的,如下图所示:其中ROM1和RAM1的空间大小都是随便填写的,当然总的大小不能超过实际使用的SDRAM的大小。
然后再点击工程配置窗口中的Linker选项,勾选User Memory Layout from Target Dialog 选项(即选择使用上面的目标选项对话框中的存储空间分配方式)配置如下图:编译后的编译信息如下:编译顺利通过。
第3步:使用Jlink接上TQ2440开发板进行仿真调试一下。
打开工程配置对话框选择Debug选项进行配置,选择使用J-LINK/J-TRACE仿真选项,然后点击Setting按键,JTAG Speed配置为自动。
配置如下:然后还要在Initialization File:选项下添加一个初始化文件Ext_RAM.ini,不然是没法进行仿真的。
这个文件可在MDK安装目录中的例子中找到:我电脑上的路径是C:/Keil/ARM/Boards/Samsung/S3C2440/RTX_Blinky/Ext_RAM.ini 文件内容如下:/************************************************************************** ****//* Ext_RAM.INI: External RAM (SDRAM) Initialization File */ /************************************************************************** ****/// <<< Use Configuration Wizard in Context Menu >>> // /************************************************************************** ****//* This file is part of the uVision/ARM development tools. *//* Copyright (c) 2005-2008 Keil Software. All rights reserved. *//* This software may only be used under the terms of a valid, current, *//* end user licence from KEIL for a compatible version of KEIL software *//* development tools. Nothing else gives you the right to use this software. *//************************************************************************** ****/FUNC void SetupForStart (void) {// <o> Program Entry PointPC = 0x30000000;}FUNC void Init (void) {_WDWORD(0x4A000008, 0xFFFFFFFF); // Disable All Interrupts_WDWORD(0x53000000, 0x00000000); // Disable Watchdog Timer// Clock Setup// FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz_WDWORD(0x4C000000, 0x0FFF0FFF); // LOCKTIME_WDWORD(0x4C000014, 0x0000000F); // CLKDIVN_WDWORD(0x4C000004, 0x00043011); // MPLLCON_WDWORD(0x4C000008, 0x00038021); // UPLLCON_WDWORD(0x4C00000C, 0x001FFFF0); // CLKCON// Memory Controller Setup for SDRAM _WDWORD(0x48000000, 0x22000000); // BWSCON_WDWORD(0x4800001C, 0x00018005); // BANKCON6_WDWORD(0x48000020, 0x00018005); // BANKCON7_WDWORD(0x48000024, 0x008404F3); // REFRESH_WDWORD(0x48000028, 0x00000032); // BANKSIZE_WDWORD(0x4800002C, 0x00000020); // MRSRB6_WDWORD(0x48000030, 0x00000020); // MRSRB7_WDWORD(0x56000000, 0x000003FF); // GPACON: Enable Address lines for SDRAM}// Reset chip with watchdog, because nRST line is routed on hardware in a way// that it can not be pulled low with ULINK_WDWORD(0x40000000, 0xEAFFFFFE); // Load RAM addr 0 with branch to itselfCPSR = 0x000000D3; // Disable interruptsPC = 0x40000000; // Position PC to start of RAM_WDWORD(0x53000000, 0x00000021); // Enable Watchdogg, 0 // Wait for Watchdog to reset chipInit(); // Initialize memoryLOAD Obj\Blinky.axf INCREMENTAL // Download programSetupForStart(); // Setup for Runningg, main // Goto Main将此文件复制到所建的工程下面,然后修改下面这句代码,将Blinky.axf替换为自己工程下生成的调试文件名称即可。
LOAD Obj\Blinky.axf INCREMENTAL // Download program例如我所建工程生成的调试文件是在out文件夹内的LED2.axf,则将此句修改为LOAD out/LED2.axf INCERMENTAL即可,如果调试文件在所建工程根文件夹内则修不需要再加out/路径,直接改为LOAD LED2.axf INCERMENTAL即可。
然后再点击Utilities选项,Use Target Driver for Flash Programming选项选择J-LINK/J-TRACE选项,并且不勾选后面的Update Target before Debugging选项,如下图所示:设置完成之后,点击Debug按钮即可进入调试界面以上这些步骤只是做到简单的使用JLINK进行仿真,即代码在SDRAM中运行,还不能烧写到NANDFLASH中运行。
接下来继续摸索如果将代码下载到NandFlash中运行的方法,呵呵。