IMX6LL| C环境和SDK配置

举报
白茶加冰 发表于 2023/09/23 22:57:39 2023/09/23
【摘要】 一.使用c语言和sdk对于 i.MX6LL 处理器,您可以使用 NXP 公司提供的 i.MX Software Development Kit (SDK) 来进行软件开发。该 SDK 提供了包括头文件、库文件和示例代码在内的开发工具和资源,旨在帮助开发者在 i.MX6LL 平台上进行应用程序的开发和调试。要获取 i.MX6LL SDK 的头文件,您可以前往 NXP 官方网站并登录到您的 N...

1.png

一.使用c语言和sdk

对于 i.MX6LL 处理器,您可以使用 NXP 公司提供的 i.MX Software Development Kit (SDK) 来进行软件开发。该 SDK 提供了包括头文件、库文件和示例代码在内的开发工具和资源,旨在帮助开发者在 i.MX6LL 平台上进行应用程序的开发和调试。

要获取 i.MX6LL SDK 的头文件,您可以前往 NXP 官方网站并登录到您的 NXP 账户。在账户登录后,您可以选择下载相关的软件开发工具。定位到适用于 i.MX6LL 的 SDK,并下载对应版本的软件包。在软件包中,您可以找到包含 i.MX6LL SDK 的头文件以及其他所需的开发工具和资源。

另外,为了更好地使用 i.MX6LL SDK,建议您查阅 NXP 官方网站提供的文档和用户指南,其中包含详细的使用说明、API 文档和示例代码,可以帮助您理解和利用 SDK 提供的功能和接口。

请注意,具体的头文件和 SDK 版本可能会因 NXP 公司发布的更新而有所变化,因此最好查阅 NXP 官方文档以获取准确的信息和最新版本的 SDK。
引入sdk头文件

目的:解决寄存器地址难查难设置

  • devices/MCIMX6Y2/MCIMX6Y2.h

    记录外设寄存器及其相关操作

  • devices/MCIMX6Y2/drivers/fsl_iomuxc.h

    记录引脚复用及其相关操作

注意

MCIMX6Y2.h注释以下头文件包含

#include "core_ca7.h"  
#include "system_MCIMX6Y2.h"   

增加以下宏定义:

#define __O  volatile
#define __IO  volatile 
#define __I  volatile const 

#define uint32_t unsigned int
#define uint16_t unsigned short
#define uint8_t unsigned char

使用C语言

i.MX6LL 处理器可以使用 C 语言进行开发。在进行 C 语言开发时,您需要具备以下环境:

  1. IDE(集成开发环境):选择适合您的开发需求的 IDE,例如 Eclipse、Visual Studio Code、Keil 等。IDE 提供代码编辑、编译、调试等功能,可大大简化开发过程。

  2. 编译器:选择支持 i.MX6LL 的 C 语言编译器。常用的编译器包括 GCC、ARM Compiler,或者是供应商提供的特定编译器。确保您选择的编译器与所使用的 SDK 版本兼容。

  3. SDK(软件开发工具包):获取 NXP 公司提供的 i.MX6LL SDK,其中包含了开发所需的头文件、库文件和示例代码等资源。SDK 还提供了针对 i.MX6LL 处理器的驱动程序和 API 接口,方便开发者进行硬件访问和功能实现。

  4. 调试器:选择适合 i.MX6LL 的调试器,例如 JTAG 等。调试器可以帮助您在开发过程中进行代码调试和性能分析。

  5. 文档和参考资料:仔细阅读 i.MX6LL 的技术文档和用户手册,了解处理器的功能和特性。此外,还可以参考 SDK 提供的示例代码和示例项目,以及网上的教程和社区讨论,以获取更多的帮助和参考资料。

在设置好以上环境后,您可以使用 C 语言编写应用程序,通过 SDK 提供的头文件和库文件调用相关的函数和接口。使用编译器将 C 代码编译为可执行文件,然后使用调试器进行调试和测试。最终,您可以将生成的可执行文件烧录到 i.MX6LL 处理器中运行。

请注意,具体的环境设置和开发步骤可能因开发工具和 SDK 版本而有所差异。建议查阅相关文档和资源,并参考 NXP 官方的开发指南和教程,以获取详细的步骤和说明。

目的:提高开发效率

bin文件组成介绍

段是程序的基本组成元素:

  • .text段:代码文本
  • .rodata段:只读变量,如const修饰的变量
  • .data段:非零的全局变量、静态变量
  • .bss:值为 0 的全局变量、静态变量
  • .comment:存放注释

准备C语言环境

  • bss段清零
  • 栈指针(sp)

裸机程序控制外设

