方式1:使用引脚输出3.3v点亮LED,输出0v熄灭LED。
方式2:使用引脚拉低到0v点亮LED,输出3.3v熄灭LED。
有些情况下,如引脚输出能力不足,省电等原因,使用三极管驱动。
方式3:使用引脚输出1.2v驱动三极管点亮LED,输出0v熄灭LED。
方式4:使用引脚输出0v点亮LED,输出1.2v熄灭LED。
从软件控制的角度讲,有输出高点压驱动LED,也有输出低电压驱动LED的。具体要看
电路设计。
2、GPIO的一般结构
有很多组GPIO,每组有多个GPIO
GPIO需要设置对应的时钟
GPIO需要设置对应的模式,一般可以用作很多功能
GPIO需要实则知对应的方向,输入还是输出
GPIO需要设置数值,输出的高低电平,输入则从寄存器读取数值。
3、普通的GPIO设置方法
芯片一般有相关的章节,来介绍Clock 和 Power、GPIO功能。
有对应的寄存器来设置引脚的功能模式。 一个引脚可以用于GPIO、串口、USB等其他功能。
有对应的寄存器来设置GPIO的使能。1
对于已经设置为GPIO功能的引脚,有方向寄存器设置它的方向:输出、输入。
对于已经设置为GPIO功能的引脚,有数据寄存器来写、都引脚电平状态。
4、GPIO寄存器的操作方法
寄存器有两种操作方法,主要的原则是不能影响到其他位。
直接读写:读出对应寄存器、修改对应的位、写入寄存器。
val = data_reg
val = val | (1 << n);
data_reg = val;
set - and - clear protocol:
set_reg、clr_reg、data_reg三个寄存器对应的是同一个物理寄存器。
要设置bit n: set_reg = (1 << n);
要清除bit n:clr_reg = (1 << n);
5、3288的GPIO操作方法
5.1 怎么写LED驱动程序?
看原理图,确定引脚位置,确定引脚要输出什么电平才能点亮LED,反之亦然。
看芯片手册,确定寄存器操作方法:涉及到哪些寄存器?哪些位?寄存器地址是什么?2
编写驱动:先写框架,再写硬件操作的代码。
5.2 3288原理图
GPIO:General-Purpose Input/Output,通用的输入输出口
CRU:Clock & Reset Unit,使用和复位单元 通过CRU使能某一个GPIO模块
PMU:Power Managerment Unit,
电源管理单元 有设置GPIO0的功能寄存器
GRF:General Register Files,通用寄存器文件 设置GPIO1~8的功能寄存器
板上的晶振时钟通过,GENERAL PLL倍频,通过选择器进入GeNERAL_MUX_CLK。GENERAL_MUX_CLK通过分频,一路给了PD_ALIVE,一路给了PD_PMU。PD_ALIVE提供GPIO1~8的时钟,PD_PMU提供GPIO0的时钟。
基地址:在手册里overwrite里,有各个模块的memory map,里面有各个模块的基地址。
5.3 3288寄存器手册
想要驱动3288的led,就应该去找芯片手册上对应的章节来看。需要学习三个章节(CRU、PMU、CRF、GPIO)才能有一个整体的认识。
3288 分为GPIO0 ~ 8 9组 的GPIO0
小组里面有A0 ~ A7、B0 ~ B7、C0 ~ C7 、 D0 ~ D7每一组有32个GPIO pin。
每一组的GPIO有Data 寄存器、Data Dir 寄存器、Ext Data寄存器。
当需要使用GPIO时,xxx寄存器设置方向寄存器输出或输入, xxx寄存器设置点位,xxx寄存器设置其他复用功能。
有些芯片的GPIO是没有使能GPIO模块的。
在芯片手册中确定的寄存器地址被称为物理地址,在Linux内核中无法直接使用。需要使用内核提供的ioremap把物理地址映射成虚拟地址。
工作中如果要找时钟,我觉得应该从下面找起,依次按着名字往上找。
原作者:习惯就好zz