刚才在jz2440板子上写了一个点亮中间led的程序,前前后后十几分钟才好。最终代码

本节内容:

  1. 汇编点灯

  2. C点灯

  3. 参数选择点灯

  4. 按键点灯

1. 汇编点灯

.text
.global _start _start:
/* 在这个程序中,完成点亮中间的led灯D11
* GPF5 从原理图得知,低电平点亮
* GPFCON 0x56000050
* GPFDAT 0x56000054 */
ldr r0, =0x56000050
ldr r1, =0x400
str r1, [r0] mov r0, #
ldr r1, =0x56000054
str r0, [r1]
halt:
b halt

makefile如下

all:
arm-linux-gcc -c -o led_on.o led_on.S
arm-linux-ld -Ttext led_on.o -o led_on.elf
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
arm-linux-objdump -D led_on.elf > led_on.dis
clean:
rm *.bin *.o *.elf

这个点灯程序还是比较简单的,在原理图上找到led连接的io口,在看一下高低电平点亮。

然后,往配置寄存器地址里面写配置io口的配置输出。往数据寄存器地址写入输出高低电平,即可。

在makefile文件中,用arm-linux-gcc编译器:.s -> .o -> .elf -> .bin 就有了bin文件可以烧到板子上看一下现象。

2. C点灯

  刚才又写了两个程序。第一个,是用c程序点灯,汇编和c文件代码如下

.text
.global _start _start: ldr sp, = /* 调用c函数点灯*/
bl main halt:
b halt
int main()
{
unsigned int *pGPFCON = (unsigned int *)0x56000050;
unsigned int *pGPFDAT = (unsigned int *)0x56000054; *pGPFCON = 0x400;
*pGPFDAT = ; return ; }

点灯的功能在c文件中实现,但是调用c函数之前,需要设置栈,因为1)c程序的变量保存在栈中;2)调用c函数之前,要保存当前状态,保存在栈中。所以要设置好栈,就是sp寄存器。本代码只适应于nand启动,不适合nor启动,后面会补上,片内SRAM有4k,用作栈。

汇编中直接用bl xxx,就可以直接调用c文件中的函数 xxx 函数,c文件中实现点灯。

3. 参数选择点灯

第二个是在汇编文件中调用c函数时,传入参数,选择点亮那个led灯。

.text
.global _start _start: ldr sp, = /* nand启动 */ mov r0, #
bl main halt:
b halt
int main(int lednum)
{
unsigned int *pGPFCON = (unsigned int *)0x56000050;
unsigned int *pGPFDAT = (unsigned int *)0x56000054; if (lednum == )
{
*pGPFCON = 0x100;
*pGPFDAT = ;
return ;
}
if (lednum == )
{
*pGPFCON = 0x400;
*pGPFDAT = ;
return ;
}
if (lednum == )
{
*pGPFCON = 0x1000;
*pGPFDAT = ;
return ;
}
}

在汇编文件中调用c函数,用r0,r1,r2寄存器传入第一个、第二个、第三个参数,在c文件中正常接收即可,return位置可以在最后,但是这么写的话,可以少判断两条语句(如果第一条就返回)。

4. 按键点灯,刚才写了按键的点灯程序。功能:一个按键,一个led。按键按下,灯就亮,松开就灭。一共有三段程序,如下:

int main(int lednum)
{
unsigned int *pGPFCON = (unsigned int *)0x56000050;
unsigned int *pGPFDAT = (unsigned int *)0x56000054; unsigned int *pGPGCON = (unsigned int *)0x56000060;
unsigned int *pGPGDAT = (unsigned int *)0x56000064; // GPF4 ouput,先清位,再置为
*pGPFCON &= ~(<<) ;
*pGPFCON |= (<<) ; // GPF0 is input
*pGPFCON &= ~(<<);
*pGPGDAT &= ~(<<); *pGPFDAT = 0XFF; while ( )
{
// 第一段代码:实现按下两 ,松开灭
/* if ( *pGPFDAT & ((1<<0)) )
*pGPFDAT |= (1<<4); // 没按下 灭 else
*pGPFDAT &= ~(1<<4); // 按下 on
*/
// 第二段代码:上电亮,按键无反应, (~(1<<0)) 不是0,所以不能用来判断
// 按键1,是GPF0,上面初始是FF,1111 1111,(1<<0) 是 0000 0001 取反是 1111 1110 与操作后,无论是否有按键按下,肯定是非0,真,执行当作按键按下,灯亮
/* if ( *pGPFDAT & (~(1<<0)) )
*pGPFDAT &= ~(1<<4); // 按下亮 else
*pGPFDAT |= (1<<4); // 没按下灭
*/ // 第三段代码:实现按下亮,松开灭
if ( !(*pGPFDAT & (<<)) )
*pGPFDAT &= ~(<<); // 按下亮
else
*pGPFDAT |= (<<); // 没按下灭
}
return ;
}

一共有三段代码,一三可以是实现功能,到那时第二段不可以,想了好半天,才发现问题,写在了注释了,以后,判断某位置的话,用第一种比较好,三有些麻烦。