特点:读数据手册、设寄存器值

  • 找出外设有哪些相关寄存器
  • 找出外设相关寄存器如何设置

链接脚本引入

目的:指定链接地址、起始代码在text段的位置,其他段的位置

官方资料:http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html

SECTIONS{

   . =xxx //链接起始地址
   .段名
   {
       xxx
       *(.段名)
   }
   ...
}
SECTIONS{
    . =0x80000000;
    .text ALIGN(4):
    {
        build/stars.o
        *(.text)
    }

    .rodata ALIGN(4):
    {
         *(.rodata)
    }

    .data ALIGN(4):
    {
        *(.data)
    }

    __bss_start =.;
    .bss ALIGN(4):
    {
        *(.bss)
        *(COMMON)
    }
    __bss_end =.;
}

Makefile修改

  • 兼容.s汇编文件
  • 添加编译程序命令
  • 添加sd卡烧录命令
ARCH ?= x86
ifeq ($(ARCH),x86)
   CC=gcc
else
   #CC=arm-linux-gnueabihf-gcc
   #编译生产.o文件
   CC=arm-none-eabi-gcc  
   #链接生产elf文件
   LD=arm-none-eabi-ld
   #去掉冗余的段和elf头,得到纯净的bin文件
   OBJCOPY=arm-none-eabi-objcopy
endif



#TARGET 目标生成文件名
TARGET=led
#生成目录
BUILD_DIR=build
#存放.c的目录
SRC_DIR=sources
#存放头文件文件夹
INC_DIR=include

#指定头文件目录,和模式
CFLAGS=$(patsubst %,-I%,$(INC_DIG))
#获得所有的.h文件,包含路径
INCLUDES=$(foreach dir,$(INC_DIG),$(wildcard $(dir)/*.h))
#存放所有的.c和.s文件,包含路径
SOURCES_c=$(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))
SOURCES_s=$(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.s))
#存放所有的.o文件
OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(SOURCES_c)))
OBJS+=$(patsubst %.s,$(BUILD_DIR)/%.o,$(notdir $(SOURCES_s)))
#定义额外的搜索路径
VPATH=$(SRC_DIR)

#生成纯净的文件
$(BUILD_DIR)/$(TARGET).bin:$(OBJS)
   #重定位文件链接起来,得到可执行文件(elf文件)
   $(LD) -Tscript.lds $^ -o $(BUILD_DIR)/$(TARGET).elf 
   $(OBJCOPY) -O binary $(BUILD_DIR)/$(TARGET).elf $@

#.c文件编译为.o文件
$(BUILD_DIR)/%.o:%.c $(INCLUDES)| create_build
   $(CC) -c $< -o $@ $(CFLAGS)
#.s文件编译为.o文件
$(BUILD_DIR)/%.o:%.s $(INCLUDES)| create_build
   $(CC) -c $< -o $@ $(CFLAGS)


.PHONY:clear earth create_build burn

clear:
   rm -rf $(BUILD_DIR)

earth:
   . /etc/profile

create_build:
   mkdir -p $(BUILD_DIR)

burn:
   cp $(BUILD_DIR)/$(TARGET).bin /home/hq/SDK/download_tool
   cd /home/hq/SDK/download_tool && ./mkimage.sh $(TARGET).bin

star.s

.global _start

_start:

@设置栈地址为64M,OX80000000-0XA0000000(512M)

ldr sp,=0x84000000 

@跳转main函数
b main

main.c

#include "../include/MCIMX6Y2.h"
#include "../include/fsl_iomuxc.h"

/*简单延时函数*/
void delay(uint32_t count)
{
    volatile uint32_t i = 0; //volatile 防止被优化
    for (i = 0; i < count; ++i)
    {
        __asm("NOP"); //__asm内嵌汇编代码,NSP空指令
    }
}

int main(int argc, char const *argv[])
{

    //1.使能CCGR1时钟
    CCM->CCGR1 = 0xffffffff; //CCM里面有多种时钟寄存器

    //2.设置引脚复用功能
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO04_GPIO1_IO04, 0);

    //3.设置引脚属性
    IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO04_GPIO1_IO04, 0x10bd);

    GPIO1->GDIR |= (1 << 4);
    //4.逻辑事件
    GPIO1->DR |= (1 << 4); //GPIO1有各种GPIO1的寄存器,DR是GPIO数据寄存器,将第四个引脚变为1,输出高电平



    while (1)
    {
        GPIO1->DR &= ~(1 << 4);
        delay(0xFFFFF);
        GPIO1->DR |= (1 << 4);
        delay(0xFFFFF);
    }

    return 0;
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。