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);
}
}
634

被折叠的 条评论
为什么被折叠?



