历史上的今天

今天是:2024年09月18日(星期三)

正在发生

2021年09月18日 | ARM裸机点LED

发布者:oplndctkl出 来源: eefocus关键字:ARM  裸机 手机看文章 扫描二维码
随时随地手机看文章

1 汇编实现:

.global _start


_start:

    // 把外设的基地址告诉CPU

    ldr r0, =0x70000000                     //对于6410来说,内存(0x00000000~0x60000000),外设(0x70000000-0x7fffffff)

    orr r0, r0, #0x13                       //外设大小:256M

    mcr p15,0,r0,c15,c2,4                   //把r0的值(包括了外设基地址+外设大小)告诉cpu


    // 关看门狗

    ldr r0, =0x7E004000

    mov r1, #0

    str r1, [r0] 


    // 设置GPKCON0

    ldr r1, =0x7F008800                     

    ldr r0, =0x11110000                                                               

    str r0, [r1]


    mov r2, #0x1000

led_blink:

    // 设置GPKDAT,使GPK_4/5/6/7引脚输出低电平,LED亮

    ldr r1, =0x7F008808                     

    mov r0, #0

    str r0, [r1]


    // 延时

    bl delay                            


    // 设置GPKDAT,使GPK_4/5/6/7引脚输出高电平,LED灭

    ldr r1, =0x7F008808                     

    mov r0, #0xf0

    str r0, [r1]


    // 延时

    bl delay    


    sub r2, r2, #1

    cmp r2,#0

    bne led_blink


halt:

    b halt



delay:

    mov r0, #0x1000000

delay_loop:

    cmp r0, #0

    sub r0, r0, #1

    bne delay_loop

    mov pc, lr


Makefile:


led.bin: start.o

    arm-linux-ld -Ttext 0x50000000 -o led.elf $^

    arm-linux-objcopy -O binary led.elf led.bin

    arm-linux-objdump -D led.elf > led_elf.dis

%.o : %.S

    arm-linux-gcc -o $@ $< -c


%.o : %.c

    arm-linux-gcc -o $@ $< -c 


clean:

    rm *.o *.elf *.bin *.dis  -rf


2 . 用汇编跳转到C实现

// 设置栈

    ldr sp, =0x0c002000


    // 调用C函数点灯

    bl main

    //与全部用汇编实现不同的是加入了栈,有了栈就可以调用其他函数。调用前程序执行地址入栈,结束后出站便可以恢复调用前执行到的语句。


/*******  C  *******/

    void delay()

{

    volatile int i = 0x10000;

    while (i--);

}


int main()

{

    int i = 0x10;


    // 配置引脚

    volatile unsigned long *gpkcon0 = (volatile unsigned long *)0x7F008800;

    volatile unsigned long *gpkdat = (volatile unsigned long *)0x7F008808;


    *gpkcon0 = 0x11110000;


    // 跑马灯

    while (1)

    {

        *gpkdat = i;

        i++;

        if (i == 0x100 )

            i = 0x10;

        delay();

    }


    return 0;

}


虽然功能是一样的,但是发现灯闪烁的频率比直接用汇编实现的要低些,说明汇编的效率还是比c高。


这里makefile不过是led.bin 的依赖文件多了一个main.c 而已。


3 .加入icache

icache是cpu和内存中间的一种缓存,使用它可以加快cpu去指令的速度,不必每次都去内存中取。它是可以随时开启的,所以越早开启越好。


    // 开启icaches

#ifdef  CONFIG_SYS_ICACHE_OFF

    bic r0, r0, #0x00001000                 @ clear bit 12 (I) I-cache

#else

    orr r0, r0, #0x00001000                 @ set bit 12 (I) I-cache

#endif

    mcr p15, 0, r0, c1, c0, 0


汇编中加入以上代码便可以开启icache 。


4 . 按键控制LED

我的板子是tinySDK 1312B,但是我看原理图似乎和手册上说的对不上号,原理图上写的四个按键是链接到EINT16 ~ EINT19 的,对应的GPIO口也是GPL 端口,但是手册上说是GPN口,并且用程序配置为GPN口去控制LED还真是能控制,我也不太清楚什么情况,先用着吧,反正原理一样,有机会再请教大佬。

#define GPKCON0 (*(volatile unsigned long *)0x7F008800)

#define GPKDAT (*(volatile unsigned long *)0x7F008808)


#define GPNCON (*(volatile unsigned long *)0x7F008830)

#define GPNDAT (*(volatile unsigned long *)0x7F008834)


void main()

{

    int dat = 0;


    // 配置GPK4-7为输出功能

    GPKCON0 = 0x11110000;   


    // 所有LED熄灭

    GPKDAT = 0x000000f0;


    // 配置GPN为输入功能

    GPNCON = 0;


    // 轮询的方式查询按键事件

    while(1)

    {

        dat = GPNDAT;


        if(dat & (1<<0))                // KEY1被按下,则LED1亮,否则LED1灭

            GPKDAT |= 1<<4;

        else

            GPKDAT &= ~(1<<4);


        if(dat & (1<<1))                // KEY2被按下,则LED2亮,否则LED2灭

            GPKDAT |= 1<<5;

        else

            GPKDAT &= ~(1<<5);


        if(dat & (1<<2))                // KEY3被按下,则LED3亮,否则LED3灭

            GPKDAT |= (1<<6);

        else

            GPKDAT &= ~(1<<6);


        if(dat & (1<<3))                // KEY4被按下,则LED4亮,否则LED4灭

            GPKDAT |= 1<<7;

        else

            GPKDAT &= ~(1<<7);


    }

}

