2179|0

6980

帖子

11

TA的资源

版主

楼主
 

【正点原子阿尔法 IMX6ULL Linux开发板】学习使用SDK驱动LED灯 [复制链接]

官方SDK简介

I.MX6ULL官方提供了裸机SDK包,使得学习上手册很。I.MX6ULL的SDK包在NXP官网下载https://www.nxp.com/search?keyword=i.MX%25206ULL%2520SDK&start=0&category=software

当然原子在资料盘中也给我们提供了,在目录L:\baidudownloads\【正点原子】阿尔法Linux开发板(A盘)-基础资料\【正点原子】阿尔法Linux开发板(A盘)-基础资料\07、I.MX6U参考资料\03、I.MX6ULL SDK包目录下面:

双击安装程序,在目录选择时,指定目录,好在以后需要时找得到

安装好后,文件夹如下:

我们裸机开发的话用到以下三个文件:

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.h。

整个 SDK 包我们就需要上面这三个文件,把这三个文件准备好,我们后面移植要用。

编写实验程序

  1. 新建一个名为cc.h的头文件,cc.h中存放着一些SDK库文件需要使用的数据类型,如下所示:
#ifndef __CC_H
#define __CC_H
/***************************************************************
Copyright © lugl.
文件名 : main.h
作者 : 刘建华
版本 : V1.0
描述 : 有关变量的类型定义,nxp官方SDK的一些移植文件会用到。
其他 : 此程序学习左中凯老师课程
日志 : 初版 2023/5/3 刘建华修改
**************************************************************/
/************************************************************
 * 
 * 自定义一些数据类型供库文件使用
 * 
 * /
 */
 #define __I    volatile
 #define __O    volatile
 #define __IO   volatile

 #define ON  1
 #define OFF 0

 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;

#endif /* __CC_H */

2. start.S:

/***************************************************************
Copyright © lugl.
文件名 : start.s
作者 : 刘建华
版本 : V1.0
描述 : I.MX6U-ALPHA/I.MX6ULL 开发板启动文件,完成 C 环境初始化,
 C 环境初始化完成以后跳转到 C 代码。
其他 : 此程序学习左中凯老师课程
日志 : 初版 2023/5/3 刘建华修改
**************************************************************/
.global _start       @全局标号

/*
* 描述:_start函数,程序从此函灵敏开始执行,
*      此函数主要功能是设置C运行环境
*/
_start:

    /*  进入SVC模式 */
    mrs r0, cpsr
    bic r0, r0, #0x1f    @ 将r0的低5位清零,也就是cpsr的M0-M4
    orr r0, r0, #0x13    @ r0或上0x13,表示使用SVC模式
    msr cpsr, r0         @ 将r0 的数据写入到cpsr_c中

    ldr sp, =0x80200000  @ 设置栈指针
    b main               @ 跳转到main函数(再也不用回来了)

3. main.c

/***************************************************************
Copyright © lugl.
文件名 : main.c
作者 : 刘建华
版本 : V1.0
描述 : 使用C语言来点亮开发板的LED灯,基于官方的SDK来开发。
       学习掌握如何用c语言来完成对I.MX6U的GPIO初始化和控制
其他 : 此程序学习左中凯老师课程
        需要使用到的文件有fsl.common.h、fsl_iomuxc.h、MCIMX6Y2.h
日志 : 初版 2023/5/3刘建华修改
**************************************************************/

#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "MCIMX6Y2.h"

/***
 * [url=home.php?mod=space&uid=1068364]@description[/url] :使能I.MX6ULL所有外设时钟
 * @param       :无
 * [url=home.php?mod=space&uid=784970]@return[/url] :无
 * 
***/
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;
}

/***
 * @description :初始化LED对应的GPIO
 * @param       :无
 * @return      :无
 * 
*/
void led_init(void)
{
    /* 初始化IO 复用 */
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);
    /* 配置 IO的属性 */
    IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0);
    /* 初始化GPIO 设置GPIO1_IO03  为输出*/
    GPIO1->GDIR |= (1<<3);
    /* 设置GPIO1——IO03为低电平,打开LED0 */
    GPIO1->DR &= ~(1<<3);
}

/************************************************************
 * @descriptions: 打开LED灯
 * @param       : 无
 * @return      : 无
 *************************************************************/
void led_on(void)
{
    /*
    * 将GPIO1_DR 的bit3清零,打开led0灯
    */
   GPIO1->DR &= ~(1<<3);
}

/************************************************************
 * @descriptions: 关闭LED灯
 * @param       : 无
 * @return      : 无
 *************************************************************/
void led_off(void)
{
    /*
    * 将GPIO1_DR 的bit3置1,关闭led0灯
    */
   GPIO1->DR |= (1<<3);
}

/************************************************************
 * @descriptions: 短时间延时函数
 * @param -n    : 要延时循环次数,模式延时
 * @return      : 无
 *************************************************************/
void delay_short(volatile unsigned int n)
{
    while (n--)
    {
        ;
    } 
}

/************************************************************
 * @descriptions: 延时函数,在396MHz的主频下延时时间大约为1ms
 * @param -n    : 要延时的ms数
 * @return      : 无
 *************************************************************/
void delay(volatile unsigned int n)
{
    while (n--)
    {
        delay_short(0x7ff);
    }
    
}

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

    while (1)
    {
        led_on();   //打开LED
        delay(500); //延时
        led_off();  //关闭LED
        delay(500);
    }
    return 0; 
}

5. lds、makefile 拷贝前面的就OK,

6. 把文件放到虚拟机上,运行make,就得到ledc.bin文件,烧写到SD卡

把SD卡插到开发板上,就实现了跟以前一样的效果了。

【小结】这节主要学习如何使用官方的SDK,来驱动GPIO。这里大家要注意的是,官方的三个SDK文件要做相应的修改,要不编译时会报错,大家可以对照一下正点原子提供的例程做相应学习。

此帖出自ARM技术论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表