开发环境与平台

开发板:粤嵌的GEC210开发板
处理器:s5pv210
处理器内核:Cortex-A8
开发环境:Keil4


基础知识

1、s5pv210的I/O口

S5PV210芯片上共有237个多功能的I/O口,分为34组I/0端口

2、内存单元

指针:内存单元的地址。
将一个数值强制转换为指针:(int )0x20391049
给地址赋值:(
(int *)0x20391049) = 0x101001

内存单元的地址就是内存单元的编号。

对于32位机来说,可寻址的范围是0~2^24,也就是最大可以达到4G。操作寄存器也就是操作特定编号的内存单元。

3、程序操作相关

置位操作:  GPIO_REG  |= (1 << x);     //将GPIO_REG的第x位置1
清零操作:  GPIO_REG  &= ~(1 << x);    //将GPIO_REG的第x位清零定义寄存器:#define GPJ2CON    (*(volatile unsigned int*)0XE0200280)#define GPJ2DAT    (*(volatile unsigned int*) 0XE0200284)

volatile关键字的作用:作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。


实验:LED灯亮灭闪烁

操作控制LED亮灭实际就是控制芯片的GPIO引脚输出高低电平,控制GPIO就是控制GPIO的寄存器

1、查看原理图

通过查看原理图可以得知控制LED接的分别是芯片的GPJ2_0、GPJ2_1、GPJ2_2、GPJ2_3引脚。GPIO输出低电平点亮LED,高电平熄灭。


2、看S5PV210芯片手册

找到对应GPJ2寄存器相关的章节

1、配置寄存器


通过配置寄存器配置GPIO的模式,可以看到四位控制一个GPIO引脚的模式,有输入、输出、中断等等模式。可以看到每四位默认是0000,所以引脚默认是输入,这里要控制led,所以要配置为输出。

2、数据寄存器

GPJ2组GPIO只有7个引脚,数据寄存器的0-7位分别对应GPJ2_0~7,对数据寄存器对应的位写入0就将对应的GPIO输出低电平,反之输出高电平。

3、其他寄存器

暂时只看以上寄存器即可。


3、编写程序

(1)汇编程序

 area init,code ,readonlyentryldr r1, =0xE0200280      ;将控制寄存器地址放到r1ldr r0, =0x00001111      ;将0x00001111存放r0中str r0, [r1]             ;将控制寄存器的值设置为0x00001111,即将GPJ2_0/1/2/3配置为输出模式led_blink:;设置GPJ2DAT的bit[0:3],使GPJ2_0/1/2/3引脚输出低电平,LED亮ldr r1, =0xE0200284                     mov r0, #0str r0, [r1]bl delay                      ; 延时                ;设置GPJ2DAT的bit[0:3],使GPJ2_0/1/2/3引脚输出高电平,LED灭ldr r1, =0xE0200284                     mov r0, #0xfstr r0, [r1]bl delay                          ;延时b  led_blinkhalt:b haltdelay:mov r0, #0xf00000
delay_loop:cmp r0, #0sub r0, r0, #1bne delay_loopmov pc, lrend

(2)C语言程序

start.s:

 area init,code ,readonlyentryreset;先省略设置堆栈这些东西import Mainbl Mainb .end

led.c:

#include "s5pv210.h"
#include "led.h"void led_init(void)    //LED引脚初始化
{GPJ2.GPJ2CON=(GPJ2.GPJ2CON & ~0xffff) | (0x1111);     //配置GPJ2_0/1/2/3为输出GPJ2.GPJ2DAT |=0XF;                                  //拉高,默认LED是熄灭的}void led_on_off(void)
{/*异或,不同为1,相同为0。异或0xF,GPJ2_0/1/2/3为低电平时执行该语句后变成高电平熄灭LEDGPJ2_0/1/2/3为高电平时执行该语句后变成低电平电平点亮LED                                               */GPJ2.GPJ2DAT ^= 0xf;
}
//软件延时
void delay(unsigned int z)
{unsigned int x,y;for(x = z;x > 0;x--)for(y = 120;y > 0;y--);
}

s5pv210.h:

寄存器定义

...
...
...
typedef struct
{unsigned int GPD0CON;unsigned int GPD0DAT;unsigned int GPD0PUD;unsigned int GPD0DRV;unsigned int GPD0CONPDN;unsigned int GPD0PUDPDN;
}gpd0;
#define GPD0 (*(volatile gpd0 *)0xE02000A0)   typedef struct
{unsigned int GPJ2CON;unsigned int GPJ2DAT;unsigned int GPJ2PUD;unsigned int GPJ2DRV;unsigned int GPJ2CONPDN;unsigned int GPJ2PUDPDN;
}gpj2;
#define GPJ2 (*(volatile gpj2 *)0XE0200280)
...
...
...

main.c:

#include "led.h"int Main(void)
{led_init();while(1){led_on_off();           //点亮or熄灭LEDdelay(0xfff);              //延时}
}

ARM学习之GPIO编程相关推荐

  1. ARM学习之GPIO实现流水灯

    今天在学习MMU时的时候,写了一个流水灯程序.虽然很简单,但是不怕大家笑话,由于学C语言的时候没学位运算操作,再加上硬件实验做的少,所以实现这个也费了不少力气呢. /** leds.c: 循环点亮4个 ...

  2. 华芯微特SWM181学习笔记--GPIO应用与环境搭建

    华芯微特SWM181 系列 32 位 MCU(以下简称 SWM181)内嵌 ARM® CortexTM-M0 内核, SWM181 支持片上包含精度为 1%以内的 24MHz.48MHz 时钟,并提供 ...

  3. 2015-10-11 Sunday 晴 ARM学习

    基础的知识看得差不多了,linux系统相关的,最主要是c语言基础知道,还有linux系统编程,网络编程socket等相关的. 这些内容最最基础的看完了,接下来我在考虑看什么呢?是看ARM以及驱动编程系 ...

  4. 基于树莓派的python GPIO编程-常用函数综合整理

    Hello,朋友们大家好,欢迎大家来到LIUSE网络. 随着Mini型PC越来越多,与之而来的创客也丰富起来,比如说Arduino就是一个非常好里例子. 不过,Arduino毕竟是一块适合入门型的基础 ...

  5. STM32学习笔记---GPIO

    STM32的学习笔记-GPIO 我使用的是STM32F401ZGT6,有7组IO口,每组16个引脚,共112个引脚. 因为太菜了,确实容易出错,还请赐教 参考官方文档:八种IO口模式区别 结构原理 该 ...

  6. [嵌入式]S5PV210微处理器GPIO编程

    第四章 S5PV210微处理器GPIO编程 4.1  S5PV210硬件资源    S5PV210是一款32位精简指令集计算机(RISC),具有低成本.低功耗.高性能的微处理器解决方案,适用于手机及一 ...

  7. ARM学习系列 ---- ARM NEON

    ARM学习系列 ---- ARM NEON 1 NEON概述 1.1 简介 NEON是指适用于Arm Cortex-A系列处理器的一种高级SIMD(单指令多数据)扩展指令集,可执行并行数据处理. 1. ...

  8. ARM 学习笔记整理(一)

    ARM 学习笔记整理,主要用于将来的研究开发参考. 一.ARM体系结构的版本 处理器的体系结构就是其使用的指令集,而通常我们说的Soc结构的处理器可以理解为一个实现机器指令集的硬件内核,在这个内核周围 ...

  9. Python学习之面向对象编程

    Python学习目录 在Mac下使用Python3 Python学习之数据类型 Python学习之函数 Python学习之高级特性 Python学习之函数式编程 Python学习之模块 Python学 ...

最新文章

  1. python中的高阶函数
  2. Ubuntu利用Samba映射磁盘到Windows(转)
  3. psql: 致命错误: 用户 postgres Ident 认证失败
  4. QYResearch回顾:2017年中国汽车语音识别系统产量为1413万
  5. 一些简单的java编程题(3) ————小球落地问题
  6. 【C++拾遗之二】fseek、ftell函数读取文件
  7. 大数据之 Hadoop 基本概念
  8. android 浏览器 内核版本,Android集成三方浏览器之X5内核
  9. 三种百度网盘加速器,轻松突破10M/S,总有一款适合你!
  10. 微信公众号数据2019_全国公众号总排名2019,全国微信公众号排名
  11. NAT技术配置(内外网IP地址转换)
  12. Java api中文在线版
  13. 小孩几岁学计算机合适,孩子几岁学电脑最合适?
  14. python输入输出拓展: 制作简单的exe程序(温度转换器)
  15. 小强IT游记之大连行
  16. 石英晶振应该如何存放,标准有哪些?
  17. Python 实现人机大战猜数字
  18. 可行性分析如何分析?
  19. Microsoft SQL Server 2000 下载地址汇总
  20. 『每周译Go』手把手教你用 Go 实现一个 mTLS

热门文章

  1. 如何快速批量转换图片格式?
  2. 为什么那么多公司在用快速开发平台开发软件?
  3. 智慧(路灯)灯杆的十大功能对应的经典落地应用案例分享
  4. 【Java入门学习】JAVA设计一个雇员类,创建雇员类对象
  5. 开发和设计实现LSTM模型用于家庭用电的多步时间序列预测
  6. 洛谷P2341(受欢迎的牛)题解
  7. 如何从Mac上恢复iPhone数据?iPhone数据恢复用户指南
  8. 蓝桥杯每日一练:等差序列求和
  9. OWASP TOP10 及防御手段(附加应用安全设计框架)
  10. 华为ne40e出现php什么意思,NE80E、NE40E、NE5000E的POS卡端口信息告警的含义及定位方法...