【Linux驱动开发】裸机点亮LED灯实验
实验内容
本实验使用的是正点原子I.MX6ULL开发版的汇编LED灯实验,通过GPIO1_IO03引脚输出低电平点亮小灯。
通过操作寄存器使GPIO1_IO03输出低电平包括以下几步:
1、开启时钟。
2、设置IO口的复用功能为gpio。
3、对IO进行配置,如上下拉、速度等。
4、设置GPIO1_IO03为输出。
5、向GPIO1的data register中IO03对应位写入0,使得GPIO1_IO03输出低电平。
时钟
经过测试,要想点亮小灯最少需要开启的时钟如下:
void clk_enable(void)
{
CCM_CCGR0 = 0x00000003;
CCM_CCGR1 = 0x0c0c0000;
CCM_CCGR2 = 0x00030000;
CCM_CCGR3 = 0x003c0000;
CCM_CCGR4 = 0x0000c0c0;
CCM_CCGR5 = 0x00030000;
CCM_CCGR6 = 0x00000000;
}
分别是开启以下时钟:
aips_tz1 clocks (aips_tz1_clk_enable)
gpio1 clock (gpio1_clk_enable)
sim_s clock (sim_s_clk_enable)
ipmux1 clock (ipmux1_clk_enable)
mmdc_core_aclk_fast_core_p0 clock (mmdc_core_aclk_fast_core_p0_enable)
a7 clkdiv patch clock (a7_clkdiv_patch_clk_enable)
pl301_mx6qper2_mainclk_enable (pl301_mx6qper2_mainclk_enable)
sim_cpu clock(sim_cpu_clk_enable)
sim_main clock (sim_main_clk_enable)
IO寄存器
用于设置GPIO1_IO03引脚的复用功能,写入0x5设置成GPIO功能。
HYS
:用于设置输入接收器的施密特触发器是否使能。
对施密特触发器的解释:想象你有一个开关,但这个开关不是普通的开关,它有点“迟钝”。普通的开关只要你轻轻一碰就会打开或关闭,但这个开关需要你用力推到一定程度才会打开,而且一旦打开,就算你稍微松开一点,它也不会立刻关闭,而是要保持打开状态直到你完全松开并且再往回推一点才会关闭。这个“迟钝”的开关就有点像施密特触发器或迟滞比较器。
PUS
:设置上下拉电阻。
ODE
:开启或关闭开路输出功能。
开路输出应用场景:I2C、SPI等串行通信接口。
推挽输出应用场景:数字电路的开关控制、驱动继电器、LED等负载。
SPEED
:设置IO速度。
DSE
:设置压摆率。压摆率就是IO电平跳变所需的时间,波形越陡,压摆率越好。
GPIO寄存器
每个GPIO组对应一组寄存器,本实例用到了data register寄存器和direction register寄存器。
配置引脚输入还是输出。
引脚配置成输出后,对应位写入1就输出高电平,写入0就输出低电平。