一、文件说明与关系
文件层次结构:
├── cc.h # 基础数据类型定义
├── core_ca7.h # Cortex-A7内核寄存器定义
├── fsl_common.h # 飞思卡尔通用定义
├── MCIMX6Y2.h # i.MX6Y2芯片外设寄存器定义
├── fsl_iomuxc.h # i.MX6 IO复用配置
二、详细技术笔记
1. cc.h - 编译器适配与数据类型定义
#ifndef __CC_H
#define __CC_H
/*
* 自定义一些数据类型供库文件使用
*/
#define __I volatile // 只读 volatile
#define __O volatile // 只写 volatile
#define __IO volatile // 读写 volatile
// C99标准整数类型定义
typedef signed char int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
// 简化的类型定义(常用于嵌入式)
typedef signed char s8;
typedef signed short int s16;
typedef signed int s32;
typedef signed long long s64;
typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned int u32;
typedef unsigned long long u64;
#endif
作用解释:
-
跨编译器兼容性:为不同编译器提供统一的数据类型定义
-
volatile修饰符:防止编译器优化对硬件寄存器的访问
-
简化类型名 :使用
u8、u32等简化表示,提高代码可读性 -
嵌入式系统适配:确保在无标准库的嵌入式环境中正常使用
2. core_ca7.h - Cortex-A7内核编程接口
#ifndef __CORTEX_CA7_H
#define __CORTEX_CA7_H
#include <stdint.h>
#include <string.h>
// 内联函数属性定义
#define FORCEDINLINE __attribute__((always_inline))
#define __ASM __asm // GNU C语言内嵌汇编关键字
#define __INLINE inline // GNU内联关键字
#define __STATIC_INLINE static inline
// 内存映射IO修饰符
#define __IM volatile const /* 只读 */
#define __OM volatile /* 只写 */
#define __IOM volatile /* 读写 */
关键特性:
A. 内联汇编宏
#define __MCR(coproc, opcode_1, src, CRn, CRm, opcode_2) \
__ASM volatile ("MCR " __STRINGIFY(p##coproc) ", " __STRINGIFY(opcode_1) ", " \
"%0, " __STRINGIFY(c##CRn) ", " __STRINGIFY(c##CRm) ", " \
__STRINGIFY(opcode_2) \
: : "r" (src) )
-
MCR指令:从ARM寄存器写入协处理器寄存器
-
MRC指令:从协处理器寄存器读取到ARM寄存器
-
用于直接操作CP15系统控制协处理器
B. 关键寄存器联合体定义
/* CPSR寄存器 - 当前程序状态寄存器 */
typedef union {
struct {
uint32_t M:5; /* 处理器模式位 */
uint32_t T:1; /* Thumb执行状态位 */
uint32_t F:1; /* FIQ中断屏蔽位 */
uint32_t I:1; /* IRQ中断屏蔽位 */
uint32_t A:1; /* 异步中止屏蔽位 */
uint32_t E:1; /* 字节序位 */
// ... 其他位域
} b;
uint32_t w; /* 整个32位字访问 */
} CPSR_Type;
C. CP15协处理器寄存器
-
SCTLR - 系统控制寄存器:控制MMU、缓存、对齐检查等
-
ACTLR - 辅助控制寄存器:处理器特定配置
-
CPACR - 协处理器访问控制寄存器:控制NEON/VFP访问
-
TTBR0/TTBR1 - 转换表基址寄存器:MMU页表地址
-
VBAR - 向量表基址寄存器:异常向量表地址
D. GIC(通用中断控制器)接口
typedef struct {
uint32_t RESERVED0[1024];
__IOM uint32_t D_CTLR; /* 分发器控制寄存器 */
__IM uint32_t D_TYPER; /* 中断控制器类型寄存器 */
// ... 其他GIC寄存器
} GIC_Type;
提供的API函数:
-
GIC_Init()- 初始化GIC控制器 -
GIC_EnableIRQ()- 使能指定中断 -
GIC_AcknowledgeIRQ()- 读取中断号并确认 -
GIC_DeactivateIRQ()- 完成中断处理
3. fsl_common.h - 飞思卡尔SDK通用定义
#ifndef _FSL_COMMON_H_
#define _FSL_COMMON_H_
#include "cc.h" // 包含基础类型定义
/* 状态码构造宏 */
#define MAKE_STATUS(group, code) ((((group)*100) + (code)))
/* 驱动版本号构造 */
#define MAKE_VERSION(major, minor, bugfix) (((major) << 16) | ((minor) << 8) | (bugfix))
/* 调试控制台类型定义 */
#define DEBUG_CONSOLE_DEVICE_TYPE_NONE 0U
#define DEBUG_CONSOLE_DEVICE_TYPE_UART 1U
// ... 其他设备类型
/* 状态组枚举 */
enum _status_groups {
kStatusGroup_Generic = 0, /* 通用状态码组 */
kStatusGroup_FLASH = 1, /* FLASH状态码组 */
kStatusGroup_UART = 10, /* UART状态码组 */
// ... 几十个外设状态组
};
/* 通用状态返回码 */
enum _generic_status {
kStatus_Success = MAKE_STATUS(kStatusGroup_Generic, 0),
kStatus_Fail = MAKE_STATUS(kStatusGroup_Generic, 1),
kStatus_Timeout = MAKE_STATUS(kStatusGroup_Generic, 5),
};
/* SDK统一状态类型 */
typedef int32_t status_t;
#endif
作用:
-
提供跨飞思卡尔芯片的统一API接口
-
标准化错误码和状态码系统
-
版本管理支持
-
调试控制台抽象
4. MCIMX6Y2.h - i.MX6Y2芯片外设定义(概要)
主要包含:
-
外设基地址定义:
UART1_BASE、GPIO1_BASE等 -
中断号定义:
IRQn_Type枚举 -
时钟管理单元(CCM)寄存器定义
-
GPIO寄存器结构体
-
各种外设的寄存器映射
5. fsl_iomuxc.h - IO复用配置
主要包含:
-
引脚复用控制寄存器(IOMUXC)定义
-
引脚电气属性配置(下拉、驱动强度等)
-
引脚配置宏和函数
三、 文件间依赖关系
cc.h (基础类型)
↓
fsl_common.h (通用定义)
↓
core_ca7.h (内核) MCIMX6Y2.h (芯片外设)
↓ ↓
应用程序代码
使用fsl_iomuxc.h配置引脚
四、使用流程示例
// 1. 包含必要头文件
#include "MCIMX6Y2.h" // 芯片定义
#include "fsl_common.h" // 通用定义
#include "core_ca7.h" // 内核函数
#include "fsl_iomuxc.h" // 引脚配置
// 2. 初始化系统
void SystemInit(void) {
// 设置向量表地址
__set_VBAR((uint32_t)&VectorTable);
// 初始化GIC中断控制器
GIC_Init();
// 配置系统时钟(通过CCM寄存器)
// 配置引脚复用(通过IOMUXC)
IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0);
IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x10B0);
}
// 3. 使能外设中断
void EnableUART1_IRQ(void) {
GIC_EnableIRQ(UART1_IRQn);
// 配置UART1中断优先级
GIC_SetPriority(UART1_IRQn, 5);
}
五、关键知识点总结
| 组件 | 作用 | 关键寄存器/功能 |
|---|---|---|
| Cortex-A7内核 | 处理器核心 | CPSR, SCTLR, VBAR, CP15协处理器 |
| GIC | 中断管理 | D_CTLR, C_CTLR, 优先级配置 |
| IOMUXC | 引脚复用 | 引脚功能选择、电气属性 |
| CCM | 时钟管理 | 外设时钟使能/分频 |
| fsl_common | SDK框架 | 统一状态码、版本管理 |
六、注意事项
-
volatile关键字:所有硬件寄存器访问必须使用volatile
-
内存屏障 :在关键操作后可能需要
DSB、ISB屏障指令 -
特权级别:部分寄存器只能在特权模式下访问
-
缓存一致性:DMA操作需要考虑缓存同步
-
中断延迟:GIC配置影响中断响应时间