0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

BSP工程管理——I.MAX6Ull裸机开发

华仔的编程随笔 来源:华仔的编程随笔 作者:华仔的编程随笔 2023-05-03 13:58 次阅读

bsp工程管理

新建文件夹led_bsp

  1. 下面新建bsp用来存放驱动文件;
  2. imx6ul用来存放跟芯片有关的文件,比如NXP官方的SDK库文件;
  3. obj用来存放编译生成的.o文;
  4. project存放start.S和main.c.
    380bbabbcfdc0ab374b938454e649b9b77ac6d6fcfe3decb136bf17d3a7775c0.png
  5. 将前面我们使用的cc.h、fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h这4个文件复制到文件夹imx6ul中;
  6. 在bsp目录下新建clk、delay、led分别存放时钟驱动、延时驱动、LED驱动
    99008454afe7d19dc9c20268d4f4a889a587d8bbe4706f4239052e3151db4ed0.png
  7. 编写imx6ul.h文件:
#ifndef __IMX6UL_H
#define __IMX6UL_H
/***************************************************************
Copyright © lugl Co., Ltd. 1998-2023. All rights reserved.
文件名	: 	 imx6ul.h
作者	   : 刘建华
版本	   : V1.0
描述	   : 包含一些常用的头文件。
其他	   : 此文件,学习正点原子左忠凯老师例程编写
论坛 	   :
日志	   : 初版V1.0 2023/5/3 刘建华创建
***************************************************************/
#include "cc.h"
#include "MCIMX6Y2.h"
#include "fsl_common.h"
#include "fsl_iomuxc.h"

#endif

这样以后,其他的文件中任间引用imx6ul.h就可以了。

重写LED驱动代码

新建bsp_led.c、bsp_led.h两个文件,将这两个文件存放在bsp/led目录下面。

bsp_led.h内容如下

#ifndef __BSP_LED_H
#define __BSP_LED_H
/***************************************************************
Copyright © lugl Co., Ltd. 1998-2023. All rights reserved.
文件名	: 	 bsp_led.h
作者	   : 刘建华
版本	   : V1.0
描述	   : LED驱动头文件。
其他	   : 此文件,学习正点原子左忠凯老师例程编写
论坛 	   :
日志	   : 初版V1.0 2023/5/3 刘建华创建
************************************************************/
#define LED0 0

/***  函数声明 *******/
void led_init(void);
void led_switch(int led, int status);
#endif

bsp_led.c内容如下:

#include "bsp_led.h"
/***************************************************************
Copyright © lugl Co., Ltd. 1998-2023. All rights reserved.
文件名	: 	 bsp_led.c
作者	   : 刘建华
版本	   : V1.0
描述	   : LED驱动文件。
其他	   : 此文件,学习正点原子左忠凯老师例程编写
论坛 	   :
日志	   : 初版V1.0 2023/5/3 刘建华创建
************************************************************/
/**********

* @description :初始化LED对应的GPIO
* @param[in]   :无
* @return      :无
* 

*/
void led_init(void)
{
IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);		/* 复用为GPIO1_IO03 */
IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0);
GPIO1- >GDIR |= (1 < < 3);  /*  初始化GPIO,GPIO1_IO03设置为输出*/
GPIO1- >DR &= ~(1 < < 3);	  /*  设置GPIO1_IO03输出低电平,打开LED0*/
}
/*

* @description		: LED控制函数,控制LED打开还是关闭
* @param - led		: 要控制的LED灯编号
* @param - status	: 0,关闭LED0,1 打开LED0
* @return 			: 无
  */
void led_switch(int led, int status)
{
switch (led)
{
case LED0:
if(status == ON)
GPIO1- >DR &= ~(1< < 3);  /* 打开LED0 */
else if(status == OFF)
GPIO01- >DR |= (1< < 3);  /* 关闭LED0 */
  break;
  
  default:
  break;
  }
  }

编写时钟驱动代码

新建bsp_clk.h、bsp_clk.c两个文件,将这两个文件放到bsp/clk文件夹中。两个文件分别如下:

bsp_clk.h:

#ifndef __BSP_CLK_H
#define __BSP_CLK_H
/***************************************************************
Copyright © lugl Co., Ltd. 1998-2023. All rights reserved.
文件名	: 	 bsp_clk.h
作者	   : 刘建华
版本	   : V1.0
描述	   : 系统时钟驱动头文件。
其他	   : 此文件,学习正点原子左忠凯老师例程编写
论坛 	   :
日志	   : 初版V1.0 2023/5/3 刘建华创建
************************************************************/
#include "imx6ul.h"

