今天学习的裸板驱动之GPIO实验学习心得

时间:2022-08-28 23:46:28

GPIO分成很多组今天学习的这个芯片的GPIO有GPA-GPJ个组。具体可在芯片手册中看到。

GPIO有很多寄存器,今天学习的这个芯片,他的寄存器分为以下几种类型:

  (1)端口控制寄存器

  (2)端口数据寄存器

  (3)PORT PULL-UP REGISTER               端口上拉寄存器

  (4)MISCELLANEOUS CONTROL REGISTER         混杂的控制寄存器

  (5)EXTERNAL INTERRUPT CONTROL REGISTER       外部中断控制寄存器

 以上信息在芯片手册中获得。

  接着介绍

    (1)GPIO各个组都有那些类型的寄存器。如GPA组,有控制和数据寄存器,其他类型的没有,

    (2)GPIO各个组各个寄存器的基地址。如GPACON基地址为0X255000000

    (3)GPIO各个组中的其中每个编号对应的位。如GPA1对应的位是0-1位,

    (4)位中各个值表示的意义,如GPA1对应0-1位,若0-1位为10,则表示设置它为输入,还有一些不知道表示的是什么

今天做的实验:

  一、汇编程序点一个灯

    (1)在板子上找到这个我要点的等看它标的是什么(现在这板子上面标的是D10)

    (2)进入板子的原理图,搜索D10,通过其原理图,

    今天学习的裸板驱动之GPIO实验学习心得

        可得到信息,它的另一端是nLED_1,只要它这一端输出低电平,那么灯就亮

    (2.5)那么现在得到目标,由点亮灯,变为了让nLED_1输出高电平,这就需要设置控制寄存器和数据寄存器。

    (3)接着搜索nLED_1看它接入道芯片的哪个引脚,结果发现接道的是芯片的GPF4这个GPIO管脚

    (4)由GPF4可知道信息,这个灯连接的是GPIO,并且用的是GPIO中的F组,在组中编号4

    (5)进入芯片手册,搜索GPF,得到GPF这个组的(控制寄存器)和(数据寄存器)的地址

    (6)同时也得到信息,编号为4的这个管脚对应的是8-9这两位,设置GPFCON这个基地址的寄存器的8-9这两位为01就代表输出,数据寄存器就0就代表低电平

    (7)编写用汇编语言写的代码,

    (8)把它编译成板子可以运行的二进制程序

        a)使用这个板子的交叉编译工具链arm-linux-gcc 编译成.o

        b)将.o通过arm-linux-ld -Ttext 0x0000000  led_on.o -o led_on_elf生成elf文件,其中的-Ttext 0x0000000表示的是代码段从0开始,具体还不怎么理解

        c)arm-linux-objcopy -O binary -S led_on_elf led_on.bin将他转换成板子上能运行的.BIN的二进制文件

    (9)通过昨天搭建的开发环境,将他通过网络下载,放到NAND FLASH上的BOOT LOADER分区,

    (10) 播码NAND启动

  二、C语言程序电灯

    (1)分析:C程序电灯,不可能只写一个C程序,因为C程序的执行,需要条件,比如最基本的栈必须要有,所以得写一个汇编程序,为C语言的加入提供条件。

    (2)创建两个文件,一个.S,一个.C

      .S文件目的是做调用C程序之前的一些初始化操作,为C程序的加入提供条件

      .C文件的目的就是点亮灯。

    (3).S文件中要做的

        a)关调看门狗,因为不关的话,程序运行3秒看门狗就要重启系统,上面那个实验没关看门狗,也不知道灯会不会闪,不管了,这不是重点,

        b)设置栈,

        今天学习的裸板驱动之GPIO实验学习心得

          这条语句的意思有些不懂,为什么这样就是设置栈了,猜想:栈是向下生长的,将SP指针指向最高地址,压栈时就向下压,但是后面说的不能大于4K,可能就是因为,当前没有初始化SDRAM,内存的访问也只有片内的SRAM,而SRAM的大小最大也就是4K

        C)跳入main函数

    (4).C中要做的,就是简单的位操作设置值了

    (5)后面同上

  三、C程序通过按键电灯

    (1)看板子上的按键,标的是EINT0,原理图中搜索EINT0

    今天学习的裸板驱动之GPIO实验学习心得

      由电路图知道,当不按下的时候,为高电平,当按下,就变成低电平。

      我想要知道是否按下,肯定需要知道寄存器中的值,所以应该是设置为输入。

      所以可以确定,要设置它的控制器为输入,然后娶他的数据寄存器的值,

    (2)用上边的方法查询到了按键和灯的各个地址,

     (3)编写C程序,

    (4)剩下的同上