嵌入式Linux开发第三步——BSP工程管理

1. 前言

  我们将所有的源码文件放到工程的根目录下,如果工程文件比较少的话这样做无可厚非,但是如果工程源文件达到几十、甚至数百个的时候,这样一股脑全部放到根目录下就会使工程显得混乱不堪。所以我们必须对工程文件做管理,将不同功能的源码文件放到不同的目录中。接下来,我们就来学习一下如何对一个工程进行整理,使其美观、功能模块清晰、易于阅读。

2. 工程管理简介

  我们可以参考STM32F103的工程目录结构来整理第十二章的例程工程,新建名为“ledc_bsp”的文件夹,在里面新建 bsp、 imx6ul、 obj 和 project 这 4 个文件夹。
  其中 bsp 用来存放驱动文件; imx6ul 用来存放跟芯片有关的文件,比如 NXP 官方的 SDK库文件; obj 用来存放编译生成的.o 文件; project 存放 start.S 和 main.c 文件,也就是应用文件;将上一个实验中的 cc.h、 fsl_common.h、 fsl_iomuxc.h 和 MCIMX6Y2.h 这四个文件拷贝到文件夹 imx6ul 中;将 start.S 和 main.c 这两个文件拷贝到文件夹 project 中。我们前面的实验中所有的驱动相关的函数都写到了 main.c 文件中,比如函数 clk_enable、 led_init 和 delay,这三个函数可以分为三类:时钟驱动、 LED 驱动和延时驱动。因此我们可以在 bsp 文件夹下创建三个子文件夹: clk、 delay 和 led,分别用来存放时钟驱动文件、延时驱动文件和 LED 驱动文件,这样main.c 函数就会清爽很多,程序功能模块清晰。工程文件夹都创建好了,接下来就是编写代码了,其实就是将时钟驱动、 LED 驱动和延时驱动相关的函数从 main.c 中提取出来做成一个独立的驱动文件。

3. 实验程序编写

  imx6ul.h:

 #ifndef __IMX6UL_H
 #define __IMX6UL_H
 #include "cc.h"
 #include "MCIMX6Y2.h"
 #include "fsl_common.h"
 #include "fsl_iomuxc.h"

 #endif

  bsp_led.h:

#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "imx6ul.h"

#define LED0 0

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

  bsp_led.c:

#include "bsp_led.h"
void led_init(void)
{
    /* 1、初始化 IO 复用 */
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);

	/* 2、、配置 GPIO1_IO03 的 IO 属性 */
	 IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0X10B0);
	/* 3、初始化 GPIO,GPIO1_IO03 设置为输出*/
	 GPIO1->GDIR |= (1 << 3);

	 /* 4、设置 GPIO1_IO03 输出低电平,打开 LED0*/
	 GPIO1->DR &= ~(1 << 3);
 }

void led_switch(int led, int status)
{
	switch (led)
	 {
		case LED0:
			 if (status == ON)
			     GPIO1->DR &= ~(1 << 3); /* 打开 LED0 */
			 else if (status == OFF)
				 GPIO1->DR |= (1 << 3); /* 关闭 LED0 */
			 break;
			 }
}

  bsp_clk.h:

#ifndef __BSP_CLK_H
#define __BSP_CLK_H

#include "imx6ul.h"

void clk_enable(void);

#endif

  bsp_clk.c:

#include "bsp_clk.h"
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.h:

#ifndef __BSP_DELAY_H
#define __BSP_DELAY_H

#include "imx6ul.h"


/* 函数声明 */
void delay(volatile unsigned int n);

#endif

  bsp_delay.c:

#include "bsp_delay.h"


void delay_short(volatile unsigned int n)
{
	while (n--) {}
}


void delay(volatile unsigned int n)
{
	while (n--)
	{
		delay_short(0x7ff);
	}
}

  main.c:

#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"

/*
* @description	: mian函数
* @param 		: 无
* @return 		: 无
*/
int main(void)
{
	clk_enable();		/* 使能所有的时钟 			*/
	led_init();			/* 初始化led 			*/

	while (1)
	{
		/* 打开LED0 */
		led_switch(LED0, ON);
		delay(500);

		/* 关闭LED0 */
		led_switch(LED0, OFF);
		delay(500);
	}

	return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾贾乾杯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值