关键字:ARM  裸机 引用地址:ARM裸机点LED

上一篇:s3c2440内存类设备访问原理
下一篇:s3c6410 时钟设置

推荐阅读

苹果说今年的 iPhone 阵容上运行的是最智能、最强大的手机芯片。而从苹果的介绍来看,这个说法并没有什么不妥。新款 iPhone 使用的是 A12 仿生芯片,它代表了苹果 A 系列处理器的一次重要升级。 根据苹果的说法,A12 仿生处理器包含一个六核的 CPU、一个四核的 GPU 和新一代八核神经网络引擎(作为对比,去年的 A11 仿生芯片只有双核)。A1...
昨天上午,由工业和信息化部、中国工程院与上海市政府等部门共同主办的第21届中国国际工业博览会,正式在上海国家会展中心盛大开幕。该博览会为亚太地区规模最大、影响力最深远的工业博览会,是全球智能制造发展的风向标。仙知机器人CEO赵越先生、副总经理张绥先生、产品总监叶杨笙先生共同揭开发布仪式随着人工智能、大数据、物联网等新兴技术的发展,移...
LG昨晚正式发布了其双屏旋转手机LG Wing 5G,搭载高通骁龙765G芯片,提供8+128/256GB 存储,厚10.9毫米,重260克,提供极光灰和天空色两种配色。LG 方面未公布该机的价格,仅表示售价视运营商不同而不同,初期仅由Verizon 独家销售。但外媒Engadget表示该机售价约为1000美元,约为6809元人民币。LG Wing 采用两块屏幕联合使用,主屏幕是一块6.8英寸...
工业以太网技术具有价格低廉、稳定可靠、通信速率高、软硬件产品丰富、应用广泛以及支持技术成熟等优点,已成为最受欢迎的通信网络之一。 近些年来,随着网络技术的发展,以太网进入了控制领域,形成了新型的以太网控制网络技术。这主要是由于工业自动化系统向分布化、智能化控制方面发展,开放的、透明的通讯协议是必然的要求。 以太网技术引入工业控制...

史海拾趣

问答坊 | AI 解惑

[求助]请大家多多指导哦,电子闹钟(温度测量)的

传上我的图,请大家多多指导哦,电子闹钟(温度测量)…

查看全部问答∨

2007年全国大赛作品展示——&lt;程控滤波器&gt;

说起来也是2个月前的事了 最后以1分之差与全国奖失之交臂 铭记那每一个不眠之夜 再贴两张赛期工作写真~ …

查看全部问答∨

端口的操作会影响另一个端口的输出现

pic的型号是16F616,如果对RC4进行写操作,则不管RC1端口锁存器之前写入的是1或者是0,此时RC1管脚都会变成输出低电平。程序如下 //////////////////////////////////////////////////////////////////////////////////// # include <pic.h ...…

查看全部问答∨

基于单片机的激光警戒系统设计

光谱识别型激光警戒系统怎麽才能和单片机挂钩呢?我大4但对所学知识都没掌握,现在是写毕业设计的开题报告,但又不知道怎麽写,不知道怎麽将单片机这部分的材料放进我要写的东西里去。请高手们指点一二~小弟谢谢大家了…

查看全部问答∨

谁有S3C2410 5.0标准BSP包

我的2410 5.0BSP包是在4.2基础上移植过来的,谁有S3C2410 5.0标准BSP包,请发到我的邮箱,5iminimao@163.com。不胜感激。…

查看全部问答∨

频率对整流的影响

单相桥式整流中,交流电的频率对输出有何影响?…

查看全部问答∨

关于一个机械手臂的

        最近在接触一台日本生产的SRC-320机械臂,型号:EC251C。由于没有官方了论坛支持,没有卖家的详细资料供给。目前好不容易整到一个配套软件,其余的只能在网路上找到了一些相应的资料,比如说控制命令,错误分析。想要 ...…

查看全部问答∨

上传一个Stellaris MCU 的 Altium Designer 集成库

集成库,包括原理图库和 PCB 库,供需要的下载。  …

查看全部问答∨

ADC12单通道转换程序

采用数码管显示转换的电压 #include "delay.h" #define   Num_of_Results   32 static uint results[Num_of_Results]; uchar d[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar d1[11]={0xbf, ...…

查看全部问答∨

大整数乘法

  在做16位芯片(32位数据线)阵列运算器的测试时,需要用Visual Studio写C程序做大整数的加减乘除相关的运算。  发现一个奇怪的现象:    两个32位的数据相乘,放入一个64位的变量中,乘出来的结果64位,高32位全清零了。这不 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved