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,通过其原理图,
可得到信息,它的另一端是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)设置栈,
这条语句的意思有些不懂,为什么这样就是设置栈了,猜想:栈是向下生长的,将SP指针指向最高地址,压栈时就向下压,但是后面说的不能大于4K,可能就是因为,当前没有初始化SDRAM,内存的访问也只有片内的SRAM,而SRAM的大小最大也就是4K
C)跳入main函数
(4).C中要做的,就是简单的位操作设置值了
(5)后面同上
三、C程序通过按键电灯
(1)看板子上的按键,标的是EINT0,原理图中搜索EINT0
由电路图知道,当不按下的时候,为高电平,当按下,就变成低电平。
我想要知道是否按下,肯定需要知道寄存器中的值,所以应该是设置为输入。
所以可以确定,要设置它的控制器为输入,然后娶他的数据寄存器的值,
(2)用上边的方法查询到了按键和灯的各个地址,
(3)编写C程序,
(4)剩下的同上