前言

前面通过汇编语言点亮LED,代码虽然简单,但并不是很直观。这次使用熟悉的C语言来控制LED,但是需要注意的地方有两点,第一,要想使用C语言,首先需要在调用C语言代码之前设置好堆栈;第二,调用C语言函数时,是需要相对跳转还是绝对地址跳转,还是两者都可以,这就需要知道代码是否运行在链接地址处,是位置无关的还是位置有关的。从前面分析可以知道,我们的代码是运行在链接地址处的,因此可以用直接进行函数的调用。

一、目的

使用C语言的方式操作板载LED。

二、源代码说明

start.S文件。首先禁止CPU的IRQ和FIQ,设置为管理模式,然后设置堆栈指针,最后调用C语言的main函数。

  1. /*
  2. * (C) Copyright conan liang <lknlfy@163.com>
  3. *
  4. */
  5.  
  6. /* global entry point */
  7. .globl _start
  8. _start: b reset
  9.  
  10. reset:
  11. /* disable IRQ & FIQ, set the cpu to SVC32 mode */
  12. mrs r0, cpsr
  13. and r1, r0, #0x1f
  14. teq r1, #0x1a
  15. bicne r0, r0, #0x1f
  16. orrne r0, r0, #0x13
  17. orr r0, r0, #0xc0
  18. msr cpsr, r0
  19. /* setup stack, so we can call C code */
  20. ldr sp, =( * )
  21. /* call main function */
  22. bl main
  23. loop:
  24. b loop

main.c文件。首先初始化LED所在IO管脚,设置为输出功能,并且输出低电平,即一开始两个LED是熄灭的。

  1. #include "led.h"
  2.  
  3. /* just for test */
  4. static void delay(void)
  5. {
  6. unsigned int i;
  7.  
  8. for (i = ; i < ; i++);
  9. }
  10.  
  11. /* C code entry point */
  12. int main(void)
  13. {
  14. /* init PIO */
  15. led_init();
  16.  
  17. while () {
  18. /* two LEDs on */
  19. set_led_on();
  20. delay();
  21. /* two LEDs off */
  22. set_led_off();
  23. delay();
  24. }
  25.  
  26. return ;
  27. }

led.c文件。LED驱动程序,一个初始化函数,一个使两个LED同时点亮函数,一个同时使两个LED同时熄灭函数。

  1. #include "led.h"
  2. #include "io.h"
  3.  
  4. /* set two LEDs on */
  5. void set_led_on(void)
  6. {
  7. unsigned int tmp;
  8.  
  9. /* PH20 and PH21 output 1 */
  10. tmp = readl(PH_DAT);
  11. tmp |= (0x1 << );
  12. tmp |= (0x1 << );
  13. writel(tmp, PH_DAT);
  14. }
  15.  
  16. /* set two LEDs off */
  17. void set_led_off(void)
  18. {
  19. unsigned int tmp;
  20.  
  21. /* PH20 and PH21 output 0 */
  22. tmp = readl(PH_DAT);
  23. tmp &= ~(0x1 << );
  24. tmp &= ~(0x1 << );
  25. writel(tmp, PH_DAT);
  26. }
  27.  
  28. /* init PIO */
  29. void led_init(void)
  30. {
  31. unsigned int tmp;
  32.  
  33. /* set PH20 and PH21 output */
  34. tmp = readl(PH_CFG2);
  35. tmp &= ~(0x7 << );
  36. tmp &= ~(0x7 << );
  37. tmp |= (0x1 << );
  38. tmp |= (0x1 << );
  39. writel(tmp, PH_CFG2);
  40. /* set PH20 and PH21 output 0 */
  41. tmp = readl(PH_DAT);
  42. tmp &= ~(0x1 << );
  43. tmp &= ~(0x1 << );
  44. writel(tmp, PH_DAT);
  45. }

三、验证

使用arm-linux-gnueabihf工具编译后生成led_c.b文件,再使用mksunxiboot工具在led_c.b文件前面加上一个头部,最终生成led_c.bin文件,使用以下命令将led_c.bin文件烧写到TF中:

#sudo dd if=./led_c.bin of=/dev/sdb bs=1024 seek=8

将TF卡插入Cubieboard2,上电即可看到两个LED同时闪烁。效果不好用图片展示,因此就不上图了。

