當前位置: 首頁 > 綜合

        BSP工程管理——I.MAX6Ull裸機開發 焦點消息

        日期:2023-05-03 21:16:10 來源:華仔的編程隨筆

        bsp工程管理

        新建文件夾led_bsp

        下面新建bsp用來存放驅動文件;

        imx6ul用來存放跟芯片有關的文件,比如NXP官方的SDK庫文件;


        (資料圖片)

        obj用來存放編譯生成的.o文;

        project存放start.S和main.c.

        將前面我們使用的cc.h、fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h這4個文件復制到文件夾imx6ul中;

        在bsp目錄下新建clk、delay、led分別存放時鐘驅動、延時驅動、LED驅動

        編寫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  ?= bspCC := $(CROSS_COMPILE)gccLD:= $(CROSS_COMPILE)ldOBJCOPY := $(CROSS_COMPILE)objcopyOBJDUMP := $(CROSS_COMPILE)objdumpINCDIRS:= imx6ul bsp/clk bsp/led bsp/delaySRCDIRS:= project bsp/clk bsp/led bsp/delayINCLUDE:= $(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 $@ $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的創建,為以后工程使用提供基礎的結構。

        標簽:

        熱門推薦

        猜你喜歡

        市場