1240|0

6842

帖子

11

TA的资源

版主

楼主
 

【正点原子阿尔法 IMX6ULL Linux开发板】用BSP工程管理项目 [复制链接]

本帖最后由 lugl4313820 于 2023-5-5 13:37 编辑

新建文件夹led_bsp

  1. 下面新建bsp用来存放驱动文件;
  2. imx6ul用来存放跟芯片有关的文件,比如NXP官方的SDK库文件;
  3. obj用来存放编译生成的.o文;
  4. project存放start.S和main.c.

  1. 将前面我们使用的cc.h、fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h这4个文件复制到文件夹imx6ul中;
  2. 在bsp目录下新建clk、delay、led分别存放时钟驱动、延时驱动、LED驱动

  1. 编写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文件夹中。两个文件分别如下:

#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卡:

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

小结

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

 

此帖出自RF/无线论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表