1、GPIO
GPIO(General Purpose Input/Output Port),即通用输入输出端口,就是芯片的一些引脚。作为输入端口时,我们可以通过它们读入引脚的状态--高电平或低电平,作为输出端口时,我们可以通过它们输出高电平或低电平来控制连接的外围设备。
S3C2440有130个GPIO引脚,分为A~J共9组:GPA、GPB、…、GPJ。通过设置相应的寄存器来设置某个引脚的功能(输入或输出或是其他特殊功能)。
2、通过寄存器操作GPIO
每个端口可以很容易的通过软件配置以满足各种系统配置和设计需求,在使用之前你必须定义每个引脚的功能,如果不是用于复用功能,则引脚可以配置为普通输入输出端口。
1)端口配置寄存器GPxCON(x为A~J)
GPxCON是用于选择引脚功能。
PORT A的端口配置寄存器GPACON中每一位对应一个引脚(PORT A共23个引脚,bit0~bit22对应GPA0~GPA22)。当某位被设为0时,相应的引脚被设置成输出引脚,此时可以在GPADAT中相应位写入0或1让此引脚输出低电平或高电平。当某位被设为1时,相应的引脚被设为地址线或用于地址控制,此时GPADAT无用。(GPACON通常被设为全1,以便访问外部存储器件)
PORT B~PORT J的端口配置寄存器操作完全相同:GPxCON中每两位控制一个引脚,00为输入、01为输出、10为特殊功能、11保留。
2)端口数据寄存器GPxDAT(x为A~J)
GPxDAT是用于读/写引脚数据。
当引脚被设为输入时,读此寄存器可得到相应引脚的电平状态是高还是低;当引脚被设为输出时,通过写此寄存器的相应位可设置相应引脚输出高电平或低电平。
3)端口上拉寄存器GPxUP(x为B~J,注意:PORT A端口没有这个寄存器)
GPxUP是用于选择是否使用内部上拉电阻。
此寄存器的某位被设置为1时,相应引脚不使用内部上拉电阻;设置为0时,相应引脚使用内部上拉电阻。
图1 上拉电阻
3、使用软件来访问硬件
对单个引脚的操作有3种:输出高低电平、检测引脚状态、中断,这些操作一般通过读、写寄存器完成。如图2所示电路,可以设置GPFCON寄存器将GPF4、GPF5、GPF6引脚设置4为输出功能,然后写GPFDAT寄存器的相应位使这3个引脚输出高电平或低电平来控制相应的LED。相应的引脚输出低电平时,LED点亮,输出高电平时,LED熄灭。
图2 LED电路图
S3C2440的GPFCON、GPFDAT寄存器地址分别是0x56000050、0x56000054,通过软件读写它们的地址可以访问这些寄存器。S3C2440芯片手册对这些寄存器的介绍如下图:
图3 PORT F寄存器介绍
4、GPIO操作实例
使用GPIO控制一个LED。例如,我们要想点亮LED1,就需要设置GPF4引脚为输出功能,然后设置该引脚输出低电平。
板子上电后执行的第一条指令,并不是main函数,如果我们使用keil开发,启动文件会由编译器完成(会有一个S3C2440.S文件就是启动文件),它要做的工作主要是各种初始化然后跳转到C文件的main函数执行。但是我们在Linux系统下使用arm-linux-gcc编译裸机程序时,就需要自己编写一个这样的启动文件代码。(建一个目录led_on_c,把编写的代码文件和Makefile文件放在该目录下)
自己编写的启动文件代码crt0.S内容:
@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@******************************************************************************       .text
.global _start
_start:ldr     r0, =0x53000000     @ WATCHDOG寄存器地址mov     r1, #0x0                     str     r1, [r0]            @ 写入0,禁止WATCHDOG,否则CPU会不断重启ldr     sp, =1024*4         @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K@ nand flash中的代码在复位后会移到内部ram中,此ram只有4Kbl      main                @ 调用C程序中的main函数
halt_loop:b       halt_loop
下面是LED1的控制程序led_on_c.c文件,内容如下:
#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)int main()
{GPFCON = 0x00000100;    // 设置GPF4为输出口, 位[9:8]=0b01GPFDAT = 0x00000000;    // GPF4输出0,LED1点亮return 0;
}
Makefile文件:
led_on_c.bin : crt0.S  led_on_c.c
    arm-linux-gcc -g -c -o crt0.o crt0.S
    arm-linux-gcc -g -c -o led_on_c.o led_on_c.carm-linux-ld -Ttext 0x0000000 -g  crt0.o led_on_c.o -o led_on_c_elfarm-linux-objcopy -O binary -S led_on_c_elf led_on_c.binarm-linux-objdump -D -m arm  led_on_c_elf > led_on_c.dis
