TQ2440 学习笔记—— 14、GPIO 接口【实验:用C语言实现】
2015-09-02 20:27
441 查看
(韦东山——嵌入式Linux 应用开发完全手册)
1、使用C语言代码点亮一个LED
C 语言程序执行的第一条指令,并不在main函数中。生成一个C程序的可执行文件时,编译器通常会在我们的代码中加上几个被称为启动文件的代码——crtl.o、crti.o、crtend.o、crtn.o等,它们都是标准库文件。这些代码设置C程序的堆栈等,然后调用main函数。它们依赖于操作系统,在裸板上这些代码无法执行,所以需要自己写一个。
a、crt0.s
它在第 13行设置好栈指针后,就可以通过第15行调用C函数main 了。C 函数在执行前必须设置栈。
【注意】韦东山老师那本教材上面是有点错误的,比如WATCHDOG寄存器的地址就写成了0x56000010。
b、代码:
【注意】自己按照韦东山老师修改的!
c、Makefile
第 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
(看了视频忘了,下次解释
O(∩_∩)O)
2、使用按键来控制LED
源码如下:
实验成功!
总结:
a、烧写程序时烧写到NAND Flash 中。理由:S3C2440 中有被称为“ Steppingstone ” 的4KB内部RAM;当选择从NAND Flash 启动CPU 时,CPU会自动通过内部的硬件将NAND Flash开始的4KB字节数据复制到这4 KB 的内部RAM中(此时内部RAM 的起始地址为0),然后跳到地址0
开始执行。
NOR Flash 虽然可以像内存一样进行读操作,却不可以想内存一样进行写操作,所以从NOR Flash 启动时,一般先在代码开始部分使用汇编指令初始化外接的内存器件(外存),然后将代码复制到外存中,最后跳到外存中继续执行。
1、使用C语言代码点亮一个LED
C 语言程序执行的第一条指令,并不在main函数中。生成一个C程序的可执行文件时,编译器通常会在我们的代码中加上几个被称为启动文件的代码——crtl.o、crti.o、crtend.o、crtn.o等,它们都是标准库文件。这些代码设置C程序的堆栈等,然后调用main函数。它们依赖于操作系统,在裸板上这些代码无法执行,所以需要自己写一个。
a、crt0.s
它在第 13行设置好栈指针后,就可以通过第15行调用C函数main 了。C 函数在执行前必须设置栈。
【注意】韦东山老师那本教材上面是有点错误的,比如WATCHDOG寄存器的地址就写成了0x56000010。
b、代码:
【注意】自己按照韦东山老师修改的!
c、Makefile
第 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
(看了视频忘了,下次解释
O(∩_∩)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 配置为输出 */ #define GPB5_out (1<<(5*2)) #define GPB6_out (1<<(6*2)) #define GPB7_out (1<<(7*2)) #define GPB8_out (1<<(8*2)) /* * LED1,LED2,LED3,LED4对应GPF1、GPF4、GPF2,GPF0 * 按键配置为输入 */ #define GPF1_in ~(3<<(1*2)) #define GPF4_in ~(3<<(4*2)) #define GPF2_in ~(3<<(2*2)) #define GPF0_in ~(3<<(0*2)) 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 启动时,一般先在代码开始部分使用汇编指令初始化外接的内存器件(外存),然后将代码复制到外存中,最后跳到外存中继续执行。
相关文章推荐
- C语言正数和负数循环右移,左移,把某正数的第m位(从0开始)到n位取反
- 【C++】类和对象(构造与析构)
- c++ set的常用用法
- 并查集的简介及其C/C++代码的实现及优化
- C++链接与装载
- C++ auto_ptr
- C++primer 阅读笔记-模板与泛型编程(成员模板)
- C++项目开发常用的开源库
- C++模板元编程 - 1 基本数据类型和运算
- 协变(Covariance)与逆变(Contravariance)
- 从 C/C++ 程序调用 Java 代码
- 漫谈C指针第三讲---指针是什么东西
- 一些不常见的C++关键字
- Python调用C++程序备忘笔记
- [C++][编程风格]C++命名规则
- Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
- 带重复元素的排列
- C++简单封装互斥量
- C++编译器如何对Const常量进行分配存储空间
- c++命名空间