ARM学习笔记6-裸机之GPIO-LED

1 .裸机程序开发所需的软硬件环境和常用软件工具
1.1. 硬件环境
  • 九鼎创展科技X210开发板(s5pv210)如下图
    这里写图片描述
  • 硬件特性:
    • 内核:ARM Cortex-A8 1GHz
    • 主频:1GHz;
    • 内存:512MB DDR2
    • Flash:4GB inand
1 .2. 软件环境
  • 操作系统

    • Win7 X32\x64(宿主机)
    • Ubuntu14.04(虚拟机)
  • 交叉编译工具链

    • ARM-2009q3(三星官方编译器)
  • 管理工程Makefile
    • (详细参考Makefile相关书籍)
  • 1.2.4. SecureCRT
    • (远程登入Ubuntu14.04,用来做终端交互软件,后续也做串口终端软件)
1.3.裸机程序烧录方式
  • 1.3.1. USB方式
    • DNW v0.60c软件(三星官方工具)
  • 1.3.2. SD卡方式
    • X210_Fusing_Tool.exe(九鼎官方烧入工具) Windows
    • nand_fusing.sh (三星官方烧入脚本) linux
2.裸机之GPIO点亮LED
2.1.点亮LED的开发步骤
  • 1. 分析硬件电路

    目的为了知道LED在开发板上的实际连接方式和LED正常工作所需要的条件

  • 2. 分析SOC的datasheet中相关寄存器

    目的为了想要点亮LED,如何用软件去控制SOC中的接口设备帮忙点亮LED

  • 3. 编写控制程序(源码)并用交叉编译工具生成二进制烧录文件

    参考对应寄存器配置方式编写点亮LED的步骤

  • 4. 选择合适的烧录方式把程序烧入到开发板中运行

    验证编写的程序是否能让LED正确地工作起来

2.2. 分析硬件原理图
  • 2.2.1. 硬件连接方式如下图
    这里写图片描述
    这里写图片描述

    从原理图上可知LED都接在SOC的GPIO接口上,其中LED1~LED3接在GPJ0端口上,LED4接在GPD0端口上

  • 2.2.2. LED工作条件

    根据LED器件的物理特性可知LED要正常工作必须要一个合适的电压差(正极到负极),从原理图中可知LED正极接电源VDD_IO,负极接GPIO,所以只要让GPIO端口形成电压差就可以了.

2.3. 分析SOC的datasheet
  • 2.3.1. GPIO接口的相关寄存器

    从SOC的datasheet中可知GPJ0、GPD0端口都有六个寄存器,如下图
    这里写图片描述
    这里写图片描述

端口
GPD0:GPD0CONGPD0DATGPD0PUDGPD0DRVGPD0CONPDNGPD0PUDPDN
GPJ0:GPJ0CONGPJ0DATGPJ0PUDGPJ0DRVGPJ0CONPDNGPJ0PUDPDN
  • 2.3.2. 配置对应端口的寄存器

    从SOC的datasheet中可知,这六个寄存器的作用如下

寄存器名字功能
GPD0CON:(模式寄存器)引脚功能
GPD0DAT:(数据寄存器)引脚输入或输出的数据
GPD0PUD:(上下拉寄存器)
GPD0DRV:(驱动能力寄存器)
GPD0CONPDN:(功耗相关寄存器)
GPD0PUDPDN:(功耗相关寄存器)

要点亮LED我们只需要用到模式寄存器和数据寄存器,把模式寄存器配置成输出模式,并向数据寄存器写入对应的数据

2.4. 编写控制程序
  • 2.4.1. 根据任务需求编写让LED工作的步骤

    第一步:设置引脚模式为输出模式(向GPxCON寄存器写入0001)
    第二步:写入控制的数据(向GPxDAT寄存器写入0输出低电平,1输出高电平)

  • 2.4.2. 用汇编语言实现上述步骤,程序如下

/**********************************************
 *  文件名:   gpip_led.S
 *  作   者:  X_X_X
 *  日   期:  2017-6-29 23:02
 *  功   能:  用GPIO点亮4颗LED(效果4颗同时闪烁)
 **********************************************/

 #define GPJ0CON     0xE0200240         // 定义相关寄存器地址的宏
 #define GPJ0DAT     0xE0200244
 #define GPD0CON     0xE02000A0
 #define GPD0DAT     0xE02000A4

.globl _start                           //.globl 把_start符号声明为外部链接属性

_start:
    ldr r0, =GPJ0CON
    ldr r1, =0x00111000                 //配置GPJ0端口为输出模式(pin 3 pin 4 pin 5 )
    str r1, [r0]

    ldr r0, =GPD0CON
    ldr r1, =0x0010                     //配置GPD0端口为输出模式(pin 1 )
    str r1, [r0]

blink:  
    ldr r0, =GPJ0DAT
    ldr r1, =0x38                       //熄灭 LED1 LED2 LED3(b0011 1000)
    str r1, [r0]    
    ldr r0, =GPD0DAT
    ldr r1, =0x2                        //熄灭 LED4(b0010)
    str r1, [r0]    

    bl delay                            //延时

    ldr r0, =GPJ0DAT
    ldr r1, =0x0                        //点亮 LED1 LED2 LED3
    str r1, [r0]    
    ldr r0, =GPD0DAT
    ldr r1, =0x0                        //点亮 LED4
    str r1, [r0]

    bl delay                            //延时

    b blink                             //闪烁

    b .

delay:                                  //延时函数
    ldr r2, =9000000                    //循环初始化
    ldr r3, =0x0
loop:
    sub r2, r2, #1
    cmp r2, r3              
    bne loop
    mov pc, lr                          //函数返回, lr保存了进入函数之前的执行地址
  • 2.4.3. 编译源程序得到二进制烧录文件
    在SecureCRT终端中执行make编译指令并得到二进制gpio_led_usb.bin文件,如下图
    这里写图片描述
2.5 烧入程序验证
  • 用DNW软件把二进制.bin文件发送到开发板的0xd0020010地址上执行,效果如下
    这里写图片描述

    最终闪烁效果
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值