C 语言部分有两个文件 main.c 和 main.h,main.h 里面主要是定义的寄存器地址,在 main.h里面输入代码:

#ifndef MAIN_H #define MAIN_H1 /*2 * CCM 相关寄存器地址3 */4 #define CCM_CCGR0 *((volatile unsigned int *)0X020C4068)5 #define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)6 #define CCM_CCGR2 *((volatile unsigned int *)0X020C4070)7 #define CCM_CCGR3 *((volatile unsigned int *)0X020C4074)8 #define CCM_CCGR4 *((volatile unsigned int *)0X020C4078)9 #define CCM_CCGR5 *((volatile unsigned int *)0X020C407C)10 #define CCM_CCGR6 *((volatile unsigned int *)0X020C4080)1112 /*13 * IOMUX 相关寄存器地址14 */15 #define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)16 #define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)1718 /*19 * GPIO1 相关寄存器地址20 */21 #define GPIO1_DR *((volatile unsigned int *)0X0209C000)22 #define GPIO1_GDIR *((volatile unsigned int *)0X0209C004)23 #define GPIO1_PSR *((volatile unsigned int *)0X0209C008)24 #define GPIO1_ICR1 *((volatile unsigned int *)0X0209C00C)25 #define GPIO1_ICR2 *((volatile unsigned int *)0X0209C010)26 #define GPIO1_IMR *((volatile unsigned int *)0X0209C014)27 #define GPIO1_ISR *((volatile unsigned int *)0X0209C018)28 #define GPIO1_EDGE_SEL *((volatile unsigned int *)0X0209C01C)2930 #endif

在 main.h 中我们以宏定义的形式定义了要使用到的所有寄存器,后面的数字就是其地址,比如CCM_CCGR0 寄存器的地址就是 0X020C4068,这个很简单,很好理解。接下看一下 main.c 文件,在 main.c 里面输入如下所示代码:

1 #include "main.h" 23 /*4 * @description : 使能 I.MX6U 所有外设时钟5 * @param : 无6 * @return : 无7 */8 void clk_enable(void) 9 {10 CCM_CCGR0 = 0xffffffff;11 CCM_CCGR1 = 0xffffffff;12 CCM_CCGR2 = 0xffffffff;13 CCM_CCGR3 = 0xffffffff;14 CCM_CCGR4 = 0xffffffff;15 CCM_CCGR5 = 0xffffffff;16 CCM_CCGR6 = 0xffffffff; 17 }1819 /*20 * @description : 初始化 LED 对应的 GPIO21 * @param : 无22 * @return : 无23 */24 void led_init(void) 25 {26 /* 1、初始化 IO 复用, 复用为 GPIO1_IO03 */27 SW_MUX_GPIO1_IO03 = 0x5; 2829 /* 2、配置 GPIO1_IO03 的 IO 属性30 *bit 16:0 HYS 关闭31 *bit [15:14]: 00 默认下拉32 *bit [13]: 0 kepper 功能33 *bit [12]: 1 pull/keeper 使能34 *bit [11]: 0 关闭开路输出35 *bit [7:6]: 10 速度 100Mhz36 *bit [5:3]: 110 R0/6 驱动能力37 *bit [0]: 0 低转换率38 */39 SW_PAD_GPIO1_IO03 = 0X10B0;4041 /* 3、初始化 GPIO, GPIO1_IO03 设置为输出 */ 42 GPIO1_GDIR = 0X0000008;4344 /* 4、设置 GPIO1_IO03 输出低电平,打开 LED0 */45 GPIO1_DR = 0X0; 46 }4748 /*49 * @description : 打开 LED 灯50 * @param : 无51 * @return : 无52 */53 void led_on(void) 54 {55 /*56 * 将 GPIO1_DR 的 bit3 清零57 */58 GPIO1_DR &= ~(1<<3);59 }6061 /*62 * @description : 关闭 LED 灯63 * @param : 无64 * @return : 无65 */66 void led_off(void) 67 {68 /*69 * 将 GPIO1_DR 的 bit3 置 1 70 */71 GPIO1_DR |= (1<<3);72 }7374 /*75 * @description : 短时间延时函数76 * @param - n : 要延时循环次数(空操作循环次数,模式延时)77 * @return : 无78 */79 void delay_short(volatile unsigned int n) 80 {81 while(n--){}82 }8384 /*85 * @description : 延时函数,在 396Mhz 的主频下延时时间大约为 1ms86 * @param - n : 要延时的 ms 数87 * @return : 无88 */89 void delay(volatile unsigned int n) 90 {91 while(n--)92 {93 delay_short(0x7ff); 94 }95 }9697 /*98 * @description : mian 函数99 * @param : 无100 * @return : 无101 */102 int main(void)103 {104 clk_enable(); /* 使能所有的时钟 */105 led_init(); /* 初始化 led */ 106107 while(1) /* 死循环 */108 {109 led_off(); /* 关闭 LED */ 110 delay(500); /* 延时大约 500ms */ 111112 led_on(); /* 打开 LED */ 113 delay(500); /* 延时大约 500ms */114 }115116 return 0;117 }

