自学嵌入式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中的宏定义确保可移植性

相关推荐
暮云星影2 小时前
二、linux系统 应用开发:整体Pipeline流程
linux·arm开发
物联网牛七七3 小时前
stm32内核寄存器和外设寄存器
stm32·单片机·嵌入式硬件
嗯嗯=3 小时前
STM32单片机学习篇3
stm32·单片机·学习
硅农深芯3 小时前
详解ARM Cortex-M系列常用寄存器
arm开发·芯片
梁洪飞4 小时前
通过链接文件和Start.S学习armv7
linux·arm开发·嵌入式硬件·学习·arm
m0_555762905 小时前
STM32H7 + VS Code + OpenOCD + STLink 完整配置教程
stm32·单片机·嵌入式硬件
飞来客isdn5 小时前
关于单片机与上位机串口通信的问题
单片机·嵌入式硬件·mcu
为何创造硅基生物5 小时前
STM32 串口的中断,空闲中断DMA
stm32·单片机·嵌入式硬件
youcans_5 小时前
【动手学STM32G4】(5)STM32G431之ADC采样
stm32·单片机·嵌入式硬件·adc