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

相关推荐
逐步前行1 天前
STM32_TIM_寄存器操作
stm32·单片机·嵌入式硬件
0南城逆流01 天前
【STM32】知识点介绍七:PWM功能
stm32·单片机·嵌入式硬件
智者知已应修善业1 天前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
我是一棵无人问荆的小草1 天前
单片机通电后延迟启动策略
单片机·嵌入式硬件
坏柠1 天前
ESP32-S3 蓝牙 BLE 从零到一:广播、服务、特征,用一个智能灯的例子全讲透
嵌入式硬件
日更嵌入式的打工仔1 天前
UART RX为什么要上拉
单片机
三佛科技-187366133971 天前
FT32F030F6AP7高性能32位RISC内核MCU解析(兼容STM32F030K6TP7)
stm32·单片机·嵌入式硬件
LCMICRO-133108477461 天前
长芯微LDC90810完全P2P替代ADC128D818,是一款八通道系统监控器,专为监控复杂系统状态而设计。
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换芯片adc
嵌入式老菜鸟qq1252427731 天前
关于S2-LP休眠
单片机·嵌入式硬件·mcu·射频工程
SUNNYSPY0011 天前
65R310-ASEMI超结MOS管TO-252封装
单片机