void clk_init(void);

#endif

bsp_clk.c

/***************************************************************
Copyright © lugl Co., Ltd. 1998-2023. All rights reserved.
文件名	: 	 bsp_clk.c
作者	   : 刘建华
版本	   : V1.0
描述	   : 系统时钟 驱动文件。
其他	   : 此文件,学习正点原子左忠凯老师例程编写
论坛 	   :
日志	   : 初版V1.0 2023/5/3 刘建华创建
************************************************************/
#include "bsp_clk.h"

/***

* @description :初始化I.MAX6U所有外设时钟
* @param[in]   :无
* @return      :无
* 

*/
void clk_enable(void)
{
CCM- >CCGR0 = 0XFFFFFFFF;
CCM- >CCGR1 = 0XFFFFFFFF;
CCM- >CCGR2 = 0XFFFFFFFF;
CCM- >CCGR3 = 0XFFFFFFFF;
CCM- >CCGR4 = 0XFFFFFFFF;
CCM- >CCGR5 = 0XFFFFFFFF;
CCM- >CCGR6 = 0XFFFFFFFF;
}

bsp_delay驱动,直接拷贝左老师的文件

修改main.c文件如下

/***************************************************************
Copyright © lugl.
文件名 : main.c
作者 : 刘建华
版本 : V1.0
描述 :
其他 : 此程序学习左中凯老师课程
日志 : 初版 2023/5/3刘建华修改
**************************************************************/
#include "bsp_clk.h"
#include "bsp_led.h"
#include "bsp_delay.h"

/************************************************************

* @descriptions: main函数
* @param       : 无
* @return      : 无
  *************************************************************/
  int main(void)
  {
  clk_enable();
  led_init();
  while (1)
  {
  led_switch(LED0,ON);
  delay(500);
  led_switch(LED0,OFF);
  delay(500);
  }
  return 0;
  }

编写Makefile如下:

CROSS_COMPILE 	?= arm-linux-gnueabihf-
TARGET		  	?= bsp

CC 				:= $(CROSS_COMPILE)gcc
LD				:= $(CROSS_COMPILE)ld
OBJCOPY 		:= $(CROSS_COMPILE)objcopy
OBJDUMP 		:= $(CROSS_COMPILE)objdump

INCDIRS 		:= imx6ul 
bsp/clk 
bsp/led 
bsp/delay

SRCDIRS			:= project 
bsp/clk 
bsp/led 
bsp/delay

INCLUDE			:= $(patsubst %, -I %, $(INCDIRS))

SFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

SFILENDIR		:= $(notdir  $(SFILES))
CFILENDIR		:= $(notdir  $(CFILES))

SOBJS			:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS			:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS			:= $(SOBJS) $(COBJS)

VPATH			:= $(SRCDIRS)

.PHONY: clean

$(TARGET).bin : $(OBJS)
$(LD) -Timx6ul.lds -o $(TARGET).elf $^
$(OBJCOPY) -O binary -S $(TARGET).elf $@
$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

$(SOBJS) : obj/%.o : %.S
$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<  

$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<  

clean:
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

imx6ul.lds:

SECTIONS{
. = 0X87800000;
.text :
{
obj/start.o
*(.text)
}
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4)   : { *(.data) }
__bss_start = .;
.bss ALIGN(4)  : { *(.bss)  *(COMMON) }
__bss_end = .;
}

至此,程序重构完成,我们把文件拷到虚拟机进行编译,并烧写到SD卡:

8956843ca6c12a5282a8aa3e0a8ba00464bd21bafa03e79f154bc26493f6c012.png

烧到开发板后,LED0灯成功闪亮。

小结

本篇学习了bsp工程的创建管理,工程目录结构为bsp、imx6ul、obj、project来分片管理,bsp中又分为bsp_clk、bsp_led、bsp_delay来分片管理。最后学习了Makefile的创建,为以后工程使用提供基础的结构。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 时钟
    +关注

    关注

    10

    文章

    1479

    浏览量

    130295
  • 函数
    +关注

    关注

    3

    文章

    3860

    浏览量

    61297
  • BSP
    BSP
    +关注

    关注

    1

    文章

    83

    浏览量

    25743
  • i.MX6
    +关注

    关注

    1

    文章

    36

    浏览量

    16226
