一、GPIO的 *** 作方法(参考)
二、看原理图找到一个led灯,确定引脚(搜索led)
如图所示:
① 将GPIO5_3设置为输出引脚,输出低电平有压差灯就亮,输出高电平就灭
② 将GPIO5_3设置为GPIO模式需要 *** 作的寄存器是SNVS_TAMPER3
三、查看imx6ull的芯片手册
1.打开CCM (clock controller module) :其中各种子模块中有GPIO模块
上图所示:控制每组GPIO是否使能的寄存器(imx6ull默认都是使能的)
其中CCGP1[CG15]控制的是GPIO5的是否使能
2.打开IOMUX Controller
往下划
上图显示,每一个引脚都有一个寄存器去设置其工作为什么模式
芯片手册中搜索SNVS_TAMPER3寄存器
图片中涉及:
① 该寄存器的地址(基地址+偏移地址)
② 将bit3-bit0设置为101,即可将该引脚设置为GPIO模式
3.打开GPIO章节
直接看寄存器吧:
上图:
① 第二个寄存器设置的是:输入输出模式
② 第一个寄存器设置的是:output模式:高/低电平(1/0)
③ 第三个寄存器(引脚状态寄存器)设置的是:input模式
上图为GPIOx的方向寄存器,一个bit代表一个引脚,设置为0为input输入,设置为1位output输出,另外两个寄存器类似
查看上图中的基地址:可以直接搜索该寄存器获取基地址/绝对地址
如:
四、C语言实现点灯 *** 作
1. main函数
void delay(volatile int d)
{
while(d--);
}
int main(void)
{
volatile unsigned int *pReg; /* 加上volatile是为了告诉编译器这个寄存器的 *** 作是易变的,编译器不要去优化这个寄存器 */
/* 假设我不加上这个volatile,让pReg = tmp,这条语句很有可能会编译器优化掉 */
/* 使能GPIO5 */
/* 对于imx6ull来说,GPIO5默认就是使能状态,无需 *** 作 */
/* 把GPIO5_3设置为GPIO功能 */
pReg = (volatile unsigned int *)(0x02290000 + 0x14);
*pReg |= (0x5); /* 将pReg中的内容取出来然后,将bit0和bit3位写成1 */
/* 把GPIO5_3设置为输出引脚 */
pReg = (volatile unsigned int *)(0x020AC004);
*pReg |= (1<<3);
pReg = (volatile unsigned int *)(0x020AC000);
while(1)
{
/* 设置GPIO5_3输出1 */
*pReg |= (1<<3);
delay(1000000);
/* 设置GPIO5_3输出0 */
*pReg &= ~(1<<3);
delay(1000000);
}
}
2.汇编文件代码
.text
.global _start
_start:
/* 使能GPIO5 */
/* 对于imx6ull来说,GPIO5默认就是使能状态,无需 *** 作 */
/* 把GPIO5_3设置为GPIO功能 */
LDR R0, =0x02290014
LDR R1, [R0]
ORR R1, R1, #0X5
STR R1, [R0]
/* 把GPIO5_3设置为输出引脚 */
LDR R0, =0x020AC004
LDR R1, [R0]
ORR R1, R1, #(1<<3)
STR R1, [R0]
LDR R2, =0x020AC000
Loop:
/* 设置GPIO5_3输出1 */
LDR R1, [R2]
ORR R1, R1, #(1<<3)
STR R1, [R2]
LDR R0, =1000000
BL Delay /* 当我们用BL指令来调用Delay函数的时候,LR寄存器就会保存
下一条指令的地址,当Delay函数执行完毕了,Delay函数就会将LR赋给PC,就会返回来 */
/* 设置GPIO5_3输出0 */
LDR R1, [R2]
BIC R1, R1, #(1<<3)
STR R1, [R2]
LDR R0, =1000000
BL Delay
B Loop
Delay:
SUBS R0, R0, #1
BNE Delay
MOV PC, LR
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)