本文和(1)只有main.c程序不一样,具体如下:
#include "imx6ul.h"
// @description : 使能I.MX6U所有外设时钟
void clk_enable(void)
{
CCM->CCGR0 = 0XFFFFFFFF;
CCM->CCGR1 = 0XFFFFFFFF;
CCM->CCGR2 = 0XFFFFFFFF;
CCM->CCGR3 = 0XFFFFFFFF;
CCM->CCGR4 = 0XFFFFFFFF;
CCM->CCGR5 = 0XFFFFFFFF;
CCM->CCGR6 = 0XFFFFFFFF;
}
void led_init(void)
{
/* 1、初始化IO复用 */
IOMUX_SW_MUX->GPIO1_IO03 = 0X5; /* 复用为GPIO1_IO03 */
/* 2、配置GPIO1_IO03的IO属性
*bit 16:0 HYS关闭
*bit [15:14]: 00 默认下拉
*bit [13]: 0 kepper功能
*bit [12]: 1 pull/keeper使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度100Mhz
*bit [5:3]: 110 R0/6驱动能力
*bit [0]: 0 低转换率
*/
IOMUX_SW_PAD->GPIO1_IO03 = 0X10B0;
/* 3、初始化GPIO */
GPIO1->GDIR = 0X0000008; /* GPIO1_IO03设置为输出 */
/* 4、设置GPIO1_IO03输出低电平,打开LED0 */
GPIO1->DR &= ~(1 << 3);
}
void led_on(void)
{
/* 将GPIO1_DR的bit3清零 */
GPIO1->DR &= ~(1<<3);
}
void led_off(void)
{
/* 将GPIO1_DR的bit3置1 */
GPIO1->DR |= (1<<3);
}
void delay_short(volatile unsigned int n)
{
while(n--){}
}
//@param - n : 要延时的ms数
void delay(volatile unsigned int n)
{
while(n--)
{
delay_short(0x7ff);
}
}
int main(void)
{
clk_enable(); /* 使能所有的时钟 */
led_init(); /* 初始化led */
while(1) /* 死循环 */
{
led_off(); /* 关闭LED */
delay(500); /* 延时500ms */
led_on(); /* 打开LED */
delay(500); /* 延时500ms */
}
return 0;
}
这是(1)中关于main.h里面各个寄存器的宏定义,然后我们在main.c里面进行了调用,但我们不可能每次都还要自己写这种,于是各个开发板商家配套了这种具有寄存器的定义文件。本次实验中的定义在 ——imx6ul.h
因此,在具体的程序中:
(自己定义寄存器)
(店家定义寄存器)
通过图片我们可以看出:自己写的寄存器版本就是一个整型指针。而店家的是结构体指针。结构体指针具有更高的代码阅读性。
其中 与等取反 表示对这个寄存器的哪个位置置0
或等 表示对这个寄存器的哪个位置置1