收藏 人收藏

    评论

    相关推荐

    IMX6ULL正点原子开发板LED驱动

    用C语言裸机编程驱动正点原子I.MAX6ULL开发板上的LED灯
    的头像 发表于 05-02 15:22 25.9w次阅读
    IMX6<b class='flag-5'>ULL</b>正点原子<b class='flag-5'>开发</b>板LED驱动

    i.MX6UL/i.MX6ULL开发常见问题】单独编译内核,uboot生成很多文件,具体用哪一个?

    。本文转自米尔公众号,是由米尔电子工程师基于米尔电子 i.MX6UL/i.MX6ULL产品对i.MX6UL/i.MX6ULL
    发表于 07-01 17:50

    「正点原子Linux连载」第十三章BSP工程管理实验

    凯版本: V1.0描述: I.MX6U开发裸机实验5 BSP形式的LED驱动其他: 本实验学习目的:1、将各个不同的文件进行分类,学习如何整理工程
    发表于 12-20 15:30

    I.MX6ULL终结者开发板支持JTAG调试

    位置:G:\nxp),在1.2.3章节我们安装了IAR开发工具,接下来我们打开IAR开发工具,如下图所示: 在本章节我们主要是讲解如何通过IAR+JLINK调试i.MX6ULL的IAR工程
    发表于 04-26 15:11

    迅为I.MX6ULL终结者开发板支持JTAG调试

    使用Windows版本的SDK。Windows版本的SDK里面的例程提供了IAR的工程版,这些工程是基于IAR开发环境来编译的。I.MX6ULL的SDK
    发表于 05-06 14:09

    I.MX6ULL终结者开发裸机仿真jlink调试

    I.MX6ULL‘终结者’开发板预留了JTAG仿真接口,并给出了开发文档,可以实现在JLINK仿真器条件下的单步跟踪、断点调试等功能,使得开发研究i
    发表于 07-07 10:56

    迅为IMX6ULL教程更新至2060+页,裸机开发,Linux系统移植,驱动开发,构建文明系统,QT开发,系统编程

    原生代码开始,一步步针对板子本身的外设进行代码修改的完整过程,最终实现适配到i.MX6ULL开发板上,练就扎实基础。第四部分 Linux驱动开发:二十多个驱动实战详细例程,包含字符驱动,设备树分析
    发表于 10-26 10:18

    怎么使用JTAG来调试i.MX6ULL

    [td]因为有很多小伙伴是从单片机转过来的,对JTAG非常熟悉。想用JTAG来调试裸机代码,而且一直用卡拷贝经常会出现虚拟机连接不上TF卡的情况。 I.MX6ULL本身是支持JTAG的,但是由于关于
    发表于 12-28 06:58

    i.MX6ULL开发板硬件资源

    迅为i.MX6ULL 终结者开发板硬件资源非常丰富,几乎将 i.MX6ULL 芯片的所有资源都扩展引出到底板上了,底板提供了丰富的外设接口,开发板的尺寸是 190mm*125mm,充分
    发表于 12-29 06:18

    裸机开发_L5_BSP工程管理LED实验的相关资料推荐

    裸机开发_L5_BSP工程管理LED实验0. 本届目标1. 目录结构2. 硬件层电路2.1 正点原子 i
    发表于 12-16 07:58

    介绍UART在i.mx6ull上的开发步骤

    的HAL库开发在之前文章已经提及,本篇文章将介绍UART在i.mx6ull上的开发步骤。由于此芯片的裸机开发在Linux下并使用ARM-Li
    发表于 12-16 06:34

    初识 i.MX6ULL 寄存器

    裸机开发_L1_汇编LED实验0. 本节目标1. 硬件层电路2. 初识 i.MX6ULL 寄存器2.1 i.MX6ULL 时钟控制寄存器2.2 i.
    发表于 12-20 07:13

    i.MX6ULL的相关资料下载

    i.MX6ULL终结者三大手册,加速学习和开发速度,一秒化无形!《嵌入式Linux开发指南》+《开发板使用手册》+《裸机使用手册》详细手册点
    发表于 12-27 06:13

    ARM裸机篇之i.MX6ULL处理器资料分享

    1、i.MX6ULL处理器启动过程i.MX6ULL是NXP基于ARM Cortex-A7内核的单核处理器家族,主频可以高900MHz。i.MX6ULL应用处理器包含了电源管理模块,可以
    发表于 04-14 16:42

    如何使用imx6ull实现裸机开发I2C读取MPU6050,并使用DMA方式传输数据?

    我最近想使用imx6ull实现裸机开发I2C读取MPU6050,并使用DMA方式传输数据。我在官方的I2C寄存器手册里并没有看到关于DMA使
    发表于 05-17 06:04