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

相关推荐
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11013 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元3 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133973 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315203 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
Alaso_shuang3 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟3 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126913 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315203 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机
星马梦缘3 天前
驱动层开发——蜂鸣器驱动
stm32·单片机·嵌入式硬件·hal·驱动