S3C2440逻辑程序--从点灯开始
前言
有了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逻辑程序--从点灯开始相关推荐
- u-boot移植随笔:u-boot2010.09移植到8MB Nor Flash的S3C2440,第一步搞定(补记)
这个本来是我发在csdn上的帖子,有一次使用搜索引擎时不小心搜索到.于是再将它放到博客里. 芯片:S3C2440(目前大部分的开发板在某个层次上讲是一样的) Nor Flash:SST39VF6401 ...
- u-boot移植随笔:自定义u-boot命令点灯
u-boot移植随笔:自定义u-boot命令点灯 前几天一不小心在CSDN论坛上发帖散分,同时许诺完成点灯就结账,经过努力,终于可以在u-boot的shell中输入自定义的命令来点灯了.下面简单讲一下 ...
- linux下s3c2440开发板,SAMSUNG S3C2440 ARM LINUX 开发板 上手初体验 --开发环境搭建
1,linux开发环境搭建 2,程序测试 easyOpentag驱动安装,打开连接,选择ARM-linux 1,环境搭建 我的系统版本 root@ubuntu:~# lsb_release -a No ...
- 修改S3C2440的时钟工作频率
文章目录 修改S3C2440的时钟工作频率 时钟概览 S3C2440A的时钟框图 时钟控制逻辑 FCLK HCLK PCLK的频率比 设置MPLL的输出频率 写代码 修改S3C2440的时钟工作频率 ...
- S3C2440驱动开发(七)
Bootloader Bootloader 以其本身的含义来讲就是下载和启动系统,它类似于 PC 中的 BIOS,大部 分芯片厂商所提供的嵌入式系统都提供有这样的程序,而且都比较成熟,大可不必自行编写 ...
- S3C2440 SDRAM内存驱动 .
SDRAM(Synchronous Dynamic Random Access Memory,同步动态随机存储器)也就是通常所说的内存.内存的工作原理.控制时序.及相关控制器的配置方法一直是嵌入式系统 ...
- arm-linux交叉编译工具链的制作(基于S3C2440)【转】
本文转载自:http://eric-gao.iteye.com/blog/2160622 制作arm-linux交叉编译工具链一般通过crosstool工具或者crosstool-NG,前者使用方便, ...
- S3C2440的内存情况在NAND FLASH或者NOR FLASH启动的情况下
1,从NANDFLASH启动时,在ARM上电时,ARM会自动把NANDFLASH前4K的内容拷贝到S3C2440内部SRAM中,同时把SRAM的地址映射到0X00000000.ARM上电后会从SRAM ...
- python小游戏代码大全-Python编写的点灯小游戏代码
Python语言编写的点灯小游戏代码及思路如下: 点灯游戏及其求解的方法, 点灯游戏的游戏规则: (1)有个N行N列的灯板,当你开关其中一盏灯: (2)它和上下左右的灯的状态全部反转,目标是将全部的灯 ...
最新文章
- TinyCrayon-iOS-SDK:强大到使人惊讶的 Mask 及切图工具库
- 人工智能抢饭碗,你的工作还保得住吗?
- 一些在数字化转型的方面的公司和例子
- python反向迭代器_Python中对象迭代与反迭代的技巧总结
- linux /dev/disk/by-path 修改,Linux磁盘分区
- html img设置最底层,在HTML片段中设置img标签的baseUrl
- Flutter基础—定位对齐之中心定位
- flex自定义preloader预加载进度条
- [渝粤教育] 浙江大学 半导体材料 参考 资料
- [label][paypal] Paypal 支付页面的语言显示问题
- 简单示例用例(Simple Example Use Cases)--hive GettingStarted用例翻译
- Linux20180421五周第二次课(4月19日)
- 新概念模拟电路_第一册_晶体管_读书笔记
- 【BZOJ 1305】[CQOI2009]dance跳舞
- jsonobject返回map_如何把JSON对象转为map对象
- 中国建设银行宣布:国内第一家无人银行,在上海正式开业!
- 更换Eclipse黑色皮肤
- kafak学习之分享ppt
- 小米手机升级MIUI11后,要记得关闭这4个按钮,不然电池就会不耐用
- FY4A-真彩色图 天气雷达瓦片在线服务用法