GPIO实验

一、GPIO简介

GPIO(General-purpose input/output)即通用型输入输出,GPIO可以控制连接在其之上的引脚实现信号的输入和输出

芯片的引脚与外部设备相连,从而实现与外部硬件设备的通讯、控制及信号采集等功能

实验步骤

    1. 通过电路原理图分析LED的控制逻辑 

    2. 通过电路原理图查找LED与Exynos4412的连接关系

    3. 通过数据手册分析GPIO中哪些寄存器可以控制LED

    4. 通过程序去操控对应的寄存器完成对LED的控制

二、GPIO寄存器分析

高电平导通,低电平截至

 

 

 

 输出嘛,肯定就是Output模式GPX2CON【7】=0x1

 输出高电平就对应位写1,输出低电平就对应位写0

 控制上下拉,点灯暂时用不到。

 设置驱动能力,点灯暂时也用不到,本来就使用了一个三极管当开关,点灯够用了。

 

三、GPIO编程

预处理->编译->汇编->链接

gcc -E

gcc -S

gcc -c

gcc

链接使用的工具是ld, .elf是Linux可执行文件的后缀

-Ttext 0x40005000  是将程序放到内存上,保证程序可以执行。

交叉编译工具链在32位ubuntu上可以正常使用,但是在64位的需要执行这样一条命令

sudo apt-get install lib32z1 lib32ncurses

 

 先rm掉报错的文件,然后

sudo apt update

 

好家伙和我套娃呢

sudo rm /var/lib/apt/extended_states 

然后在

sudo apt update

 E: Unable to locate package lib32ncurses5

  TARGET = LED-ASM
  CROSS_COMPILE = arm-none-linux-gnueabi-
  CC = $(CROSS_COMPILE)gcc
  LD = $(CROSS_COMPILE)ld
  OBJCOPY = $(CROSS_COMPILE)objcopy
  
  all:
          $(CC) -c $(TARGET).s -o $(TARGET).o
          $(LD) $(TARGET).o -Ttext 0x40005000 -o $(TARGET).elf
         $(OBJCOPY) -O binary -S $(TARGET).elf $(TARGET).bin
 
  clean:
         rm $(TARGET).o $(TARGET).elf $(TARGET).bin

   1 
  2 .text
  3 _start:
  4 
  5 LED_CONFIG:
  6         LDR R2, =0x11000c40
  7         LDR R1, =0x10000000
  8         STR R1, [R2]
  9 
 10 LED_ON:
 11         LDR R2, =0x11000c44
 12         LDR R1, =0x00000080
 13         STR R1, [R2]
 14         B STOP
 15 
 16 LED_OFF:
 17         LDR R2, =0x11000c44
 18         LDR R1, =0x00000000
 19         STR R1, [R2]
 20 
 21 STOP:
 22         B STOP
 23 .end

然后把编译好滴.bin文件传给我们的开发板

 

 

 

go 0x40008000 

成功点亮LED2

四、LED实验

现在写个程序让LED2闪烁

.text
_start:

MAIN:
    BL LED_CONFIG
LOOP:
    BL LED_ON
    BL DELAY
    BL LED_OFF
    BL DELAY
    B LOOP 

LED_CONFIG:
    LDR R2, =0x11000c40
    LDR R1, =0x10000000
    STR R1, [R2]
    MOV PC, LR

LED_ON:
    LDR R2, =0x11000c44
    LDR R1, =0x00000080
    STR R1, [R2]
    MOV PC, LR

LED_OFF:
    LDR R2, =0x11000c44
    LDR R1, =0x00000000
    STR R1, [R2]
    MOV PC, LR
DELAY:
    LDR R1, =100000000
L:
    SUB R1, R1, #1
    CMP R1, #0
    BNE L
    MOV PC, LR    

STOP:
    B STOP
.end

运行一下没啥毛病。

本来想写个流水灯来着,太麻烦了,再写个LED3闪烁吧,等以后用C写

 

 

 

 

 

 

 

.text
_start:

MAIN:
    BL LED_CONFIG
LOOP:
    BL LED_ON
    BL DELAY
    BL LED_OFF
    BL DELAY
    B LOOP 

LED_CONFIG:
    LDR R2, =0x11000c20
    LDR R1, =0x00000001
    STR R1, [R2]
    MOV PC, LR

LED_ON:
    LDR R2, =0x11000c24
    LDR R1, =0x00000001
    STR R1, [R2]
    MOV PC, LR

LED_OFF:
    LDR R2, =0x11000c24
    LDR R1, =0x00000000
    STR R1, [R2]
    MOV PC, LR
DELAY:
    LDR R1, =100000000
L:
    SUB R1, R1, #1
    CMP R1, #0
    BNE L
    MOV PC, LR    

STOP:
    B STOP
.end

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
GPIO实验报告全文共3页,当前为第1页。GPIO实验报告全文共3页,当前为第1页。GPIO实验 GPIO实验报告全文共3页,当前为第1页。 GPIO实验报告全文共3页,当前为第1页。 实验目的 掌握GPIO 口基本寄存器的使用,掌握如何将GPIO 作为输出口。 初步了解如何使用C 语言编写飞思卡尔单片机程序。 实验器材 MC9S12XSMAA开发板 USBDM下载器 计算机一台 实验电路 开发板LED实验电路 GPIO实验报告全文共3页,当前为第2页。GPIO实验报告全文共3页,当前为第2页。实验原理 GPIO实验报告全文共3页,当前为第2页。 GPIO实验报告全文共3页,当前为第2页。 开发板上有8个发光二极管,每个发光二极管串联一个限流电阻,用单片机的PB口控制发光二极管的两灭状态,PB口的管脚置1时,发光二极管熄灭,PB口清零时,发光二极管点亮。 程序代码 #include <hidef.h> /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ #define LED PORTB //定义LED为PB端口 #define LED_dir DDRB //定义LED_dir为DDRB寄存器,控制输入/输出 unsigned char data=0x01; void delay(void) //延时函数 { unsigned int i,j; for(j=0;j<2;j++) for(i=0;i<60000;i++) ; } void main(void) { DisableInterrupts; //关闭中断 LED_dir=0xff; //设置为输出,0xff即为1111 1111,设定为输出 LED=~data; //点亮LED1 GPIO实验报告全文共3页,当前为第3页。GPIO实验报告全文共3页,当前为第3页。EnableInterrupts; //打开中断 GPIO实验报告全文共3页,当前为第3页。 GPIO实验报告全文共3页,当前为第3页。 for(;;) //主循环 { delay(); //延迟 data=data<<1; //左移一位 if(data==0) //向左移动16位之后,重置data data=0x01; LED = ~data; //点亮LED } } 实验步骤 1. 将BDM下载器链接到开发板上。 2. 打开代码程序"LED"。 3. 点击Debug按钮,将源代码下载到单片机中,进入调试窗口。 4. 点击窗口的Start按钮,程序开始执行。 5. 观察实验现象。 实验结果 开发板中发光二极管从D1,D2,D3,D4,D5,D6,D7,D8依次闪烁,和预期实验现象相符。 GPIO实验报告

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇努力学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值