怎样利用am335x点亮一个led。有人看到这个题目会觉得这是不so easy么,调用个操作gpio的函数不就搞定了。然我们今天要说的是通过寄存器地址直接去控制gpio达到点亮LED。主要用于在uboot的调试过程中当系统还不能打印log时,可以用过点亮led的方法来调试。在这记录下来的另一个好处也是为了在需要时能直接拿去用就行,而不用在画时间去研究。好了闲话不说了直接上干货。
这个led接在GPIO1_16引脚上,电路如下,引脚低电平是led点亮
资料《AM335x and AMIC110 Sitara™ Processors.pdf》
第一步:配置引脚为GPIO模式(gpmc_a0和GPIO1_16引脚复用),类似于dts中pin的配置
从上面的Control_Module基地质和GPMC_A0的偏移量可以算出复用功能的寄存器地址为0x44E1 0840
可以看到通过这个寄存器可以设置引脚的上下拉及复用模式,这里查资料可以知道你模式7为通过GPIO模式。这里我们不设置上下拉;代码如下
#define CTRL_MOD_GPIO116 (*(volatile unsigned int *)0x44E10840)
CTRL_MOD_GPIO116 = 0x0f; //disable上下拉,设置模式7(GPIO)
第二步:设置GPIO 为输出低
GPIO1 基地址0x4804 C000
GPIO相关寄存器的offset
GPIO_OE为输出使能寄存器 地址为GPIO1基地址+offset = 0x4804 C134
GPIO_DATAOUT为数据输出的寄存器 地址为GPIO1基地址+offset = 0x4804 C13C
下面给出两个寄存器定义,可以看到利用32位分别代表了GPIO1_0到GPIO1_31的32个引脚。
代码如下:
#define OUT_OE_GPIO116 (*(volatile unsigned int *)0x4804C134)
#define DATA_OUT_GPIO116 (*(volatile unsigned int *)0x4804C13C)
OUT_OE_GPIO116 &= ~(1<<16);
DATA_OUT_GPIO116 &= ~(1<<16);
完整代码:
#define CTRL_MOD_GPIO116 (*(volatile unsigned int *)0x44E10840)
#define OUT_OE_GPIO116 (*(volatile unsigned int *)0x4804C134)
#define DATA_OUT_GPIO116 (*(volatile unsigned int *)0x4804C13C)
CTRL_MOD_GPIO116 = 0x0f;//0x17;
OUT_OE_GPIO116 &= ~(1<<16);
DATA_OUT_GPIO116 &= ~(1<<16);
这里顺道说一下GPIO_CLEARDATAOUT(offset=190h)和GPIO_SETDATAOUT(offset=194h)这两个寄存器。资料上说通过设置设两个寄存器也是达到设置GPIO_DATAOUT的目的GPIO_CLEARDATAOUT=1相当于GPIO_DATAOUT=0,GPIO_SETDATAOUT=1相当于GPIO_DATAOUT=1.我自己没有测试过。