clean:rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o
第2、3行分别编译源程序crt0.S、led_on_c.c
第4行将编译得到的结果连接起来
第5行把连接得到的ELF格式可执行文件led_on_c_elf转换成二进制格式文件led_on_c.bin
第6行将结果转换为汇编码以供查看
在led_on_c目录下执行make命令生成可执行文件led_on_c.bin,然后把该文件烧写到NAND Flash。

五、嵌入式学习笔记--GPIO接口相关推荐

  1. 嵌入式学习笔记——使用寄存器编程操作GPIO

    使用寄存器编程操作GPIO 前言 GPIO相关的寄存器 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I) 位操作 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) ...

  2. cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)

    cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断) https://blog.csdn.net/qq_16255321/article/details/43086 ...

  3. 立创梁山派学习笔记——GPIO输出控制

    梁山派 前言 开发板简介 GD32F407ZGT6官方资源 数据手册 1.系统框图 2. 引脚复用表 3.命名规则 4.其他 用户手册 固件库与PACK包 开发环境搭建 立创官方的资料包 资料齐活,开 ...

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

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

  5. 嵌入式学习笔记——ADC模数转换器

    ADC模数转换器 前言 ADC介绍 ADC概述 ADC的数量 ADC的特性 ADC框图 芯片外部框图 芯片内部框图 转换部分框图 状态输出部分 条件触发框图 寄存器介绍 编程思路 模式选择 规则通道的 ...

  6. 嵌入式学习笔记——STM32的USART通信概述

    文章目录 前言 常用通信协议分类及其特征介绍 通信协议 通信协议分类 1.同步异步通信 2.全双工/半双工/单工 3.现场总线/板级总线 4. 串行/并行通信 5. 有线通信.无线通信 STM32通信 ...

  7. 嵌入式学习笔记--jlink 工具RTT使用笔记

    嵌入式学习笔记–jlink 工具RTT 使用笔记 最近有调试一个ethcat板卡的需求,板卡设计的很简洁,没有多余的调试串口,正准备飞线到单片机针脚上的时候发现了RTT 的这个工具,记录一下使用的方法 ...

  8. 嵌入式学习笔记--misc

    嵌入式学习笔记–misc 一.内核自带MISC驱动简介 misc 的意思是混合.杂项的,因此 MISC 驱动也叫做杂项驱动,也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动. ...

  9. 嵌入式学习笔记——基于Cortex-M的单片机介绍

    基于Cortex-M的单片机介绍 前言 1生产厂商及其产品线 1.1ARM单片机的产品线 1.2命名规则 作业1 2习单片机的资料准备 2.1STM32开发所需手册 2.1.1芯片的数据手册 芯片基本 ...

  10. 嵌入式学习笔记——寄存器实现控制LED小灯

    文章目录 前言 GPIO通用输出模式 初始化LED小灯的GPIO 原理图 初始化代码 初始化的效果 功能函数封装 直接分开宏定义两个 使用条件运算符 封装函数实现简单的功能 KEIL MDK一些技巧 ...

最新文章

  1. 少一些计较多_新的一年:少一分计较,多一分宽容
  2. Google Guice范例解说之使用入门
  3. CodeForces - 1200C——小模拟
  4. python数据预测案例_Python数据分析及可视化实例之疾病预测(分类)
  5. luoguP4705 玩游戏
  6. oracle取本月最后一天是星期几_在oracle里,如何取得本周、本月、本季度、本年度的第一天和最后一天的时间...
  7. java -cp 什么意思 怎么用
  8. 容器就业市场持续增长,5条建议让您快速掌握Docker技能
  9. 异速联虚拟打印出来格式不对,如何处理
  10. 补丁KB2999226纯净版下载地址
  11. matlab 设置计算精度,matlab计算精度设置
  12. web一阶段 day13 阿里矢量图库的使用方法
  13. GMP类有哪些最新发表的毕业论文呢?
  14. 一起学爬虫(Python) — 23 自动化详解2
  15. 15款android设备上的代码编辑器
  16. 【MySQL】数据库表操作
  17. 百度谷歌一起搜 - 百Google度 - Chrome插件2
  18. 本地配置多个 Git 账户信息,满足不同的 Git 平台
  19. PS 之AD命令之Get-ADuser!
  20. VC++“内存资源不足,无法完成此操作”——解决的心路历程(User对象)

热门文章

  1. 彻底理解原型对象与原型链机制
  2. CentOS 7查看源代码
  3. 程序员除了写代码,还能做哪些副业?
  4. Oracle EBS FSG报表运行无数据RG_RARG0004Error
  5. 东原地产的女性视角——对话罗韶颖
  6. 【技术】BootStrapTable 滚动条控制
  7. Opencv 16位深度图片显示并保存
  8. 从单目视觉信息学习深度信息(一)
  9. 乐动手环app下载安装_乐动健康手环app下载-乐动健康客户端v2.34 安卓最新版 - 极光下载站...
  10. 计算机网络实验一 集线器和交换机的工作原理