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

来源:互联网 发布:男生丁丁知乎 编辑:程序博客网 时间:2024/05/17 21:51

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: GPD0CON GPD0DAT GPD0PUD GPD0DRV GPD0CONPDN GPD0PUDPDN GPJ0: GPJ0CON GPJ0DAT GPJ0PUD GPJ0DRV GPJ0CONPDN GPJ0PUDPDN
  • 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, =0x0loop:    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地址上执行,效果如下
    这里写图片描述

    最终闪烁效果