历史上的今天
返回首页

历史上的今天

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

正在发生

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

2021-09-18 来源:eefocus

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);


    }

}

推荐阅读

史海拾趣

Belden Wire and Cable公司的发展小趣事

1902年,Joseph C. Belden在美国伊利诺伊州芝加哥创立了Belden公司。在创立初期,公司主要生产电线和电缆产品,并逐渐在行业内崭露头角。1905年,经过大量的实验和研究,Belden公司成功研发出“Beldenamel”绝缘材料,这种灵活的搪瓷绝缘材料极大地提升了线缆的性能和可靠性,为公司的早期发展奠定了坚实的基础。

Benchmarq Microelectronics Inc公司的发展小趣事

在半导体行业中,供应链的稳定性和可靠性对企业的发展至关重要。Benchmarq Microelectronics Inc深知这一点,因此始终注重供应链管理和合作伙伴关系的建立。公司与多家知名供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量可控。同时,公司还加强库存管理和物流配送,确保产品能够及时、准确地送达客户手中。这些努力不仅提升了公司的运营效率和市场竞争力,还为客户提供了更加便捷、高效的服务。

华瓷(Chinocera)公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,华瓷始终坚持创新引领的发展战略。公司加强与高校、科研机构的合作,共同研发新型陶瓷材料和生产技术。同时,华瓷还积极引进国内外先进的生产设备和制造工艺,不断提升自身的产业水平和核心竞争力。

Hi-Optel Technologly Co Ltd公司的发展小趣事

人才是企业发展的根本动力。华瓷深知这一点,因此在人才战略和团队建设上投入了大量精力。公司注重员工的培训和发展,为员工提供广阔的发展空间和良好的职业前景。同时,华瓷还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队为公司的发展提供了有力的支持和保障。

HCH Co公司的发展小趣事

背景:面对电子行业的快速变化和多元化需求,HCH Co公司意识到仅凭一己之力难以应对所有挑战。因此,公司积极寻求与其他行业的跨界合作机会,以共同推动电子行业的创新发展。

发展:通过与汽车、医疗、教育等多个行业的领军企业建立合作关系,HCH Co公司成功将自身的电子技术和产品应用于更广泛的领域。例如,与汽车制造商合作开发智能驾驶系统、与医疗机构合作研发远程医疗设备等。跨界合作不仅为公司带来了新的增长点,也促进了不同行业之间的技术交流和资源共享。未来,HCH Co公司将继续秉承开放合作的理念,与更多行业伙伴携手共创美好未来。

请注意,以上五个故事是基于假设构建的,旨在反映电子行业中企业可能的发展路径和趋势。实际情况中,“HCH Co”公司的具体发展故事可能有所不同。

Baneasa SA公司的发展小趣事

面对日益增长的市场需求,Baneasa SA意识到必须提升产能以满足客户的需求。于是,公司投入大量资金对生产线进行升级改造,引进了先进的生产设备和技术。这些举措使得Baneasa SA的产能得到了大幅提升,同时也保证了产品质量的稳定性和可靠性。

问答坊 | AI 解惑

pcb相关资料

PCB相关资料有吗?查到一个但上载不了…

查看全部问答>

有没有哪位大侠设计过这种电压-频率转换电路

输出频率与输入电压成正比,但是需要确保输出的波形(方波)占空比为一个固定的值。 拜谢!…

查看全部问答>

Mini2440 按键驱动程序详解

/*mini2440_buttons_my.c*/ /*后面加了_my*/ /*按键驱动程序*/ /*mini2440所用到的按键资源*/ /**************************************************/ /* 按键          对应的IO寄存器      ...…

查看全部问答>

m8最小系统原理图

想搞个m8最小系统的实验板 可是没有原理图 高手们给否给一张…

查看全部问答>

送分了进者有份啊

现有项目 个人 团队皆可合作 最好在广州或者深圳 有意邮件yqb_box@163.com 或者QQ:437395559 在PDA上做应用软件开发 PDA支持读卡器 条码扫描 CDMA GSM 网络 GPS 打印机等 应用相对简单 在PDA上能录入数据 检索服务器上的相关信息 驱动设备 设备 ...…

查看全部问答>

有人要热敏打印机驱动不,可以联系xgx_a1@163.com

有人要热敏打印机驱动不,可以联系xgx_a1@163.com…

查看全部问答>

如何在IAR442中产生bin/hex文件

                                 如何在IAR442中产生bin/hex文件,可用于flash loader…

查看全部问答>

大家学习STM32时会花很多精力去学习CM3底层架构吗?[转]

                                 大家学习STM32时会花很多精力去学习CM3底层架构吗?…

查看全部问答>

现在对430的时钟有点迷糊,希望高人指点?

ACLK,MCLK,SMCLK三个什么意思理解,可是有什么具体的关系,求指点?…

查看全部问答>

刚画了个简单的51仿PLC电路,各位大大们帮看一下哈!

我是新手,刚画了个简单的51仿PLC电路,想做个板子试试,但不知有没有什么问题,所以请大家帮指点一下。…

查看全部问答>