main.c 文件里面一共有 7 个函数, 这 7 个函数都很简单。clk_enable 函数是使能CCGR0~CCGR6 所控制的所有外设时钟。led_init 函数是初始化 LED 灯所使用的 IO,包括设置IO 的复用功能、IO 的属性配置和 GPIO 功能,最终控制 GPIO 输出低电平来打开 LED 灯。

led_on 和 led_off 这两个函数看名字就知道,用来控制 LED 灯的亮灭的。delay_short()和 delay()这两个函数是延时函数,delay_short()函数是靠空循环来实现延时的,delay()是对 delay_short()的简单封装, 在 I.MX6U 工作在 396MHz(Boot ROM 设置的 396MHz) 的主频的时候delay_short(0x7ff)基本能够实现大约 1ms 的延时,所以 delay()函数我们可以用来完成 ms 延时。main 函数就是我们的主函数了,在 main 函数中先调用函数 clk_enable()和 led_init()来完成时钟使能和 LED 初始化,最终在 while(1)循环中实现 LED 循环亮灭,亮灭时间大约是 500ms。本实验的程序部分就是这些了,接下来即使编译和测试了。

新建 Makefile 文件,在 Makefile 文件里面输入如下内容:

1 objs := start.o main.o23 ledc.bin:$(objs)4 arm-linux-gnueabihf-ld -T0X87800000 -o ledc.elf $^5 arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@6 arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis 78 %.o:%.s9 arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $< 1011 %.o:%.S12 arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<1314 %.o:%.c15 arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<1617 clean:18 rm -rf *.o ledc.bin ledc.elf ledc.dis

上述的 Makefile里面用到了 Makefile 变量和自动变量,关于 Makefile 的变量和自动变量的请参考《Linux下Makefile文件的模式规则和自动化变量》。

第 1 行定义了一个变量 objs,objs 包含着要生成 ledc.bin 所需的材料:start.o 和main.o,也就是当前工程下的 start.s 和 main.c 这两个文件编译后的.o 文件。这里要注意 start.o 一定要放到最前面!因为在后面链接的时候 start.o 要在最前面,因为 start.o 是最先要执行的文件!

第 3 行就是默认目标,目的是生成最终的可执行文件 ledc.bin,ledc.bin 依赖 start.o 和 main.o如果当前工程没有 start.o 和 main.o 的时候就会找到相应的规则去生成 start.o 和 main.o。比如start.o 是 start.s 文件编译生成的,因此会执行第 8 行的规则。

第 4 行是使用 arm-linux-gnueabihf-ld 进行链接,链接起始地址是 0X87800000,但是这一行用刀了自动变量“$^”,“$^”的意思是所有依赖文件的集合,在这里就是 objs 这个变量的值:

start.o 和 main.o。链接的时候 start.o 要链接到最前面,因为第一行代码就是 start.o 里面的,因此这一行就相当于:

arm-linux-gnueabihf-ld -T0X87800000 -o ledc.elf start.o main.o

第 5 行使用 arm-linux-gnueabihf-objcopy 来将 ledc.elf 文件转为 ledc.bin,本行也用到了自动变量“$@”,“$@”的意思是目标集合,在这里就是“ledc.bin”,那么本行就相当于:

arm-linux-gnueabihf-objcopy -O binary -S ledc.elf ledc.bin

第 6 行使用 arm-linux-gnueabihf-objdump 来反汇编,生成 ledc.dis 文件。

第 8~15 行就是针对不同的文件类型将其编译成对应的.o 文件,其实就是汇编.s(.S)和.c 文件,比如 start.s 就会使用第 8 行的规则来生成对应的 start.o 文件。第 9 行就是具体的命令,这行也用到了自动变量“$@”和“$

start.o:start.sarm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o start.o start.s

第 17 行就是工程清理规则,通过命令“make clean”就可以清理工程。

Makefile 文件就讲到这里,我们可以将整个工程拿到 Ubuntu 下去编译,编译完成以后可以使用软件 imxdownload 将其下载到 SD 卡中,命令如下:

chmod 777 imxdownload //给予 imxdownoad 可执行权限,一次即可./imxdownload ledc.bin /dev/sdd //下载到 SD 卡中

使用软件 imxdownload 将编译出来的ledc.bin 烧写到 SD 卡中,命令如下:

chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可./imxdownload ledc.bin /dev/sdd //烧写到 SD 卡中

烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板,如果代码运行正常的话 LED0 就会以 500ms 的时间间隔亮灭。

LED0闪烁

c语言延时函数delay延时一秒_IMX6UL裸机实现C语言LED实验相关推荐

  1. c语言不用死等的延时函数,matlab延时函数怎么写

    1. c语言延时函数delay,怎么算延时 下面是delay 函延迟函数里执行的都是空语句,也就是说通过循环执行空语句来达到延迟的目的.每执行一条语句,即使是空语句都要耗费电脑一些处理时间的,就是因为 ...

  2. 简述一下延时函数delay怎么用

    void delay(unsigned int t) //括号里面的是参数,可以定义在函数前面,这里为了方便就定义在这里{while(t--): //将t定义为无符号整型,16位,是为了能延时更长时间 ...

  3. LPC1768配置系统延时函数(10纳秒级别和1MS级别)

    最近需要用到一个高精度的延时函数,且时间刻度比较小(纳秒),在查看了寄存器手册和网友的代码以后写了以下两个延时,分别是10纳秒和1毫秒级别的延时函数. 如下: void Delay_10ns(uint ...

  4. 单片机自定义延时函数Delay取值详解

    我们想实现一个定时延时函数,在单片机里并没有什么sleep,需要我们自己实现. 延时函数跟 晶振频率 有很大的关系,因为晶振频率影响程序执行速度. 1.打开Keil 4 - Target Option ...

  5. matlab怎样编写延时函数,编写延时函数的简单方法

    原标题:编写延时函数的简单方法 如果从keil里看了c语言的反汇编代码然后根据晶振和指令计算延时的时间这样虽然非常的准确但是相当的麻烦而且容易搞错,我这里介绍一个最简单的方法.可以验证你的 这里用一个 ...

  6. python中延时函数_python延时函数

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 可以使用python的time模块来实现类似于c中的sleep函数作用代码如下: ...

  7. c16语言延时函数delay,《linux设备驱动开发详解》笔记——10中断与时钟

    10.1 中断与定时器 中断一般有如下类型: 内部中断和外部中断:内部中断来自CPU,例如软件中断指令.溢出.除0错误等:外部中断有外部设备触发 可屏蔽中断和不可屏蔽中断 向量中断和非向量中断,ARM ...

  8. 延时函数delay与sleep有什么区别呢?

    在VC中使用带上头文件 #include <windows.h> 注意: 在VC中Sleep中的第一个英文字符为大写的"S" 在标准C中是sleep, 不要大写.. 下 ...

  9. c语言 如何让程序等待一定的时间 sleep 头文件 delay,如何让C语言sleep()函数等待时间小于1秒?...

    sleep()函数大概只能精确到50ms左右,你用sleep(10)是肯定不行的,如果你要精确的定时的话可以使用QueryPerformanceFrequency()函数,用法为: LARGE_INT ...

最新文章

  1. 在线试玩,在体感游戏中打败泰森,这位小哥破解了任天堂「拳无虚发」
  2. 【paper】BlazeFace: Sub-millisecond Neural Face Detection on Mobile GPUs
  3. mysql for mac中文_mysql for Mac 下创建数据表中文显示为?的解决方法
  4. mysql replace first_Java replaceFirst()方法
  5. SCU 4444: Travel(最短路)
  6. Pyinstaller使用教程
  7. php主页备案号底部中间,如何将网站备案号放到网站底部
  8. 如何安装uclient_uclient软件下载|
  9. talib 安装与使用
  10. Ubuntu 配置 SFTP 服务器
  11. 软件测试之接口自动化面试题汇总
  12. 华硕Android原始密码,华硕路由器默认密码是多少?ASUS路由器初始密码介绍
  13. 万丈高楼平地起 功夫不负有心人
  14. qq家园里游戏c语言,盘点腾讯旗下5款过气游戏,全部玩过的人都该结婚了吧
  15. crc生成多项式java_CRC 生成多项式
  16. 阿里云视频点播-对接注意点
  17. vue 超出三行隐藏_文字超出三行省略...显示全文
  18. HTML 的静态网页分页样式
  19. flash在线视频播放器
  20. mysql:取group by第一条数据

热门文章

  1. AMD桌面处理器Roadmap也已泄露
  2. How To Set Up a TCP/IP Peer-to-Peer Network Connection
  3. 最新 C++的iostream标准库介绍(1)
  4. 学习编程的过程中可能会走哪些弯路,有哪些经验可以参考?
  5. 2019北妈和你:活着就意味必须要做点什么,请好好努力
  6. 人人都是程序员的节奏,Python 纳入高考
  7. 别怕,是我......程序猿
  8. Boss黑话,老板看完都笑了!
  9. android 渠道方案,Android多渠道打包时获取当前渠道的方法
  10. “harmony”整合不同平台的单细胞数据之旅