• NanoPC裸机LED操作


    这个寒假准备认真研究一下NanoPC,我的开发环境:

    • 开发板:NanoPC-T1
    • 宿主机:VirtualBox for Mac, ubuntukylin-15.10-desktop-i386(32位)
    • 交叉编译工具:arm-linux-gcc-4.5.1

    一、硬件原理说明

    NanoPC上有两个LED,位置如下图所示:

    在原理图中搜索“LED”,查看相关电路:

    由原理图可知,NanoPC上的两个LED灯,分别由GPM4_0和GPM4_1控制,当GPIO引脚为高电平时,LED灯熄灭,当GPIO的引脚为低电平时LED点亮。我们要做的就是编写程序,将GPM4_0和GPM4_1设置为输出功能,通过控制输出电平即可控制LED灯。

    二、编写程序

    查Exynos4412手册,可知GPM4的控制寄存器为GPM4CON,地址为0x11000000+0x2E0,GPM4_0由GPM4CON[3:0]控制,GPM4_1由GPM4CON[7:4]控制,要想将端口设置为输出,只需将0x1写入响应控制位即可。GPM4的数据寄存器为GPM4DAT,地址为0x11000000+0x2E4,欲点亮LED1只需将GPM4DAT的bit[0]设为0,欲点亮LED2只需将GPM4DAT的bit[1]设为0。

    .text
    .global _start
    _start:
    
    /* set GPM4 as output */
    ldr r0, =0x110002E0 /* address of GPM4CON */
    ldr r1, [r0] /* read the value of GPM4CON to r1 */
    bic r1, r1, #0xff   /* clear bit[7:0] */
    orr r1, r1, #0x11   @ set bit[7:0] = 0b00010001
    str r1, [r0] @ write back to GPM4CON
    
    @ set GPM4DAT[0] and GPM4DAT[1] to low turn on the leds
    @ set GPM4DAT[0] and GPM4DAT[1] to high turn off the leds
    ldr r0, =0x110002E4 @ address of GPM4DAT
    ldr r1, [r0] @ read out the data
    
    loop:
    bic r1, r1, #0x3 @ light on the two leds
    str r1, [r0] @ write back to GPM4DAT
    ldr r2, =0xffffff
    bl delay
    
    bic r1, r1, #0x3
    orr r1, r1, #1 @ set bit[0]=0 turn on LED1
    str r1, [r0]
    ldr r2, =0xffffff
    bl delay
    
    bic r1, r1, #0x3
    orr r1, r1, #2 @ set bit[1]=0 turn on LED2
    str r1, [r0]
    ldr r2, =0xffffff
    bl delay
    
    orr r1, r1, #0x3
    str r1, [r0] @ turn off the two leds
    ldr r2, =0xffffff
    bl delay
    
    b loop
    
    delay:
    sub r2, r2, #1
    cmp r2, #0x0
    bne delay
    mov pc, lr

    Makefile:

    led.bin: led.s
        arm-linux-gcc -c -o led.o led.s
        arm-linux-ld -Tled.lds -N led.o -o led.elf
        arm-linux-objcopy -O binary -S led.elf led.bin
        arm-linux-objdump -D -m arm led.elf > led.dis
    clean:
        rm -f *.dis *.bin *.elf *.o

    链接脚本led.lds:

    SECTIONS {
        . = 0x02023400;
        .text :
        {
            *(.text)
        }
        .rodata ALIGN(4) :
        {
            *(.rodata*)
        }
        .data ALIGN(4) :
        {
            *(.data*)
        }
        .bss ALIGN(4) :
        {
            *(.bss)
            *(COMMON)
        }
    }

    BL1把BL2(用mkbl2工具把我们的led.bin处理成BL2)复制到0x02023400处,然后执行它。

    mkbl2由V310-EVT1-mkbl2.c编译而成,因为我们的程序比较短,需要对这个文件进行改写,注释掉其中的长度检查部分。

    用sd_fusing将BL1,BL2烧写在SD卡上,NanoPC上电后从SD卡启动,可以看到“双灯亮、LED1亮、LED2亮、双灯灭”不断循环。

    sd_fusing的内容也需要做响应的改写。

  • 相关阅读:
    【转】使用外部看门狗请三思!
    【转】一招解决MCU启动异常
    【转】电源芯片选型,容易忽略的“QC”
    【转】为什么 MQTT 是最适合物联网的网络协议
    【转】中国芯酸往事
    函数输入参数类型为枚举时,则限定函数参数的接收范围,非枚举值输入则错误
    函数形参为指针与非指针的区别
    【转】函数中的形参问题(指针形参、引用形参、二重指针作为形参)
    【转】Example of using the --info linker option
    【转】STM32
  • 原文地址:https://www.cnblogs.com/brep/p/5132486.html
Copyright © 2020-2023  润新知