热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

I.MX6ULL—使用C语言点亮LED灯

1、新建工程在虚拟机中打开vscode软件,新建一个LEDC的文件夹,并保存工作区。在LEDC文件夹中新建start.smain.cmain.h三个文
1、新建工程

在虚拟机中打开vscode软件,新建一个LEDC的文件夹,并保存工作区。
在LEDC文件夹中新建start.s main.c main.h三个文件

srart.s

.global _start /* 全局标号 *//** 描述: _start函数,程序从此函数开始执行,此函数主要功能是设置C* 运行环境。*/
_start:/* 进入SVC模式 */mrs r0, cpsrbic 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函数 */

main.c

/**************************************************************
文件名 : mian.c
作者 : 果果小师弟
版本 : V1.0
描述 : I.MX6U开发板裸机实验2 C语言点灯使用C语言来点亮开发板上的LED灯,学习和掌握如何用C语言来完成对I.MX6U处理器的GPIO初始化和控制。
其他 : 无
日志 : 初版V1.0 2021-07-04 19:48:43 果果创建
**************************************************************/

#include "main.h"/** @description : 使能I.MX6U所有外设时钟* @param : 无* @return : 无*/
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)
{/* 1、初始化IO复用 */SW_MUX_GPIO1_IO03 = 0x5; /* 复用为GPIO1_IO03 *//* 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 低转换率*/SW_PAD_GPIO1_IO03 = 0X10B0; /* 3、初始化GPIO */GPIO1_GDIR = 0X0000008; /* GPIO1_IO03设置为输出 *//* 4、设置GPIO1_IO03输出低电平,打开LED0 */GPIO1_DR = 0X0;
}/** @description : 打开LED灯* @param : 无* @return : 无*/
void led_on(void)
{/* * 将GPIO1_DR的bit3清零 */GPIO1_DR &&#61; ~(1<<3);
}/** &#64;description : 关闭LED灯* &#64;param : 无* &#64;return : 无*/
void led_off(void)
{/* * 将GPIO1_DR的bit3置1*/GPIO1_DR |&#61; (1<<3);
}/** &#64;description : 短时间延时函数* &#64;param - n : 要延时循环次数(空操作循环次数&#xff0c;模式延时)* &#64;return : 无*/
void delay_short(volatile unsigned int n)
{while(n--){}
}/** &#64;description : 延时函数,在396Mhz的主频下* 延时时间大约为1ms* &#64;param - n : 要延时的ms数* &#64;return : 无*/
void delay(volatile unsigned int n)
{while(n--){delay_short(0x7ff);}
}/** &#64;description : mian函数* &#64;param : 无* &#64;return : 无*/
int main(void)
{clk_enable(); /* 使能所有的时钟 */led_init(); /* 初始化led */while(1) /* 死循环 */{ led_off(); /* 关闭LED */delay(500); /* 延时大约500ms */led_on(); /* 打开LED */delay(500); /* 延时大约500ms */}return 0;
}

main.h

#ifndef __MAIN_H
#define __MAIN_H
/*************************************
文件名 : main.h
作者 : 果果小师弟
版本 : V1.0
描述 : 时钟GPIO1_IO03相关寄存器地址定义。
其他 : 无
日志 : 初版V1.0 2021-07-04 19:46:32 果果创建
*************************************/
/* * CCM相关寄存器地址 */
#define CCM_CCGR0 *((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)#define CCM_CCGR2 *((volatile unsigned int *)0X020C4070)
#define CCM_CCGR3 *((volatile unsigned int *)0X020C4074)
#define CCM_CCGR4 *((volatile unsigned int *)0X020C4078)
#define CCM_CCGR5 *((volatile unsigned int *)0X020C407C)
#define CCM_CCGR6 *((volatile unsigned int *)0X020C4080)/* * IOMUX相关寄存器地址 */
#define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)/* * GPIO1相关寄存器地址 */
#define GPIO1_DR *((volatile unsigned int *)0X0209C000)
#define GPIO1_GDIR *((volatile unsigned int *)0X0209C004)
#define GPIO1_PSR *((volatile unsigned int *)0X0209C008)
#define GPIO1_ICR1 *((volatile unsigned int *)0X0209C00C)
#define GPIO1_ICR2 *((volatile unsigned int *)0X0209C010)
#define GPIO1_IMR *((volatile unsigned int *)0X0209C014)
#define GPIO1_ISR *((volatile unsigned int *)0X0209C018)
#define GPIO1_EDGE_SEL *((volatile unsigned int *)0X0209C01C)#endif

