参考正点原子开发指南
根据原理图可以看出,我们需要设置低电平导通电路。
在原理图上找到LED0,对应IO为GPIO3
IO复用配置
IMX6UL每个引脚都可以复用
在用户手册第30章可以找到IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03这个寄存器,地址为0x020E0068,只用到了低五位,其中前四位为功能引脚,第五位为强制功能引脚(会覆盖前面四位的配置),每个引脚都有专属的强制功能。
IO属性配置
在第30章同一节后面,还有一个中间是PAD的寄存器
它是用来配置我们IO的属性,包括压摆速率、驱动能力等。
这个寄存器只用到了低17位。
HYS:用来使能迟滞比较器,如果需要对输入波形进行整形的话可以使能此位。
PUS:设置上下拉电阻
PUE:当IO作为输入的时候,这个位用来设置IO使用上下拉还是状态保持器。当为0的时候使用状态保持器,当为1的时候使用上下拉。状态保持器在IO作为输入的时候才有用,顾名思义,就是当外部电路断电以后此IO口可以保持住以前的状态。
ODE:当IO作为输出的时候,此位用来禁止或者使能开路输出(0禁止 1使能)
SPEED:IO输出时速度
DSE:IO输出时,设置IO驱动能力
SRE:设置压摆率(IO高低电平跳变所需时间),0低(慢) 1高(快)
寄存器
先看IO框图
地址如图
DR:数据寄存器(一共32位),一个GPIO组最大32个IO,输出模式每个控制一个IO的(高低电平),输出模式就存着每个IO的电平状态
GDIR:方向寄存器,设置IO的输入输出。(0:input 1:output)
PSR:状态寄存器·,读取高低电平,和输入状态的DR寄存器1一样
ICR1、ICR2:中断控制寄存器,ICR1用于配置低16位,ICR2配置高16位
IMR:中断屏蔽寄存器,,用于控制中断的禁止与使能(1使能 0禁止)
ISR:中断标志寄存器,哪个IO发生了中断,ISR寄存器中相应的值就会被置为1。当想清除标志位
时候,向相应位写1就行
EDGE_SEL:设置边沿中断,这个寄存器会覆盖ICR1和ICR2的设置,同样是一个GPIO对应一个位。如果相应的位被置1,那么就相当与设置了对应的GPIO是上升沿和下降沿(双边沿)触发
时钟
IMX6UL的每个外设都有单独的时钟,可以独立使能或禁止。
在用户手册第18章找到对应时钟寄存器
我们只需要设置CCM_CCGR2的26-27位为11即可打开对应时钟。
我们需要一下几步:
①、使能GPIO对应的时钟。
②、设置寄存器IOMUXC_SW_MUX_CTL_PAD_XX_XX,设置IO的复用功能,使其复用为GPIO功能。
③、设置寄存器IOMUXC_SW_PAD_CTL_PAD_XX_XX,设置IO的上下拉、速度等等。
④、第②步已经将IO复用为了GPIO功能,所以需要配置GPIO,设置输入/输出、是否使用中断、默认输出电平等。
#include "led.h"
void led_init(void)//GPIO1_io3
{
//init -> clock
CCM_CCGR2 &= ~(0x3 << 26);
CCM_CCGR2 |= (0x3 << 26);
//复用GPIO3
MUX_GPIO3 = (0x5 << 0);
//GPIO3 -> OUTPUT_ENABLE
PAD_GPIO3 |= (0x1 << 11);
GPIO1_GDIR |= (0x1 << 3);
GPIO1_DR = 0x0;
}
void led_on(void)
{
GPIO1_DR &= ~(0x1 << 3);
}
void led_off(void)
{
GPIO1_DR |= (0x1 << 3);
}
void delay_short(volatile unsigned int n)
{
while(n--);
}
void delay_us(volatile unsigned int n)
{
while(n--)
{
delay_short(0x7ff);
}
}
int main()
{
led_init();
while(1)
{
led_on();
delay_us(1000);
led_off();
delay_us(1000);
}
return 0;
}