GPIO实验之c语言
上一章节进行实验使用的是汇编进行编程的,本次实验是使用c语言进行编写的。
(1)点亮一个led灯
1)启动文件:
crt.S
.text
.global _start
_start:
ldr R0,=0x53000000
mov R1,#0x00000000
str R1,[R0]
ldr sp,=1024*4
bl main
halt_loop:
b halt_loop
2)led.c
#define GPFCON (*(volatile unsigned long*)0x56000050)
#define GPFDAT (*(volatile unsigned long*)0x56000054)
int main()
{
GPFCON= 0x00000100; //可能对其他位进行产生影响
GPFDAT= 0x00000000;
return 0;
}
3)Makefile
led.bin: crt.S led.c
arm-linux-gcc -g -c -o crt.o crt.S
arm-linux-gcc -g -c -o led.o led.c
arm-linux-ld -Ttext 0x00000000 -g led.o crt.o -o led_elf
arm-linux-objcopy -O binary -S led_elf led.bin
arm-linux-objdump -D -m arm led_elf > led.dis
clean:
rm -f led_elf led.dis led.bin *.o
(2)流水灯实验
启动文件:crt.S
源文件:leds.c
#define GPFCON (*(volatile unsigned long*)0x56000050)
#define GPFDAT (*(volatile unsigned long*)0x56000054)
#define GPF4_reset (3<<(4*2))
#define GPF5_reset (3<<(5*2))
#define GPF6_reset (3<<(6*2))
#define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2))
void Delay_ms(volatile unsigned long ms)//延时
{
for(; ms>0; ms--);
}
int main()
{
GPFCON &=~(GPF4_reset | GPF5_reset | GPF6_reset);
GPFCON |= GPF4_out | GPF5_out | GPF6_out; //输出
while(1)
{
GPFDAT &=~(1<<4);
Delay_ms(30000);
GPFDAT |=(1<<4);
GPFDAT &=~(1<<5);
Delay_ms(30000);
GPFDAT |=(1<<5);
GPFDAT &=~(1<<6);
Delay_ms(30000);
GPFDAT |=(1<<6);
}
}
Makefile:
leds.bin: crt.S leds.c
arm-linux-gcc -g -c -o crt.o crt.S
arm-linux-gcc -g -c -o leds.o leds.c
arm-linux-ld -Ttext -g crt.o leds.o -o leds_elf
arm-linux-objcopy -O binary -S leds_elf leds.bin
arm-linux-objdump -D -m arm leds_elf >leds.dis
clean:
rm -f leds_elf leds.bin leds.dis *.o
(3)按键控制led
按键采用外部上拉的形式连接,其中S2,S3,S4分别连接于2440的GPF0,GPF2,GPG3引脚。
启动文件:crt.S
源文件:led_key.c
#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_reset (3<<(4*2))
#define GPF5_reset (3<<(5*2))
#define GPF6_reset (3<<(6*2))
#define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2))
#define GPF0_reset (3<<(0*2))
#define GPF2_reset (3<<(2*2))
#define GPG3_reset (3<<(3*3))
#define GPF0_in (0<<(0*2))
#define GPF2_in (0<<(2*2))
#define GPG3_in (0<<(3*2))
int main()
{
GPFCON &=~(GPF4_reset | GPF5_reset | GPF6_reset);//输出
GPFCON |= GPF_out4 | GPF_out5 | GPF_out6;
GPFCON &=~(GPF0_rest | GPF2_reset);
GPFCON |= GPF0_in | GPF2_in;//该处可要可不要,由于[x:x]=00,通过上面语句已经实现
GPGCON &=~GPG3_reset;
GPFCON |= GPG3_in; //该处可以省去
while(1)
{
if(GPFDAT & (1<<0)) //按键未按
GPFDAT |= (1<<4); //led1灭掉
else
GPFDAT &=~(1<<4); //led1点亮
if(GPFDAT & (1<<2))
GPFDAT |= (1<<5);
else
GPFDAT &=~(1<<5);
if(GPGDAT & (1<<3))
GPGDAT |=(1<<6);
else
GPGDAT &=~(1<<6);
}
}
Makefile:
led_key.bin: crt.S led_key.c
arm-linux-gcc -g -c -o crt.o crt.S
arm-linux-gcc -g -c -o led_key.o led_key.c
arm-linux-ld -Ttext 0x00000000 -g crt.o led_key.o led_key_elf
arm-linux-objcopy -O binary -S led_key_elf led_key.bin
arm-linux-objdump -D -m arm led_key_elf > led_key.dis
clean:
rm -f led_key_elf led_key.dis led_key.bin *.o
通过本次实验简单掌握了S3C244的gpio操作,gpio段落也算告一段落了。下面进行总结一下:
GPIO实验之c语言的更多相关文章
- Cortex-M3学习日志(一)-- GPIO实验
因为项目所需,所以不得不开始研究M3,我用的是NXP公司的LPC1768这个芯片,它是具有三级流水线的哈佛结构,带独立的本地指令和数据总线以及用于外设的稍微低性能的第三条总线,还包含一个支持随机跳转的 ...
- GPIO实验(二)
=============第三个实验============用c语言轮流点亮3个LED=================== 1.crt0.S.text.global _start_start: ...
- GPIO实验(一)
目标:点亮LED1.看原理图,找到对应的引脚和寄存器2.a.配置寄存器为输入/出引脚 GPFCON[9:8]=0b01 b.设置输出高/低电平 GPDAT[4]=0b0 1.预处理2.编 ...
- S02_CH10_ User GPIO实验
S02_CH10_ User GPIO实验 在之前的第四章课程中,我们详细的讲解了如何在VIVADO软件下封装一个简单的流水灯程序.在ZYNQ开发过程中,有时候我们可能会需要与ARM硬核进行通信,在这 ...
- 实验七 MySQL语言结构
实验七 MySQL语言结构 一. 实验内容: 1. 常量的使用 2. 变量的使用 3. 运算符的使用 4. 系统函数的使用 二. 实验项目:员工管理数据库 用于企业管理的员工管理数据库,数据库名为 ...
- 实验报告系列:实验一 HTML语言的简单网页制作
实验一 HTML语言的简单网页制作 一.实验目的: 1.掌握常用的HTML语言标记: 2.利用文本编辑器建立HTML文档,制作简单网页. 3.学习将其它格式的文档转换成HTML格式的文档 二.实验内容 ...
- 实验1 C语言开发环境使用和数据类型、运算符、表达式
♦ 实验结论 PART 1 验证性内容 问题: 1.结尾没有加“:”时回车到下一行的时候再输入下一行的语言首字对齐方式会发生变化,可以对上一行进行检查. (这一点需要在不同软件里面试一下,在机房里的软 ...
- 实验1 c语言最基本内容
part 1 验证性内容 总结:经受了数组和结构体的双重折磨后,发现这部分好简单...现在没啥问题了... part 2 补全程序 1.判断奇偶 // 程序功能: // 要求用户从键盘输入一个整数 ...
- 实验1 C 语言开发环境使用和数据类型、运算符、表达式
# include <stdio.h> int main() { int x; printf("x:\n"); scanf("%d",&x) ...
随机推荐
- Kylin, Mondrian, Saiku系统的整合
本文主要介绍有赞数据团队为了满足在不同维度查看.分析重点指标的需求而搭建的OLAP分析工具.这个工具对Kylin.Mondrian以及Saiku做了一个整合,主要工作包括一些定制化的修改以及环境的配置 ...
- 转:【专题九】实现类似QQ的即时通信程序
引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在 ...
- C#获取驱动器盘符
一.使用ManagementObjectSearcher类 static void Main(string[] args) { SelectQuery selectQuery = new Select ...
- vue:vuex详解
一.什么是Vuex? https://vuex.vuejs.org/zh-cn 官方说法:Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相 ...
- 算法提高 11-1实现strcmp函数
问题描述 自己实现一个比较字符串大小的函数,也即实现strcmp函数.函数:int myStrcmp(char *s1,char *s2) 按照ASCII顺序比较字符串s1与s2.若s1与s2相等返回 ...
- GUI常用对话框5
%输入对话框 name = inputdlg('请输入姓名','实例'); ret = inputdlg({'请输入姓名','请输入性别'},'实例') %一个输入表中多行输入 %留言对话框 info ...
- dalaozouleyeyaojianqiangdehuoxiaqu
dalaozouleyeyaojianqiangdehuoxiaqu 没错,YY又开始哔哔了,非常不淡定,发个博客冷静一下反正没人看 好吧他们还是退役了,关键是我昨天竟然没看到博文???? (我是不会 ...
- Python建立多线程任务并获取每个线程返回值
1.进程和线程 (1)进程是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.进程也可以派生新的进程来执行其他任务,不过每个新进程都拥有自己的内存和数据栈,所 ...
- scrapy 下载图片 from cuiqingcai
import scrapy class MzituScrapyItem(scrapy.Item): # define the fields for your item here like: # nam ...
- 注册登录二合一之bootstrap
来源 https://bootsnipp.com/snippets/featured/login-and-register-tabbed-form jquery插件 需导入bootstrap插件 这个 ...