前言

有了2440开发板环境搭建、基于韦东山S3C2440开发板搭建arm-linux-gcc交叉编译环境基础,环境已经搭起来了,可以做些逻辑试验了,最经典的是点灯、按键、定时器、中断程序。

那就从点灯开始,我们的重点是linux嵌入式开发,逻辑程序只是热身用的,不要花太多时间。

实验1 汇编点灯

实验内容:点开发板上的LED1。

硬件原理图:

 

S3C2440芯片手册:

配置GPF4为输出模式(GPFCON),设置输出电平为0(GPFDAT).

汇编文件

/** 点亮LED1: gpf4*/.text
.global _start_start:/* 配置GPF4为输出引脚* 把0x100写到地址0x56000050*/ldr r1, =0x56000050ldr r0, =0x100  /* mov r0, #0x100 */str r0, [r1]/* 设置GPF4输出高电平 * 把0写到地址0x56000054*/ldr r1, =0x56000054ldr r0, =0  /* mov r0, #0 */str r0, [r1]/* 死循环 */
halt:b halt
记录:
ldr A, B //A = B
str A, B //B = A

Makefiel文件

all:arm-linux-gcc -c -o led_on.o led_on.Sarm-linux-ld -Ttext 0 led_on.o -o led_on.elfarm-linux-objcopy -O binary -S led_on.elf led_on.binarm-linux-objdump -D led_on.elf > led_on.dis
clean:rm *.bin *.o *.elf

arm-linux-ld -Ttext 0 led_on.o -o led_on.elf设置程序从地址0处存放代码段,递增存放数据段、bss段

arm-linux-objcopy常用于文件格式转换,这里将elf格式文件转化为bin文件。

参考:arm-linux-objcopy; arm-linux-ld命令

实验2 C代码点灯

同实验1.

汇编码:

注意: C代码必须设置堆栈大小(SP)

.text
.global _start_start:/* 设置内存: sp 栈 */ldr sp, =4096  /* nand启动 */
//  ldr sp, =0x40000000+4096  /* nor启动 *//* 调用main */bl mainhalt:b halt

C代码:

int main()
{unsigned int *pGPFCON = (unsigned int *)0x56000050;unsigned int *pGPFDAT = (unsigned int *)0x56000054;/* 配置GPF4为输出引脚 *///*pGPFCON = 0x100;*pGPFCON = 0x400;/* 设置GPF4输出0 */*pGPFDAT = 0;return 0;
}

Makefile脚本

这里比汇编点灯多了一行:将.c转化为.o

all:arm-linux-gcc -c -o led.o led.carm-linux-gcc -c -o start.o start.Sarm-linux-ld -Ttext 0 start.o led.o -o led.elfarm-linux-objcopy -O binary -S led.elf led.binarm-linux-objdump -D led.elf > led.dis
clean:rm *.bin *.o *.elf *.dis

实验3 汇编传参C点灯

实验内容:循环点LED0、LED1,中间延时一段时间。

原理图、S3C3440手册:参考实验1

汇编码:

.text
.global _start_start:/* 设置内存: sp 栈 */ldr sp, =4096  /* nand启动 */
//  ldr sp, =0x40000000+4096  /* nor启动 */mov r0, #4bl led_onldr r0, =100000bl delaymov r0, #5bl led_onhalt:b halt

C代码:

注意: 这里没有main函数,在汇编码中直接跳转到led_on,汇编码中在函数跳转前,将参数保存在r0中.

void delay(volatile int d)
{while (d--);
}int led_on(int which)
{unsigned int *pGPFCON = (unsigned int *)0x56000050;unsigned int *pGPFDAT = (unsigned int *)0x56000054;if (which == 4){/* 配置GPF4为输出引脚 */*pGPFCON = 0x100;}else if (which == 5){/* 配置GPF5为输出引脚 */*pGPFCON = 0x400;}/* 设置GPF4/5输出0 */*pGPFDAT = 0;return 0;
}

Makefile文件:同实验2

实验4 按键控制点灯

实验内容:按键1、2、3控制LED1、2、3亮灭。按键按下,灯亮;按键释放,灯灭。

硬件原理图(按键):

 S3C2440芯片手册:

GPF的前面已经截图了,这里只截图K3用到的GPG寄存器