2、编写Makefile

objs :&#61; start.o main.oledc.bin : $(objs)arm-linux-gnueabihf-ld -Ttext 0X87800000 $^ -o ledc.elfarm-linux-gnueabihf-objcopy -O binary -S ledc.elf $&#64;arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis%.o:%.carm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $&#64; $< %.o:%.sarm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $&#64; $<clean:rm -rf *.o ledc.bin ledc.elf ledc.dis

3、编译代码

编写好Makefile文件后就可以在终端输入make指令来编译代码

编译没有错误后&#xff0c;会生成ledc.bin ledc.dis ledc.elf main.o start.o五个文件。

4、烧录程序

这里选择SD卡的模式。

首先要将imxdownload文件复制到工程文件LEDC中。你可以用命令行复制&#xff0c;也可以用鼠标右键复制都可以。如下图所示&#xff1a;

cp ../1_leds/imxdownload ./

将SD卡插入电脑
 要保证ubuntu正确识别到SD卡。
 然后使用ls /dev/sd* -l查看SD卡设备

ls /dev/sd* -l

 可以判断出SD卡设备为sdb

然后使用./imxdownload led.bin /dev/sdb命令向SD卡烧录ledc.bin文件。

./imxdownload ledc.bin /dev/sdb


烧录完成&#xff0c;拔掉SD卡&#xff0c;将SD卡插入到开发板中&#xff0c;接入电源&#xff0c;按下复位按键。之后就可以观察到LED每隔一秒钟闪烁一次。


推荐阅读
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • 在尝试使用Ubuntu 10.04进行Android开发时,遇到了系统无法识别HTC G1设备的情况。本文将详细介绍如何通过配置系统和安装必要的驱动来解决这一问题。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 正在学习操作系统开发,遇到一个内核在GRUB Legacy(0.97)中无法成功引导的问题。具体表现为输入内核命令后显示错误信息,尝试引导时GRUB挂起。 ... [详细]
  • 本文详细介绍了Golang中string类型的内部结构及其特性,包括字符串的定义、表示方式、数据结构以及相关的操作方法,如字符串拼接和类型转换等。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 本书详细介绍了在最新Linux 4.0内核环境下进行Java与Linux设备驱动开发的全面指南。内容涵盖设备驱动的基本概念、开发环境的搭建、操作系统对设备驱动的影响以及具体开发步骤和技巧。通过丰富的实例和深入的技术解析,帮助读者掌握设备驱动开发的核心技术和最佳实践。 ... [详细]
  • 求助高手:下载的压缩包中包含CMake文件,如何在Windows环境下使用已安装的CMake GUI进行运行?
    从GitHub仓库 `https://github.com/vonmax007/RobotSimulation` 下载的代码包含多种算法,其中算法1的文件目录中包含了CMake文件。为了在Windows环境下使用已安装的CMake GUI运行这些文件,需要先确保CMake已正确安装,并按照以下步骤操作:打开CMake GUI,设置源代码路径和构建路径,点击“Configure”配置项目,然后点击“Generate”生成构建文件。最后,在生成的构建目录中使用命令行或IDE进行编译和运行。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • PHP 实现实时汇率查询接口
    本文介绍如何使用PHP构建一个实时汇率查询接口,解决网站因数据源限制而无法获取最新汇率的问题。文章将详细讲解从选择合适的数据源到实现接口的具体步骤。 ... [详细]
  • 在 Debian 11 系统中部署 CMake 的详细步骤与最佳实践
    CMake是一个免费、开源、跨平台的工具系列,旨在构建、测试和打包软件. CMake用于使用简单的平台和独立于编译器的配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用 ... [详细]
author-avatar
苏黎世的风景
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有