TQ2440 linux环境下C程序实验,TQ2440 学习笔记—— 14、GPIO 接口【实验:用C语言实现】...

(韦东山——嵌入式Linux 应用开发完全手册)

1、使用C语言代码点亮一个LED

C 语言程序执行的第一条指令,并不在main函数中。生成一个C程序的可执行文件时,编译器通常会在我们的代码中加上几个被称为启动文件的代码——crtl.o、crti.o、crtend.o、crtn.o等,它们都是标准库文件。这些代码设置C程序的堆栈等,然后调用main函数。它们依赖于操作系统,在裸板上这些代码无法执行,所以需要自己写一个。

a、crt0.s

0818b9ca8b590ca3270a3433284dd417.png

它在第 13行设置好栈指针后,就可以通过第15行调用C函数main 了。C 函数在执行前必须设置栈。

【注意】韦东山老师那本教材上面是有点错误的,比如WATCHDOG寄存器的地址就写成了0x56000010。

b、代码:

0818b9ca8b590ca3270a3433284dd417.png

【注意】自己按照韦东山老师修改的!

c、Makefile

0818b9ca8b590ca3270a3433284dd417.png

第 2、3行分别编译源程序crt0.S 、led_on_c.c (还没有链接)

第 4 行将编译得到的结果链接起来

第 5 行把链接得到的led_on_c_elf 转换成二进制格式文件led_on_c.bin

第 6 行将结果转换为汇编代码以供查看。

d、实验成功

e、反汇编代码  命令arm-linux-objdump  -D -b binary -m arm led_on_c.bin

0818b9ca8b590ca3270a3433284dd417.png

(看了视频忘了,下次解释

0818b9ca8b590ca3270a3433284dd417.pngO(∩_∩)O)

2、使用按键来控制LED

源码如下:

/*

* 实现按键控制 LED

* TQ2440 四个LED灯对应的引脚是 GPB5、6、7、8

* 按键 K1~K4 分别对应 GPF1、4、2、0

*/

#define GPBCON (*(volatile unsigned long *)0x56000010)

#define GPBDAT (*(volatile unsigned long *)0x56000014)

#define GPFCON (*(volatile unsigned long *)0x56000050)

#define GPFDAT (*(volatile unsigned long *)0x56000054)

/*

* LED1,LED2,LED3,LED4 配置为输出

*/

#defineGPB5_out(1<

#defineGPB6_out(1<

#defineGPB7_out(1<

#defineGPB8_out(1<

/*

* LED1,LED2,LED3,LED4对应GPF1、GPF4、GPF2,GPF0

* 按键配置为输入

*/

#defineGPF1_in ~(3<

#defineGPF4_in ~(3<

#defineGPF2_in ~(3<

#defineGPF0_in ~(3<

int main()

{

unsigned long dwDat;

// LED1,LED2,LLED3,ED4对应的4根引脚设为输出

GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out;

// K1~K4 分别对应 GPF1、4、2、0 引脚设为输入

GPFCON = GPF1_in & GPF4_in &GPF2_in & GPF0_in;

while(1){

//若Kn为0(表示按下),则令LEDn为0(表示点亮)

dwDat = GPFDAT; // 读取GPF管脚电平状态

if (dwDat & (1<<1)) // K1没有按下,dwDat 为高电平 1

GPBDAT |= (1<<5); // LED1熄灭

else

GPBDAT &= ~(1<<5); // LED1点亮

if (dwDat & (1<<4)) // K2没有按下

GPBDAT |= (1<<6); // LED2熄灭

else

GPBDAT &= ~(1<<6); // LED2点亮

if (dwDat & (1<<2)) // K3没有按下

GPBDAT |= (1<<7); // LED3熄灭

else

GPBDAT &= ~(1<<7); // LED3点亮

if (dwDat & (1<<0)) // K4没有按下

GPBDAT |= (1<<8); // LED4熄灭

else

GPBDAT &= ~(1<<8); // LED4点亮

}

return 0;

}

实验成功!

总结:

a、烧写程序时烧写到NAND Flash 中。理由:S3C2440 中有被称为“ Steppingstone ” 的4KB内部RAM;当选择从NAND Flash 启动CPU 时,CPU会自动通过内部的硬件将NAND Flash开始的4KB字节数据复制到这4 KB 的内部RAM中(此时内部RAM 的起始地址为0),然后跳到地址0 开始执行。

NOR Flash 虽然可以像内存一样进行读操作,却不可以想内存一样进行写操作,所以从NOR Flash 启动时,一般先在代码开始部分使用汇编指令初始化外接的内存器件(外存),然后将代码复制到外存中,最后跳到外存中继续执行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值