汇编代码:

这里关闭了看门狗;判断了是从Nand/Nor启动,从而设置堆栈起始地址,可以不用关心。


.text
.global _start_start:/* 关闭看门狗 */ldr r0, =0x53000000ldr r1, =0str r1, [r0]/* 设置内存: sp 栈 *//* 分辨是nor/nand启动* 写0到0地址, 再读出来* 如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动* 否则就是nor启动*/mov r1, #0ldr r0, [r1] /* 读出原来的值备份 */str r1, [r1] /* 0->[0] */ ldr r2, [r1] /* r2=[0] */cmp r1, r2   /* r1==r2? 如果相等表示是NAND启动 */ldr sp, =0x40000000+4096 /* 先假设是nor启动 */moveq sp, #4096  /* nand启动 */streq r0, [r1]   /* 恢复原来的值 */bl mainhalt:b halt

C代码:

#include "s3c2440_soc.h"void delay(volatile int d)
{while (d--);
}int main(void)
{int val1, val2;/* 设置GPFCON让GPF4/5/6配置为输出引脚 */GPFCON &= ~((3<<8) | (3<<10) | (3<<12));GPFCON |=  ((1<<8) | (1<<10) | (1<<12));/* 配置3个按键引脚为输入引脚:* GPF0(S2),GPF2(S3),GPG3(S4)*/GPFCON &= ~((3<<0) | (3<<4));  /* gpf0,2 */GPGCON &= ~((3<<6));  /* gpg3 *//* 循环点亮 */while (1){val1 = GPFDAT;val2 = GPGDAT;if (val1 & (1<<0)) /* s2 --> gpf6 */{/* 松开 */GPFDAT |= (1<<6);}else{/* 按下 */GPFDAT &= ~(1<<6);}if (val1 & (1<<2)) /* s3 --> gpf5 */{/* 松开 */GPFDAT |= (1<<5);}else{/* 按下 */GPFDAT &= ~(1<<5);}if (val2 & (1<<3)) /* s4 --> gpf4 */{/* 松开 */GPFDAT |= (1<<4);}else{/* 按下 */GPFDAT &= ~(1<<4);}}return 0;
}

头文件s3c2440_soc.h:

这里将芯片寄存器封装了一下。

#ifndef  __S3C2440_SOC_H
#define  __S3C2440_SOC_H#define     __REG(x)                    (*(volatile unsigned int *)(x)) /*I/O port*/
#define     GPFCON                   __REG(0x56000050)  //Port F control
#define     GPFDAT                   __REG(0x56000054)  //Port F data
#define     GPFUP                    __REG(0x56000058)  //Pull-up control F
#define     GPGCON                   __REG(0x56000060)  //Port G control
#define     GPGDAT                   __REG(0x56000064)  //Port G data
#define     GPGUP                    __REG(0x56000068)  //Pull-up control G
#define     GPHCON                   __REG(0x56000070)  //Port H control
#define     GPHDAT                   __REG(0x56000074)  //Port H data
#endif

Makefile代码:

all:arm-linux-gcc -c -o key_led.o key_led.carm-linux-gcc -c -o start.o start.Sarm-linux-ld -Ttext 0 start.o key_led.o -o key_led.elfarm-linux-objcopy -O binary -S key_led.elf key_led.binarm-linux-objdump -D key_led.elf > key_led.dis
clean:rm *.bin *.o *.elf *.dis

