lugl4313820 发表于 2023-5-3 13:52

【正点原子阿尔法 IMX6ULL Linux开发板】用BSP工程管理项目

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

<div class="parsedown-markdown">
<h2>新建文件夹led_bsp</h2>

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

<p></p>

<div class="parsedown-markdown">
<ol start="5">
        <li>将前面我们使用的cc.h、fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h这4个文件复制到文件夹imx6ul中;</li>
        <li>在bsp目录下新建clk、delay、led分别存放时钟驱动、延时驱动、LED驱动</li>
</ol>
</div>

<p></p>

<div class="parsedown-markdown">
<ol start="7">
        <li>编写imx6ul.h文件:</li>
</ol>
</div>

<pre>
<code>#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
</code></pre>

<div class="parsedown-markdown">
<p>这样以后,其他的文件中任间引用imx6ul.h就可以了。</p>

<h2>重写LED驱动代码</h2>

<p>新建bsp_led.c、bsp_led.h两个文件,将这两个文件存放在bsp/led目录下面。 bsp_led.h内容如下</p>
</div>

<pre>
<code>#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</code></pre>

<p>bsp_led.c内容如下:</p>

<pre>
<code>#include &quot;bsp_led.h&quot;
/***************************************************************
Copyright &copy; lugl Co., Ltd. 1998-2023. All rights reserved.
文件名        :        bsp_led.c
作者           : 刘建华
版本           : V1.0
描述           : LED驱动文件。
其他           : 此文件,学习正点原子左忠凯老师例程编写
论坛            :
日志           : 初版V1.0 2023/5/3 刘建华创建
************************************************************/
/***
* <a href="home.php?mod=space&amp;uid=1068364" target="_blank">@description </a> :初始化LED对应的GPIO
* @param   :无
* <a href="home.php?mod=space&amp;uid=784970" target="_blank">@return </a> :无
*
*/
void led_init(void)
{
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);                /* 复用为GPIO1_IO03 */
    IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0);
    GPIO1-&gt;GDIR |= (1 &lt;&lt; 3);/*初始化GPIO,GPIO1_IO03设置为输出*/
    GPIO1-&gt;DR &amp;= ~(1 &lt;&lt; 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-&gt;DR &amp;= ~(1&lt;&lt;3);/* 打开LED0 */
      else if(status == OFF)
            GPIO01-&gt;DR |= (1&lt;&lt;3);/* 关闭LED0 */
      break;
   
    default:
      break;
    }
}</code></pre>

<div class="parsedown-markdown">
<h2>编写时钟驱动代码</h2>

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

<pre>
<code>#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</code></pre>

<p>bsp_clk.c</p>

<pre>
<code>/***************************************************************
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   :无
* @return      :无
*
*/
void clk_enable(void)
{
    CCM-&gt;CCGR0 = 0XFFFFFFFF;
        CCM-&gt;CCGR1 = 0XFFFFFFFF;
        CCM-&gt;CCGR2 = 0XFFFFFFFF;
        CCM-&gt;CCGR3 = 0XFFFFFFFF;
        CCM-&gt;CCGR4 = 0XFFFFFFFF;
        CCM-&gt;CCGR5 = 0XFFFFFFFF;
        CCM-&gt;CCGR6 = 0XFFFFFFFF;
}</code></pre>

<div class="parsedown-markdown">
<h2>bsp_delay驱动,直接拷贝左老师的文件</h2>

<p>修改main.c文件如下</p>
</div>

<pre>
<code>/***************************************************************
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;
}</code></pre>

<div class="parsedown-markdown">
<h1>编写Makefile如下:</h1>
</div>

<pre>
<code>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 &gt; $(TARGET).dis

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

$(COBJS) : obj/%.o : %.c
        $(CC) -Wall -nostdlib -c -O2$(INCLUDE) -o $@ $&lt;
       
clean:
        rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)</code></pre>

<p>imx6ul.lds:</p>

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

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

<p></p>

<div class="parsedown-markdown">
<p>烧到开发板后,LED0灯成功闪亮。</p>

<h2>小结</h2>

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

<p>&nbsp;</p>
页: [1]
查看完整版本: 【正点原子阿尔法 IMX6ULL Linux开发板】用BSP工程管理项目