裸机开发(4)BSP工程创建

目录

  • 1.SDK文件移植
  • 2.BSP工程创建
    • 2.1.工程目录创建
    • 2.2.gpio驱动编写

1.SDK文件移植

NXP提供的SDK包类似于STM32的HAL库,我们使用其中的几个头文件,就可以更方便的在裸机程序中操作寄存器。移植步骤如下:

  1. 从NXP官网下载安装SDK_2.2_MCIM6ULL_RFP_Win.exe。
  2. 找到并复制以下几个头文件到Ubuntu中:
    SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_common.h
    SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_iomuxc.h
    SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\MCIMX6YH2.h
  3. 删除三个头文件中的多余代码。fsl_common.h中主要包括一些通用的宏定义;fsl_iomuxc.h主要定义了IMX6ULL的寄存器地址,还有两个方便的函数:IOMUXC_SetPinMux()用于配置IO的复用,IOMUXC_SetPinConfig()用于配置IO的电器属性;MCIMX6YH2.h寄存器结构体和相关位定义。
  4. 创建cc.h文件,在该文件中包含以上三个头文件,并且对常用的数据类型进行重定义:
typedef   signed          char int8_t;
typedef   signed short     int int16_t;
typedef   signed           int int32_t;
typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;
typedef unsigned long     long uint64_t;
typedef	  signed char  	 	   s8;		
typedef	  signed short 	  int  s16;
typedef	  signed int 		   s32;
typedef	  signed long long int s64;
typedef	unsigned char 		   u8;
typedef	unsigned short int     u16;
typedef	unsigned int 		   u32;
typedef	unsigned long long int u64;
  1. 创建imx6ul.h文件,其中包含MDK的三个头文件和cc.h。

2.BSP工程创建

2.1.工程目录创建

使用VSCode创建工程目录的步骤如下:

  1. 创建工程目录文件夹,比如led_c。
  2. 在VSCode中选择 文件->打开文件夹,进入创建的工程文件夹。
  3. 选择 文件->将工作区另存为,进入工程文件夹中保存当前的工作区,命名可以和工程名一致。
  4. 创建bsp,imx6ul,obj,project,.vscode这几个文件夹。
    裸机开发(4)BSP工程创建_第1张图片
文件/文件夹名 功能
.vscode c_cpp_properties.json中可以添加头文件路径
bsp 各模块驱动,其中clk,delay,gpio为必须模块
imx6ul 存放与imx6ul寄存器相关的文件,其他文件只需包含imx6ul.h
obj 存放编译生成的.o文件
start.S c环境初始化
imx6ul.lds 设置start.o链接位置为0x87800000
imxdownload 在bin文件后加入头部信息,生成load.imx烧写到SD卡指定位置
Makefile 编译链接所有程序

2.2.gpio驱动编写

bsp_gpio.h: 主要是定义设置GPIO输入输出方向,输出电平的结构体;在结构体重包含一个设置GPIO输入输出方向的枚举类型变量。

/*枚举类型和GPIO结构体*/
typedef enum _gpio_pin_direction
{
    kGPIO_DigitalInput = 0U,//输入
    kGPIO_DigitalOutput = 1U,//输出
}gpio_pin_direction_t;

typedef struct _gpio_pin_config
{
    gpio_pin_direction_t direction;//GPIO输入输出方向
    uint8_t outputLogic;//GPIO输出电平
}gpio_pin_config_t;

void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config);//GPIO初始化
void gpio_pinwrite(GPIO_Type *base, int pin, int value);//写GPIO引脚
int gpio_pinread(GPIO_Type *base, int pin);//读GPIO引脚

bsp_gpio.c:

#include "bsp_gpio.h"

/*GPIO初始化输入输出方向*/
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config)
{
    if(config->direction == kGPIO_DigitalInput)//输入
    {
        base->GDIR &= ~(1<<pin);//设定GPIO对应位为输入
    }
    else
    {
        base->GDIR |= (1<<pin);//设置GPIO对应位为输出
        gpio_pinwrite(base, pin, config->outputLogic);//设置默认输出电平
    }
}

/*控制GPIO高低电平*/
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
{
    if(value == 0)//如果设定低电平,写0,否则写1
    {
        base->DR &= ~(1<<pin);
    }
    else
    {
        base->DR |= (1<<pin);
    }   
}

//读取GPIO电平值
int gpio_pinread(GPIO_Type *base, int pin)
{
    return (((base->DR) >> pin) & 0x1);
}

你可能感兴趣的:(I.MX6U学习笔记)