资讯详情

资讯详情

Linux入门第二部分(ARM裸机篇) 第七章 NXP官方SDK的使用

参考教程正点原子【第二期】手把手教你学Linux之ARMMX6U裸机篇_哔哩哔哩_bilibili一、SDK移植1、SDK包说明1在上一章进行驱动开发时外设寄存器组结构体需要自己根据数据手册定义当寄存器的数量越来越多时这种开发方式就显得非常低效了。2NXP官方其实提供了一个SDK包包内有所有寄存器的定义程序员在开发的时候可以直接将包内的定义移植到工程中这样就不需要重复定义了。3SDK包可直接在NXP官网下载。2、SDK包移植方式1在NXP官网上下载的是一个.exe可执行程序运行它之后可以在指定目录生成所需要的配置文件如下图所示。2SDK包中有非常多的文件如果只是针对裸机开发那么真正有用的文件只有如下3个①fsl_common.h位置为SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_common.h②fsl_iomuxc.h: 位置为SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_iomuxc.h③MCIMX6Y2.h: 位置为SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\MCIMX6YH2.h3以上三个文件中的内容仍然非常冗余对于裸机开发只需要保留IOMUXC引脚复用、PAD配置结构体及宏定义、GPIO等外设寄存器结构体和地址宏其余内容如CMSIS、SDK驱动、多芯片兼容代码、无关及缺失的头文件等全部删除由于改动的代码量较大此处不详细展开。二、程序编写与验证1、启动配置文件编写在Board_Drivers文件夹中新建文件夹“4_ledc_sdk”然后将上一章的start.s文件拷贝至该文件夹中2、外设配置文件编写1在文件夹4_ledc_sdk中新建cc.h文件里面存放一些SDK库文件需要使用到的数据类型别名内容如下#ifndef __CC_H #define __CC_H #define __I volatile #define __O volatile #define __IO volatile 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; #endif2将上一小节提到的3个SDK包中的文件拷贝到文件夹4_ledc_sdk中并做裁剪裁剪的具体内容这里不详细展开。3原本cc.h文件中的定义在标准库stdint.h文件中已有实现但裸机工程在编译时带参数“-nostdlib”不链接C标准库所以需要另行定义并在SDK文件中原本包含stdint.h的地方包含cc.h文件。3、C语言点灯程序编写1将上一章的main.c文件拷贝至该文件夹中因为点灯的业务代码和LED外设初始化的代码与上一章在功能上基本等价只是初始化寄存器所调用的接口有变化。2修改main.c文件中的内容①包含的头文件需要替换为#include fsl_common.h #include fsl_iomuxc.h #include MCIMX6Y2.h②LED的初始化函数需要更改使用SDK提供的函数和宏完成GPIO初始化/* * description : 初始化 LED 对应的 GPIO * param : 无 * return : 无 */ void led_init(void) { /* 1、初始化 IO 复用, 复用为 GPIO1_IO03 */ IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0); /* 2、配置 GPIO1_IO03 的 IO 属性 *bit 16:0 HYS 关闭 *bit [15:14]: 00 默认下拉 *bit [13]: 0 kepper 功能 *bit [12]: 1 pull/keeper 使能 *bit [11]: 0 关闭开路输出 *bit [7:6]: 10 速度 100Mhz *bit [5:3]: 110 R0/6 驱动能力 *bit [0]: 0 低转换率 */ IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0); /* 3、初始化 GPIO, GPIO1_IO03 设置为输出 */ GPIO1-GDIR 0X0000008; /* 4、设置 GPIO1_IO03 输出低电平打开 LED0 */ GPIO1-DR ~(1 3); }3两个SDK初始化配置函数说明①IOMUXC_SetPinMux函数用于设置引脚的复用功能其函数参数定义如下所示按定义顺序说明。参数名用途muxRegisterIO引脚MUX寄存器地址muxModeIO复用值也就是ALT值决定该引脚复用何种功能inputRegister外设输入IO选择寄存器地址IO复用为某个功能时可能需要设置外设多路输入IO选择寄存器如串口RX功能需要选择数据输入源inputDaisy外设输入IO选择寄存器配置值不配置或者是配置为输出引脚则写0configRegister未使用参数inputOnfieldIO软件输入使能标志②IOMUXC_SetPinConfig函数用于设置引脚的电气属性。参数名用途muxRegister未使用参数muxMode未使用参数inputRegister未使用参数inputDaisy未使用参数configRegisterIO引脚PAD寄存器地址configValueIO引脚PAD寄存器配置值③这两个函数都有6个函数参数但SDK提供的宏定义已经将IO引脚复用寄存器地址、复用值、外设输入IO寄存器地址、外设输入IO寄存器配置值、IO配置寄存器地址这5个参数集成在一起了。[1]对上层来说使用IOMUXC_SetPinMux函数只需要指定想要配置的引脚功能和引脚的IO软件输入使能与否SDK就能精确匹配要操作的MUX寄存器的地址并将配置值写入。[2]对上层来说使用IOMUXC_SetPinConfig函数只需要指定想要配置的引脚功能和要写入寄存器的值SDK就能精确匹配要操作的PAD寄存器的地址并将配置值写入。4、Makefile文件与链接脚本编写1由于本章例程的架构与上一章类似故可直接复用上一章的Makefile将其复制到本工程的根目录下即可不过之前编写的Makefile通用性较差如果有些变量产生变化就需要改很多处地方非常麻烦对此可以进行优化如下所示。# 如果外部没有定义才赋值方便命令行覆盖make CROSS_COMPILExxx CROSS_COMPILE ? arm-linux-gnueabihf- NAME ? ledc CC : $(CROSS_COMPILE)gcc LD : $(CROSS_COMPILE)ld OBJCOPY : $(CROSS_COMPILE)objcopy OBJDUMP : $(CROSS_COMPILE)objdump # 需要编译的目标文件列表 OBJS : start.o main.o $(NAME).bin: $(OBJS) # 使用链接脚本 imx6ul.lds链接输出 elf $(LD) -T imx6ul.lds -o $(NAME).elf $^ # 从 elf 提取纯二进制 bin-S去掉重定位、符号信息 $(OBJCOPY) -O binary -S $(NAME).elf $ # 反汇编生成 dis 汇编查看文件 $(OBJDUMP) -D -m arm $(NAME).elf $(NAME).dis %.o: %.s $(CC) -Wall -nostdlib -c -O2 -o $ $ %.o: %.S $(CC) -Wall -nostdlib -c -O2 -o $ $ %.o: %.c $(CC) -Wall -nostdlib -c -O2 -o $ $ .PHONY: clean clean: rm -rf *.o $(NAME).bin $(NAME).elf $(NAME).dis2除了Makefile以外链接脚本也可直接复用将上一章的imx6u.lds复制到本工程的根目录下即可。5、程序烧写验证1将imxdownload拷贝到工程的根目录下也就是和ledc.bin处于同一个文件夹下并赋予其可执行权限。2将SD卡接入虚拟机然后在当前目录运行命令“./imxdownload ledc.bin /dev/sdb”即可将固件刷入SD卡设备名需要核对与/dev下的设备名一致然后在开发板上验证即可。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →