编程esp32和esp8266

如何解决编程esp32和esp8266

如何使用汇编程序对ESP32或ESP8266模块进行编程?我不想使用arduino ide。我想出了一种通过汇编对atmel芯片进行编程的方法。我想学习如何在汇编中对esp32和esp8266进行编程。

解决方法

可以轻松找到工具。我安装了预构建的tarball。

这是C和asm的混合,但是您可以全部使用asm。

这是用于esp8266。

vectors.s

.section .init
.globl _start
_start:
    call0 notmain
    ill
.balign 0x100
.globl dummy
dummy:
    ret.n
    
.balign 0x10
.globl PUT32
PUT32:
    memw
    s32i.n a3,a2,0
    ret.n
    
.balign 0x10
.globl GET32
GET32:
    memw
    l32i.n a2,0
    ret.n

so.c

#define GPIO_ENSET      0x60000310
#define GPIO_OUTSET     0x60000304
#define GPIO_OUTCLR     0x60000308
#define IOMUX_GPIO2     0x60000838

void dummy ( unsigned int );
void PUT32 ( unsigned int,unsigned int );
unsigned GET32 ( unsigned int );
void notmain ( void )
{
    unsigned int ra;
    unsigned int rx;
    ra=GET32(IOMUX_GPIO2);
    ra&=(~0x130);
    PUT32(IOMUX_GPIO2,ra);
    PUT32(GPIO_ENSET,1<<2);
    while(1)
    {
        PUT32(GPIO_OUTSET,1<<2);
        for(rx=0;rx<800000;rx++) dummy(rx);
        PUT32(GPIO_OUTCLR,1<<2);
        for(rx=0;rx<800000;rx++) dummy(rx);
    }
}

so.ld

MEMORY
{
    bob : ORIGIN = 0x40100000,LENGTH = 0x1000
    ted : ORIGIN = 0x3FFE8000,LENGTH = 0x1000
}
SECTIONS
{
    .init : { *(.init*) } > bob
    .literal : { *(.literal*) } > bob
    .text : { *(.text*) } > bob
    .rodata : { *(.rodata*) } > bob
    .data : { *(.data*) } > ted
    .bss : { *(.bss*) } > ted
}

构建

xtensa-lx106-elf-as --warn --fatal-warnings vectors.s -o vectors.o
xtensa-lx106-elf-gcc -Wall -O2 -ffreestanding -c so.c -o so.o
xtensa-lx106-elf-ld -nostdlib -nostartfiles -T so.ld vectors.o so.o -o so.elf
xtensa-lx106-elf-objdump -D so.elf > so.list
xtensa-lx106-elf-objcopy so.elf so.bin -O binary

反汇编

Disassembly of section .init:

40100000 <_start>:
40100000:   001385          call0   4010013c <notmain>
    ...

40100100 <dummy>:
40100100:   f00d        ret.n
    ...

40100110 <PUT32>:
40100110:   0020c0          memw
40100113:   0239        s32i.n  a3,0
40100115:   f00d        ret.n
    ...

40100120 <GET32>:
40100120:   0020c0          memw
40100123:   0228        l32i.n  a2,0
40100125:   f00d        ret.n

Disassembly of section .literal:

40100128 <.literal>:
40100128:   0838        l32i.n  a3,a8,0
4010012a:   106000          and a6,a0,a0
4010012d:   03              .byte 0x3
4010012e:   046000          extui   a6,1
40100131:   03              .byte 0x3
40100132:   006000          rsil    a0,0
40100135:   35              .byte 0x35
40100136:   000c        movi.n  a0,0
40100138:   0308        l32i.n  a0,a3,0
4010013a:   00              .byte 00
4010013b:   60              .byte 0x60

Disassembly of section .text:

4010013c <notmain>:
4010013c:   e0c112          addi    a1,a1,-32
4010013f:   61c9        s32i.n  a12,24
40100141:   fff9c1          l32r    a12,40100128 <GET32+0x8>
40100144:   7109        s32i.n  a0,28
40100146:   0c2d        mov.n   a2,a12
40100148:   51d9        s32i.n  a13,20
4010014a:   41e9        s32i.n  a14,16
4010014c:   31f9        s32i.n  a15,12
4010014e:   fffd05          call0   40100120 <GET32>
40100151:   cfae32          movi    a3,0xfffffecf
40100154:   103230          and a3,a3
40100157:   0c2d        mov.n   a2,a12
40100159:   fffb45          call0   40100110 <PUT32>
4010015c:   fff421          l32r    a2,4010012c <GET32+0xc>
4010015f:   430c        movi.n  a3,4
40100161:   fffac5          call0   40100110 <PUT32>
40100164:   fff3f1          l32r    a15,40100130 <GET32+0x10>
40100167:   fff3d1          l32r    a13,40100134 <GET32+0x14>
4010016a:   fff3e1          l32r    a14,40100138 <GET32+0x18>
4010016d:   430c        movi.n  a3,4
4010016f:   0f2d        mov.n   a2,a15
40100171:   fff9c5          call0   40100110 <PUT32>
40100174:   0c0c        movi.n  a12,0
40100176:   0c2d        mov.n   a2,a12
40100178:   cc1b        addi.n  a12,a12,1
4010017a:   fff845          call0   40100100 <dummy>
4010017d:   f59cd7          bne a12,a13,40100176 <notmain+0x3a>
40100180:   430c        movi.n  a3,4
40100182:   202ee0          or  a2,a14,a14
40100185:   fff885          call0   40100110 <PUT32>
40100188:   0c0c        movi.n  a12,0
4010018a:   0c2d        mov.n   a2,a12
4010018c:   cc1b        addi.n  a12,1
4010018e:   fff705          call0   40100100 <dummy>
40100191:   f59cd7          bne a12,4010018a <notmain+0x4e>
40100194:   fff546          j   4010016d <notmain+0x31>

然后由于此操作的完成,您不能使用esptool.py来准备文件,所以我制作了自己的文件,在这里获取了输出

hexdump -C so.bin 
00000000  85 13 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000100  0d f0 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000110  c0 20 00 39 02 0d f0 00  00 00 00 00 00 00 00 00  |. .9............|
00000120  c0 20 00 28 02 0d f0 00  38 08 00 60 10 03 00 60  |. .(....8..`...`|
00000130  04 03 00 60 00 35 0c 00  08 03 00 60 12 c1 e0 c9  |...`.5.....`....|
00000140  61 c1 f9 ff 09 71 2d 0c  d9 51 e9 41 f9 31 05 fd  |a....q-..Q.A.1..|
00000150  ff 32 ae cf 30 32 10 2d  0c 45 fb ff 21 f4 ff 0c  |.2..02.-.E..!...|
00000160  43 c5 fa ff f1 f3 ff d1  f3 ff e1 f3 ff 0c 43 2d  |C.............C-|
00000170  0f c5 f9 ff 0c 0c 2d 0c  1b cc 45 f8 ff d7 9c f5  |......-...E.....|
00000180  0c 43 e0 2e 20 85 f8 ff  0c 0c 2d 0c 1b cc 05 f7  |.C.. .....-.....|
00000190  ff d7 9c f5 46 f5 ff                              |....F..|
00000197

把它变成这个

hexdump -C so.esp.bin 
00000000  e9 01 00 00 00 00 10 40  00 00 10 40 98 01 00 00  |.......@...@....|
00000010  85 13 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000110  0d f0 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000120  c0 20 00 39 02 0d f0 00  00 00 00 00 00 00 00 00  |. .9............|
00000130  c0 20 00 28 02 0d f0 00  38 08 00 60 10 03 00 60  |. .(....8..`...`|
00000140  04 03 00 60 00 35 0c 00  08 03 00 60 12 c1 e0 c9  |...`.5.....`....|
00000150  61 c1 f9 ff 09 71 2d 0c  d9 51 e9 41 f9 31 05 fd  |a....q-..Q.A.1..|
00000160  ff 32 ae cf 30 32 10 2d  0c 45 fb ff 21 f4 ff 0c  |.2..02.-.E..!...|
00000170  43 c5 fa ff f1 f3 ff d1  f3 ff e1 f3 ff 0c 43 2d  |C.............C-|
00000180  0f c5 f9 ff 0c 0c 2d 0c  1b cc 45 f8 ff d7 9c f5  |......-...E.....|
00000190  0c 43 e0 2e 20 85 f8 ff  0c 0c 2d 0c 1b cc 05 f7  |.C.. .....-.....|
000001a0  ff d7 9c f5 46 f5 ff 00  00 00 00 00 00 00 00 ae  |....F...........|
000001b0

我会让您弄清楚,工具源可用。

https://github.com/espressif/esptool

如果此链接停止工作,请使用google esptool.py希望找到它。

然后闪烁

esptool.py --port /dev/ttyUSB5 write_flash -fm qio 0x00000 so.esp.bin

我正在使用便宜的nodemcu克隆。我在亚马逊上以15美元的价格购买了其中的5个。不需要多余的电线/ usb-uart等。

更改这些

for(rx=0;rx<800000;rx++)

往返

for(rx=0;rx<400000;rx++)

并查看led眨眼频率更改

您可以自己戳几个寄存器来轻松地在仅汇编中编写此代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?