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

相关推荐
Brilliantwxx2 小时前
【PCB】(入门篇) 电子入门系列|从电路分析到 PCB 设计
stm32·单片机·嵌入式硬件
俊基科技9 小时前
A-59U工业级多模语音处理模块在矿山矿井通信与呼叫报警系统中的应用
嵌入式硬件·嵌入式开发·硬件开发·ai降噪·回音消除·拾音降噪
周周记笔记11 小时前
GD32F450xx MCU Datasheet 解读:硬件测试工程师的测试方法论
单片机·嵌入式硬件
一池秋_11 小时前
arm低配linux设备,桌面应用冷启动提速方法
linux·运维·arm开发
潘潘的嵌入式日记13 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机
AOI小白新手上路14 小时前
江科协51单片机16-1 AD/DA ADC 三通道综合显示(LCD1602 版)改造说明
单片机·嵌入式硬件·51单片机
HUI-47415 小时前
EG1135|SSOP‑16 同步整流降压控制器,大功率外置 MOS 降压优选
单片机·嵌入式硬件·硬件工程
单片机仿真设计15 小时前
【proteus仿真】基于 STM32 单片机恒温箱控制系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
国科安芯16 小时前
星载CAN总线通信网络中抗辐射MCU的通信可靠性设计分析
网络·人工智能·分布式·单片机·嵌入式硬件·架构
新晨单片机设计17 小时前
S003A-基于STM32单片机温度计(数码管显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·stm32单片机功能定制