Cubieboard2裸机开发之(三)C语言操作LED的更多相关文章

  1. Cubieboard2裸机开发之(四)定时器操作

    前言 在Cubieboard2裸机开发之(三)里用到了一个延时函数delay,它的延时时间是不精确的,因此为了能够精确延时,就需要定时器的配合.定时器可以精确延时的一个重要原因是它的计时时钟(或者说频 ...

  2. Cubieboard2裸机开发之(五)看门狗操作

    前言 说到看门狗,应该不会陌生,看门狗说白了就是一个定时器,但是它有一个非常重要的功能就是复位系统.在A20里,看门狗的操作非常简单,只有两个寄存器,不需要操作时钟相关的东西,系统起来后可以直接使用, ...

  3. Cubieboard2裸机开发之(二)板载LED交替闪烁

    前言 电路原理在文章http://www.cnblogs.com/lknlfy/p/3583806.html中已经说明,两个LED的原理图是一样的.要使两个LED交替闪烁,只需要在点亮蓝色LED,熄灭 ...

  4. Cubieboard2裸机开发之(一)点亮板载LED

    前言 CUbieboard2板载两个LED,一个绿色的,一个蓝色的,其中绿色LED通过三极管与PH20管脚连接,蓝色LED通过三极管与PH21管脚连接,这里只以蓝色LED为例,电路原理图如图1和图2所 ...

  5. 基于Html5 Plus + Vue + Mui 移动App开发(三)-文件操作(读取、保存、更新数据)

      随着手机的发展,现在越来越多的人选择在手机上看书.无论是专业书籍.文学.英语还是网络小说,在手机上看新闻成了人们处理零碎时间的办法.在智能手机里安装一个资讯APP,可以随时.随地查看自己想看的资讯 ...

  6. 39.C语言操作数据库

    一.准备工作: sqlite3工具集:链接:https://pan.baidu.com/s/1mjufXZa 密码:2ui7 安装步骤: 打开如下文件夹,找到sqlite3.dll,并放入系统目录 2 ...

  7. S3C2440—3.用点亮LED来熟悉裸机开发的详细流程

    文章目录 一.硬件知识 1.LED原理图 2.芯片手册 Ⅰ.找LED原理图 Ⅱ.找对应引脚 Ⅲ.在芯片手册中查找引脚信息 Ⅳ.查看寄存器说明 Ⅴ.配置寄存器 二.S3C2440框架与启动过程 三.要用 ...

  8. 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

    前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法.学习任何一门语言,首先要掌握的肯定是语法.学习C语言语法的目的:就是能够利用C语言编写程序,然后运行程序跟硬件(计算 ...

  9. S3C2416裸机开发系列十六_sd卡驱动实现

    S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子    1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.传输数据快.可插拔.安全性好等长 ...

随机推荐

  1. Dynamic CRM 2015学习笔记 系列汇总

    这里列出所有 Dynamic CRM 2015学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址:Dynamic CRM 2015学习笔记 系列汇总 一 ...

  2. [游戏学习27] MFC 匀速运动

    >_<:理解上一个时间函数的概念和用法,本节的实现也比较简单 >_<:就是简单的绘图+时间函数 >_<:TicTac.h #define EX 1 //该点左鼠标 ...

  3. PHP将XML转成数组

    如果你使用 curl 获取的 xml data$xml = simplexml_load_string($data);$data['tk'] = json_decode(json_encode($xm ...

  4. iOS应用性能调优的25个建议和技巧

    本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以 ...

  5. ArrayList源码分析

    序言 第一次看源码,借鉴的是这位博主的文章:http://blog.csdn.net/csh624366188/article/details/6896656  个人觉得他写的一系列文章很好,稍微有点 ...

  6. Tomcat启动后快逸报表报错的解决方法

    SSH2+EasyUI项目用到了快逸报表,启动Tomcat后系统报错: Report System initing...... [2015-06-04 15:03:05] runqianReportL ...

  7. Mars的自语重出江湖,祝大家端午节安康

    上一篇博客似乎已是非常久远的回忆了,不再码字也已经很多年.<三国演义>里,刘备投靠曹操的那段时间里,2个兄弟问刘备未来,刘备说: 屈身守分,以待天时,不可与命争也. 这样一个时代,每个老百 ...

  8. android: 播放视频

    播放视频文件其实并不比播放音频文件复杂,主要是使用 VideoView 类来实现的.这个 类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器. VideoView 的用法和 ...

  9. 在 Xen 虚拟机下修改系统当前时间

    在 Xen 虚拟机下修改系统当前时间 Xen 虚拟机默认不允许不同的虚拟机使用不同的系统时间,因此所有虚拟机的系统时间都会同宿主机的系统时间严格同步,用 date 命令修改虚拟机系统时间时虽然提示成功 ...

  10. 分布式Hadoop安装(一)

    本文旨在介绍通过两台物理节点,实现完全分布式hadoop程序的部署 writen by Bob Pan@20140609 环境介绍: 主机名 机器IP 用途 描述 Hadoop0 192.168.80 ...