当前位置:首页 > 编程笔记 > 正文
已解决

IMX6LL| C环境和SDK配置

来自网友在路上 151851提问 提问时间:2023-09-24 02:21:27阅读次数: 51

最佳答案 问答题库518位专家为你答疑解惑

一.使用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 burnclear:rm -rf $(BUILD_DIR)earth:. /etc/profilecreate_build:mkdir -p $(BUILD_DIR)burn:cp $(BUILD_DIR)/$(TARGET).bin /home/hq/SDK/download_toolcd /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;
}
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"IMX6LL| C环境和SDK配置":http://eshow365.cn/6-12454-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!