之后还要写一个,按一下亮,再按一下灭的程序

总结:

1. 调用C函数之前要设置栈

2. 汇编调用C函数用r0,r1等寄存器传送参数。

3. 判断寄存器某位0或1的方法。rxx & (yy << zz)

嵌入式linux——点亮led灯(二)的更多相关文章

  1. C语言版——点亮LED灯,深入到栈

    在上一篇进行了汇编语言的编写之后,我们采用C语言来编写程序,毕竟C语言才是我们使用最多的语言. 仅仅是点亮LED灯显然太过于简单,我们需要分析最后的反汇编,了解函数调用栈,深入C语言骨髓去分析代码,并 ...

  2. 字符型设备驱动程序-first-printf以及点亮LED灯(三)

    根据  字符型设备驱动程序-first-printf以及点亮LED灯(二) 学习 修改函数 中的printf 为 printk. #include <linux/module.h> /* ...

  3. JZ2440开发板:用按键点亮LED灯(学习笔记)

    本文是对韦东山嵌入式第一期学习的记录之一,如有您需要查找的信息,可以继续往下阅读. 想要用按键点亮LED灯,就需要知道按键和LED灯的相关信息,这样才可以进行之后的操作.阅读JZ2440的原理图,可以 ...

  4. Raspberry PI 系列 —— 裸机点亮LED灯

    Raspberry PI 系列 -- 裸机点亮LED灯 背景 近期刚买了Raspberry PI B+,配置执行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了 ...

  5. 第二章之S5PV210在BL1中点亮LED灯

    1,u-boot中第一个入口在./arch/arm/cpu/armv7/start.S 翻到153行:如下图 前面都是进行一些基本设置,不用管. cpu_init_cp15设置协处理器, cpu_in ...

  6. 第7章 使用寄存器点亮LED灯

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  7. 第7章 使用寄存器点亮LED灯—零死角玩转STM32-F429系列

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  8. 30个物联网传感器小实验:三行代码点亮LED灯

    30个物联网传感器小实验:三行代码点亮LED灯 三行代码点亮LED灯 LED灯闪烁 LED灯调亮度 LED淡入淡出 不写一行代码点亮LED灯 全彩RGB灯 面包板 30个物联网传感器小实验:三行代码点 ...

  9. STM32F4 阿波罗寄存器点亮LED灯

    学习步骤: 使用寄存器点亮LED灯,需要进行如下的步骤,LED灯属于外设部分,首先需要开启外设的时钟使能,然后LED灯是PB1口,(芯片是正点原子的阿波罗),接着定义GPIOB口的输出模式,为上拉.推 ...

随机推荐

  1. JavaScript调用上下文(第九天)

    call与apply用法 使用哪个对象去调用相应的方法: var name="window"; var obj={ name:"obj" } function ...

  2. canvas绘图——根据鼠标位置进行缩放的实现原理

    以任一点 A 缩放的基本原理: A 点为鼠标位置,正常放大是以原点放大,那么放大后 A 点就会变到 A1 点的位置 x1, y1.然后再将画布进行位移,将 A1 的位置移动到 A,则完成以 A 点缩放 ...

  3. React 生命周期简介

       React 中组件的生命周期会经历如下三个过程:装载过程.更新过程.卸载过程. 装载过程:组件实例被创建和插入 DOM 树的过程: 更新过程:组件被重新渲染的过程: 卸载过程:组件从 DOM 树 ...

  4. Azure CosmosDB (6) 冲突类型和解决策略

    <Windows Azure Platform 系列文章目录> 当我们为CosmosDB配置多个Azure Region写入,就需要考虑冲突类型和解决策略. 对于配置了多个写入区域的 Az ...

  5. 发布一个PHP包到Packagist, 然后使用Composer安装

    Composer 能够方便的进行项目的依赖管理,  当我们发布一个包并且希望别人通过Composer安装的时候, 就需要将包发布到Composer的包仓库Packagist上面. 下面进行详细的说明一 ...

  6. CentOS 与Ubuntu 下配置IP地址

    1.CentOS配置方法如下: 用vi打开配置文件 [root@haha3 ~]#  vi /etc/sysconfig/network-scripts/ifcfg-eth0 写入以下配置 DEVIC ...

  7. 7.STM32中GPIO理解

    端口概述 在STM32中,每个I/O端口可以由软件配置成为输入/输出模式.复位期间或刚复位后,I/O端口被配置成浮空输入模式.所有的GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时, 它们可以被激 ...

  8. 开源在线分析诊断工具Arthas(阿尔萨斯)--总结

    阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯) arthas用法 启动demo java -jar arthas-demo.jar 启动 java -jar arthas-boot.jar at ...

  9. js无间隙向上滚动

    一.优点:div可以load:缺点:滚动的时候有点娘,磨磨唧唧,不够干脆爽快 html <div id="my_msg" class="my-msg bg-whit ...

  10. php如何和linux进行通讯

    FastCGI原理 FastCGI是一个运用于Http Server和动态脚本语言间通信的接口,多数流行的Http Server都支持FastCGI,包括Apache.Nginx和lighttpd等. ...