嵌入式GPIO接口及操作(二)
来源:互联网 发布:网络词mi是什么意思 编辑:程序博客网 时间:2024/05/08 18:47
目标:C语言实现点亮LED灯
首先是main函数,并不特殊,它是被系统调用来执行的,main函数结束后要返回调用main函数的地址处,那么裸机程序,没有操作系统做这些工作,就要自己写调用main函数的程序了。
软件相关的初始化:
1、设置栈 2、设置main函数返回地址 3、调用main 4、清理工作
所谓设置栈就是将栈指针SP指向某块内存,在S3C2440中这块内存可以是片内SRAM,这样不用初始化内存了,如果指向SDRAM,那么首先要初始化SDRAM。
硬件相关的初始化:
关闭看门狗、初始化时钟、初始化SDRAM等
软件相关初始化和硬件相关初始化结合一起就是启动文件。
下面是用C语言写的代码
这一段代码是汇编语言,作用相当于启动文件,在这里为了简单,在硬件方面初始化只关闭了看门狗,软件方面初始化设置了栈。
下面就实现c语言的main函数。
2、用C语言轮流点亮LED
Makefile
首先是main函数,并不特殊,它是被系统调用来执行的,main函数结束后要返回调用main函数的地址处,那么裸机程序,没有操作系统做这些工作,就要自己写调用main函数的程序了。
软件相关的初始化:
1、设置栈 2、设置main函数返回地址 3、调用main 4、清理工作
所谓设置栈就是将栈指针SP指向某块内存,在S3C2440中这块内存可以是片内SRAM,这样不用初始化内存了,如果指向SDRAM,那么首先要初始化SDRAM。
硬件相关的初始化:
关闭看门狗、初始化时钟、初始化SDRAM等
软件相关初始化和硬件相关初始化结合一起就是启动文件。
下面是用C语言写的代码
这一段代码是汇编语言,作用相当于启动文件,在这里为了简单,在硬件方面初始化只关闭了看门狗,软件方面初始化设置了栈。
crt.S
.text.global _start_start:ldr r0,=0x53000000@看门狗地址movr1,#0x0str r1,[r0]@写入0,关闭看门狗ldrsp,=1024*4@设置堆栈,注意不能大于4Kblmainhalt_loop:b halt_loop分析这段汇编程序,首先初始化硬件相关的,关闭看门狗,然后设置堆栈,在s3c2440不能大于4K,因为s3c2440片内SRAM只有4K,再然后就是调到main函数,用了bl指令,bl有两个功能,一是跳转,二是设置了返回地址,就是bl main指令的下一条指令b hail_loop,所以在这里就初始化完返回地址了。
下面就实现c语言的main函数。
#define GPFCON(*(volatile unsigned long *)0x56000050)#define GPFDAT(*(volatile unsigned long *)0x56000054)intmain(){GPFCON = 0x00000100;GPFDAT = 0x00000000;return 0;}
2、用C语言轮流点亮LED
#define GPFCON(*(volatile unsigned long *)0x56000050)#define GPFDAT(*(volatile unsigned long *)0x56000054)#define GPF4_out ( 1 << 4*2 )#define GPF5_out ( 1 << 5*2 )#define GPF6_out ( 1 << 6*2 )void delay(volatile unsigned long dly){for(;dly > 0;dly--);}intmain(){unsigned i = 1;GPFCON = GPF4_out | GPF5_out | GPF6_out;while(1){GPFDAT = ( ~( i << 4 ) );i *=2;if( i == 8){i = 1;}delay(30000);}return 0;}
Makefile
CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestandingled_on.bin:ctr.S main.carm-linux-gcc $(CFLAGS) -c -o ctr.o ctr.Sarm-linux-gcc $(CFLAGS) -c -o main.o main.carm-linux-ld -Ttext 0x00000000 ctr.o main.o -o led_on.elfarm-linux-objcopy -O binary -S led_on.elf led_on.binarm-linux-objdump -D -m arm led_on.elf>led_on.disclean:rm -f led_on.bin led_on.elf *.o led_on.dis3、按键操作
#define GPFCON(*(volatile unsigned long *)0x56000050)#define GPFDAT(*(volatile unsigned long *)0x56000054)#define GPGCON(*(volatile unsigned long *)0x56000060)#define GPGDAT(*(volatile unsigned long *)0x56000064)#define GPF4_out ( 1 << 4*2 )#define GPF5_out ( 1 << 5*2 )#define GPF6_out ( 1 << 6*2 )#define GPF4_msk ( 3 << ( 4*2 ) )#define GPF5_msk ( 3 << ( 5*2 ) )#define GPF6_msk ( 3 << ( 6*2 ) )#define GPF0_in( 0 << 0*2 )#define GPF2_in( 0 << 2*2 )#define GPG3_in( 0 << 3*2 )#define GPF0_msk ( 3 << ( 0*2 ) )#define GPF2_msk ( 3 << ( 2*2 ) )#define GPG3_msk ( 3 << ( 3*2 ) )intmain( void ){unsigned long ysdat;GPFCON &= ~( GPF4_msk | GPF5_msk | GPF6_msk );GPFCON |= GPF4_out |GPF5_out | GPF5_out;GPFCON &= ~( GPF0_msk | GPF2_msk );GPFCON |= GPF0_in |GPF2_in;GPGCON &= ~( GPG3_msk );GPGCON |= GPG3_in;while(1){ ysdat = GPFDAT; if( ysdat & ( 1 << 0 ) ) { GPFDAT |= ( 1 << 4 ); } else { GPFDAT &= ~( 1 << 4 ); } if( ysdat & ( 1 << 2 ) ) { GPFDAT |= ( 1 << 5 ); } else { GPFDAT &= ~( 1 << 5 ); } ysdat = GPGDAT; if( ysdat & ( 1 << 3 ) ) { GPFDAT |= ( 1 << 6 ); } else { GPFDAT &= ~( 1 << 6 ); } }return 0;}Makefile
CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestandingled_on.bin:ctr.S main.carm-linux-gcc $(CFLAGS) -c -o ctr.o ctr.Sarm-linux-gcc $(CFLAGS) -c -o main.o main.carm-linux-ld -Ttext 0x00000000 ctr.o main.o -o led_on.elfarm-linux-objcopy -O binary -S led_on.elf led_on.binarm-linux-objdump -D -m arm led_on.elf>led_on.disclean:rm -f led_on.bin led_on.elf *.o led_on.dis通过嵌入式GPIO接口及操作(一)及这篇两个程序的练习,能够掌握对GPIO的操作,这是操作硬件的基本技能。
1 0
- 嵌入式GPIO接口及操作(二)
- 嵌入式GPIO接口及操作(一)
- 嵌入式Linux GPIO 操作
- tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作
- 【嵌入式Linux+ARM】GPIO操作
- am335x嵌入式开发-GPIO操作
- 【嵌入式Linux+ARM】GPIO操作
- NodeMCU--学习笔记(二)GPIO操作
- 嵌入式Linux应用开发完全手册(二)GPIO
- gpiolib及gpio操作
- gpiolib及gpio操作
- 嵌入式系统学习(八)-通过sysfs(/sys/class/gpio)操作GPIO
- 五、嵌入式学习笔记--GPIO接口
- 6410 gpio控制及接口
- linux中通用GPIO接口的操作
- linux中通用GPIO接口的操作
- linux中通用GPIO接口的操作
- 浅谈GPIO(二)
- 正则表达式查找表
- 复习一个老项目,复习旧知识点
- mac 配置jdk1.8(小白教程)
- phpcms-v9.6.0复制word格式文章到文本框
- 【转】微博URL短网址生成算法原理及(java版、php版实现实例)
- 嵌入式GPIO接口及操作(二)
- C语言程序的编译、链接具体过程及Linux环境下的具体实例
- http接口测试资料整理系列1--概念简介
- mingW与cygwin
- C# 字段和局部变量
- 二叉树
- Android简单自定义View——获取图片颜色的ImageView
- 剑指offer 66题 矩阵中的路径
- Spring常用注解,自动扫描装配Bean