IMX6ULL裸机编程 - LED点灯STM32风格

IMX6ULL裸机编程 - LED点灯STM32风格

只修改了imx6ull和main.c, 其他同02.C语言LED驱动

1. 定义外设寄存器基地址和结构

imx6ull.h

#ifndef IMX6ULL_H
#define IMX6ULL_H

/* 自定义一些数据类型供库文件使用 */
#define     __I     volatile
#define     __IO    volatile

typedef unsigned    int uint32_t;

/* 外设寄存器组的基地址 */
#define CCM_BASE          (0X020C4000)
#define IOMUX_SW_MUX_BASE (0X020E0014)
#define IOMUX_SW_PAD_BASE (0X020E0204)
#define GPIO1_BASE        (0x0209C000)

/* CCM寄存器结构体定义(只保留工程所需,下同) */
typedef struct {
    uint32_t RESERVED_1[24];
    __IO uint32_t CCGR0;
    __IO uint32_t CCGR1;
    __IO uint32_t CCGR2;
    __IO uint32_t CCGR3;
    __IO uint32_t CCGR4;
    __IO uint32_t CCGR5;
    __IO uint32_t CCGR6;
} CCM_Type;

/* IOMUX寄存器组 */
typedef struct {
    uint32_t RESERVED_1[21];
    __IO uint32_t GPIO1_IO03;
} IOMUX_SW_MUX_Type;

typedef struct {
    uint32_t RESERVED_1[60];
    __IO uint32_t GPIO1_IO03;
} IOMUX_SW_PAD_Type;

/* GPIO寄存器结构体 */
typedef struct {
  __IO uint32_t DR;         /* data */
  __IO uint32_t GDIR;       /* direction */
  __I  uint32_t PSR;        /* pad status */
  __IO uint32_t ICR1;       /* interrupt config 1 */
  __IO uint32_t ICR2;       /* interrupt config 2 */
  __IO uint32_t IMR;        /* interrupt mask */
  __IO uint32_t ISR;        /* interrupt status */
  __IO uint32_t EDGE_SEL;   /* edge select */
} GPIO_Type;

/* 外设指针 */
#define CCM          ((CCM_Type *)CCM_BASE)
#define IOMUX_SW_MUX ((IOMUX_SW_MUX_Type *)IOMUX_SW_MUX_BASE)
#define IOMUX_SW_PAD ((IOMUX_SW_PAD_Type *)IOMUX_SW_PAD_BASE)
#define GPIO1        ((GPIO_Type *)GPIO1_BASE)

#endif

2. 使用结构体访问寄存器

main.c

#include "imx6ull.h"

/* 使能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;
}

/* 初始化LED对应的GPIO */
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 = (1<<12) | (2<<6) | (6<<3);

	/* 3. 初始化GPIO */
	GPIO1->GDIR |= (1<<3);

	/* 4. 设置GPIO1_IO03输出低电平,打开LED0 */
	GPIO1->DR &= ~(1<<3);
}

/* LED开关灯 */
void led_on(int flag)
{
    if (flag) {
        GPIO1->DR &= ~(1<<3);
    } else {
        GPIO1->DR |= (1<<3);
    }
}


void delay_short(volatile unsigned int n)
{
	while (n--) {
    }
}

void delay_ms(volatile unsigned int ms)
{
	while (ms--) {
        /* 在396Mhz的主频下, 延时时间大约为1ms */
		delay_short(0x7ff);
	}
}

int main(void)
{
	clk_enable();
	led_init();

	while(1) {
		led_on(0);
		delay_ms(500);

		led_on(1);
		delay_ms(500);
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值