自学嵌入式day49,arm led、蜂鸣器和bsp

根据您提供的嵌入式开发流程,以下是结构化整理后的内容:

1. SDK文件管理

  • 存放路径IMAX6ULL/SDK/
  • 使用方式
    • SDK仅需头文件(无需完整IDE)
    • 完整开发工具需额外设备(下载器/仿真器)

2. 新建工程步骤

  1. 创建目录:led_sdk

  2. 拷贝基础文件:

    bash 复制代码
    cp led_c/start.S led_sdk/
    cp led_c/main.c led_sdk/
    cp led_c/Makefile led_sdk/
  3. 添加SDK头文件:

    bash 复制代码
    cp SDK/*.h led_sdk/

3. 基于SDK的LED驱动实现

关键头文件:GPIO_Type.h(定义GPIO寄存器结构)
c 复制代码
// 时钟初始化
void clock_init(void) {
    CCM->CCGR0 = 0xFFFFFFFF;
    /* 其余CCGRx寄存器同理 */
}

// LED初始化
void led_init(void) {
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);
    IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0x10B0);
    GPIO1->GDIR |= (1 << 3); // 设置GPIO1_IO03为输出模式
}

// LED控制函数
void led_ctrl(uint8_t state) {
    state ? (GPIO1->DR &= ~(1 << 3)) : (GPIO1->DR |= (1 << 3));
}

4. 模块化设计

  • LED模块

    c 复制代码
    // led.h
    void led_init(void);
    void led_on(void);
    void led_off(void);

5. 蜂鸣器驱动实现

c 复制代码
// beep.c
void beep_init(void) {
    // 配置GPIO为输出模式(以GPIO1_IO04为例)
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO04_GPIO1_IO04, 0);
    GPIO1->GDIR |= (1 << 4);
}

void beep_switch(bool enable) {
    enable ? (GPIO1->DR &= ~(1 << 4)) : (GPIO1->DR |= (1 << 4));
}

6. BSP工程目录结构

复制代码
project/
├── main.c
├── start.S
imx6ull/
├── cc.h
├── fsl_iomuxc.h      // IOMUX控制器头文件
├── MCIMX6Y2.h        // 芯片寄存器定义
bsp/
├── led/
│   ├── led.c
│   └── led.h
├── beep/
│   ├── beep.c
│   └── beep.h
Makefile

7. 链接脚本优化

lds 复制代码
/* imx6ull.lds */
SECTIONS {
    . = 0x87800000;
    .text : {
        obj/start.o
        *(.text)
    }
    .rodata ALIGN(4) : { *(.rodata*) }
    .data ALIGN(4) : { *(.data) }
    
    . = ALIGN(4);
    __bss_start = .;
    .bss : { *(.bss) *(.COMMON) }
    __bss_end = .;
}

8. Makefile递归编译示例

makefile 复制代码
CROSS_COMPILE = arm-linux-gnueabihf-
CC = $(CROSS_COMPILE)gcc

SUBDIRS = project imx6ull bsp/led bsp/beep

all: $(SUBDIRS)
    $(CC) -T imx6ull.lds -o led_sdk.elf $^

$(SUBDIRS):
    $(MAKE) -C $@

关键说明

  1. 启动代码需在start.S中清除.bss段:

    assembly 复制代码
    ldr r0, =__bss_start
    ldr r1, =__bss_end
    mov r2, #0
    clear_bss:
        cmp r0, r1
        strlo r2, [r0], #4
        blo clear_bss
  2. 寄存器操作使用fsl_iomuxc.h中的宏定义确保可移植性

相关推荐
jllllyuz4 分钟前
ESP32开发-迷你掌上平衡车miniBot完整开发指南
单片机·嵌入式硬件
不爱吃大饼15 分钟前
WeMos开发板
单片机·嵌入式硬件
三佛科技-1341638421217 分钟前
LP3799FAC/LP3799FBC--非标60W(24V2.5A)电源芯片恒压恒流方案分析(电路图,PCB设计)
嵌入式硬件·物联网·智能家居·pcb工艺
雅斯驰22 分钟前
BMS、电机控制、医疗设备:ISO1540DR的I²C隔离应用版图
单片机·嵌入式硬件
xiangw@GZ28 分钟前
芯片失效分析:EM电迁移导致的BUCK输出失效
嵌入式硬件
yuan1999736 分钟前
温度传感器VC++串口通信程序(与51单片机通讯)
stm32·单片机·嵌入式硬件
皮皮哎哟39 分钟前
ARM驱动基础(基于正点原子IMX6ULL Mini)
arm开发·linux内核·imx6ull·nxp·正点原子、·imx6u mini
somi744 分钟前
ARM-驱动-03 Linux 字符设备驱动开发
linux·arm开发·驱动开发·自用
somi71 小时前
ARM-驱动-01Linux系统移植
arm开发
LCMICRO-133108477461 小时前
国产长芯微LDC4048完全P2P替代DAC128S085,是一款 8 通道、带输出放大器的数模转换器 (DAC)
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·数模转换器dac