S3C2440逻辑程序--从点灯开始相关推荐

  1. u-boot移植随笔:u-boot2010.09移植到8MB Nor Flash的S3C2440,第一步搞定(补记)

    这个本来是我发在csdn上的帖子,有一次使用搜索引擎时不小心搜索到.于是再将它放到博客里. 芯片:S3C2440(目前大部分的开发板在某个层次上讲是一样的) Nor Flash:SST39VF6401 ...

  2. u-boot移植随笔:自定义u-boot命令点灯

    u-boot移植随笔:自定义u-boot命令点灯 前几天一不小心在CSDN论坛上发帖散分,同时许诺完成点灯就结账,经过努力,终于可以在u-boot的shell中输入自定义的命令来点灯了.下面简单讲一下 ...

  3. linux下s3c2440开发板,SAMSUNG S3C2440 ARM LINUX 开发板 上手初体验 --开发环境搭建

    1,linux开发环境搭建 2,程序测试 easyOpentag驱动安装,打开连接,选择ARM-linux 1,环境搭建 我的系统版本 root@ubuntu:~# lsb_release -a No ...

  4. 修改S3C2440的时钟工作频率

    文章目录 修改S3C2440的时钟工作频率 时钟概览 S3C2440A的时钟框图 时钟控制逻辑 FCLK HCLK PCLK的频率比 设置MPLL的输出频率 写代码 修改S3C2440的时钟工作频率 ...

  5. S3C2440驱动开发(七)

    Bootloader Bootloader 以其本身的含义来讲就是下载和启动系统,它类似于 PC 中的 BIOS,大部 分芯片厂商所提供的嵌入式系统都提供有这样的程序,而且都比较成熟,大可不必自行编写 ...

  6. S3C2440 SDRAM内存驱动 .

    SDRAM(Synchronous Dynamic Random Access Memory,同步动态随机存储器)也就是通常所说的内存.内存的工作原理.控制时序.及相关控制器的配置方法一直是嵌入式系统 ...

  7. arm-linux交叉编译工具链的制作(基于S3C2440)【转】

    本文转载自:http://eric-gao.iteye.com/blog/2160622 制作arm-linux交叉编译工具链一般通过crosstool工具或者crosstool-NG,前者使用方便, ...

  8. S3C2440的内存情况在NAND FLASH或者NOR FLASH启动的情况下

    1,从NANDFLASH启动时,在ARM上电时,ARM会自动把NANDFLASH前4K的内容拷贝到S3C2440内部SRAM中,同时把SRAM的地址映射到0X00000000.ARM上电后会从SRAM ...

  9. python小游戏代码大全-Python编写的点灯小游戏代码

    Python语言编写的点灯小游戏代码及思路如下: 点灯游戏及其求解的方法, 点灯游戏的游戏规则: (1)有个N行N列的灯板,当你开关其中一盏灯: (2)它和上下左右的灯的状态全部反转,目标是将全部的灯 ...

最新文章

  1. TinyCrayon-iOS-SDK:强大到使人惊讶的 Mask 及切图工具库
  2. 人工智能抢饭碗,你的工作还保得住吗?
  3. 一些在数字化转型的方面的公司和例子
  4. python反向迭代器_Python中对象迭代与反迭代的技巧总结
  5. linux /dev/disk/by-path 修改,Linux磁盘分区
  6. html img设置最底层,在HTML片段中设置img标签的baseUrl
  7. Flutter基础—定位对齐之中心定位
  8. flex自定义preloader预加载进度条
  9. [渝粤教育] 浙江大学 半导体材料 参考 资料
  10. [label][paypal] Paypal 支付页面的语言显示问题
  11. 简单示例用例(Simple Example Use Cases)--hive GettingStarted用例翻译
  12. Linux20180421五周第二次课(4月19日)
  13. 新概念模拟电路_第一册_晶体管_读书笔记
  14. 【BZOJ 1305】[CQOI2009]dance跳舞
  15. jsonobject返回map_如何把JSON对象转为map对象
  16. 中国建设银行宣布:国内第一家无人银行,在上海正式开业!
  17. 更换Eclipse黑色皮肤
  18. kafak学习之分享ppt
  19. 小米手机升级MIUI11后,要记得关闭这4个按钮,不然电池就会不耐用
  20. FY4A-真彩色图 天气雷达瓦片在线服务用法

热门文章

  1. c语言实验报告七大气科学,计算机实验报告
  2. 什么是闭频繁项集 closed patterns ?
  3. 我是技术男,曾创业过,拿过风投 | 程序员有话说
  4. 实用网站推荐(2):壁纸网站WallHeaven
  5. 用python计算ph,用python下载PH上的学习视频
  6. 中国网民数达2.98亿的启示
  7. WEB 视频开发系列——千万级流量弹幕
  8. FTK将作为RT-Thread子项目发展
  9. caputo分数阶导数程序_Caputo分数阶导数的一种二阶逼近方法
  10. matlab的spwm控制系统仿真,基于MATLAB的SPWM控制系统仿真