IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 嵌入式Linux开发第三步——BSP工程管理 -> 正文阅读

[嵌入式]嵌入式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;
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:37:47  更:2021-07-13 17:38:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:50:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码