首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >esp32和esp8266编程

esp32和esp8266编程
EN

Stack Overflow用户
提问于 2020-09-15 10:45:48
回答 1查看 2.3K关注 0票数 0

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-15 19:21:48

可以很容易地找到这些工具。我安装了一个预置的tarball。

这是C和asm的混合,但您可以在所有asm中执行此操作。

这是针对esp8266的。

vectors.s

代码语言:javascript
运行
AI代码解释
复制
.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,a2,0
    ret.n

so.c

代码语言:javascript
运行
AI代码解释
复制
#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

代码语言:javascript
运行
AI代码解释
复制
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
}

构建

代码语言:javascript
运行
AI代码解释
复制
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

拆卸

代码语言:javascript
运行
AI代码解释
复制
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, a2, 0
40100115:   f00d        ret.n
    ...

40100120 <GET32>:
40100120:   0020c0          memw
40100123:   0228        l32i.n  a2, 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, a0, 0, 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, a1, 24
40100141:   fff9c1          l32r    a12, 40100128 <GET32+0x8>
40100144:   7109        s32i.n  a0, a1, 28
40100146:   0c2d        mov.n   a2, a12
40100148:   51d9        s32i.n  a13, a1, 20
4010014a:   41e9        s32i.n  a14, a1, 16
4010014c:   31f9        s32i.n  a15, a1, 12
4010014e:   fffd05          call0   40100120 <GET32>
40100151:   cfae32          movi    a3, 0xfffffecf
40100154:   103230          and a3, a2, 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, a12, 1
4010018e:   fff705          call0   40100100 <dummy>
40100191:   f59cd7          bne a12, a13, 4010018a <notmain+0x4e>
40100194:   fff546          j   4010016d <notmain+0x31>

然后,由于这是如何完成的,您不能使用esptool.py来准备文件,所以我自己制作了一个文件,并在这里获得了输出

代码语言:javascript
运行
AI代码解释
复制
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

把它变成这样

代码语言:javascript
运行
AI代码解释
复制
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

如果这个链接停止工作,那么谷歌esptool.py希望能找到一个。

然后闪现它

代码语言:javascript
运行
AI代码解释
复制
esptool.py --port /dev/ttyUSB5 write_flash -fm qio 0x00000 so.esp.bin

我使用的是一个便宜的nodemcu克隆。我在亚马逊上花了15美元买了5个。不需要额外的线/usb-uart等。

改变这些

代码语言:javascript
运行
AI代码解释
复制
for(rx=0;rx<800000;rx++)

至/自

代码语言:javascript
运行
AI代码解释
复制
for(rx=0;rx<400000;rx++)

并查看led闪烁速率的变化。

你只需自己戳几个寄存器,就可以很容易地用汇编语言编写这段代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63900236

复制
相关文章
jquery选择器用法_jQuery属性选择器
一、 基本选择器 1. ID选择器 ID选择器#id就是利用DOM元素的id属性值来筛选匹配的元素,并以iQuery包装集的形式返回给对象。 使用公式:(“#id”) 示例:(“#box”) //获取id属性值为box的元素 2. 元素选择器 元素选择器是根据元素名称匹配相应的元素。元素选择器指向的是DOM元素的标记名,也就是说元素选择器是根据元素的标记名选择的。 使用公式:(“element”) 示例:(“div”) //获取所有div元素 3.类名选择器 类选择器是通过元素拥有的CSS类的名称查找匹配的DOM元素。在一个页面中,一个元素可以有多个CSS类,一个CSS类又可以匹配多个元素,如果有元素中有一个匹配类的名称就可以被类选择器选取到。简单地说类名选择器就是以元素具有的CSS类名称查找匹配的元素。 使用公式:(“.class”) 示例:(“.box”) //获取class属性值为box的所有元素 4.复合选择器 复合选择器将多个选择器(可以是ID选择器、元素选择器或是类名选择器)组合在一起,两个选择器之间以逗号”,”分隔,只要符合其中的任何一个筛选条件就会被匹配,返回的是一个集合形式的jQuery包装集,利用jQuery索引器可以取得集合中的jQuery对象。 注意:多种匹配条件的选择器并不是匹配同时满足这几个选择器的匹配条件的元素,而是将每个匹配的元素合并后一起返回。 使用公式:(“selector1,selector2,……,selectorN”) selector1:一个有效的选择器,可以是ID选择器、元素选择器或类名选择器等 selector2:另一个有效的选择器,可以是ID选择器、元素选择器或类名选择器等 selectorN:(可选择)任意多个选择器,可以是ID选择器、元素选择器或类名选择器等 示例:(“div,#btn”) //要查询文档中的全部的<div>元素和id属性为btn的元素 5.通配符选择器
全栈程序员站长
2022/11/16
12.3K0
jQuery的addClass、siblings、removeClass、each、html、eq、show/hide用法
addClass() siblings() removeClass() each()
江一铭
2022/06/17
1.5K0
jQuery 选择器
原生 JS 获取元素方式很多,很杂,而且兼容性情况不一致,因此 jQuery 给我们做了封装,使获取元素统一标准。
星辰_大海
2020/10/09
2.9K0
jQuery 选择器
jquery 选择器
<script type="text/javascript"> $(".demo").click(function(){ alert() }) </script>
用户5760343
2019/10/08
1.6K0
jquery 选择器
[jQuery笔记] jQuery选择器
jquery选择器允许对html中的元素组合单个元素进行操作,jquery的选择器和css的选择器几乎大同小异,大致分为元素选择器、id选择器和类选择器。jquery的选择器基于元素的id、类、类型、属性、属性值等查找或选择html元素,基于已经存在的css选择器,另外,jquery也支持自定义选择器。
行 者
2019/12/05
1.8K0
jQuery选择器
说明: 可以使用length属性来判断标签是否选择成功, 如果length大于0表示选择成功,否则选择失败。
落雨
2022/03/01
30.4K0
jQuery 选择器
基本选择器 基本选择器是最简单的选择器,可以通过元素id、class和标签名等来直接查找DOM元素。 元素选择器 根据给定元素名匹配元素。如下选择的是所有div元素。 $("div").css("
静默虚空
2018/01/05
7.5K0
JQuery选择器
jQuery常用的事件: load:当文档加载时运行脚本 blur:当窗口失去焦点时运行脚本 focus:当窗口获得焦点时运行脚本 change:当元素改变时运行脚本 submit:当提交表单时运行脚本 keydown:当按下按键时运行脚本 keypress:当按下并松开按键时运行脚本 keyup:当松开按键时运行脚本 click:当单击鼠标时运行脚本 dblclick:当双击鼠标时运行脚本 mousedown:当按下鼠标按钮时运行脚本 mousemove:当鼠标指针移动时运行脚本 mouseout:当鼠标指针移出元素时运行脚本 mouseover:当鼠标指针移至元素之上时运行脚本 mouseup:当松开鼠标按钮时运行脚本 abort:当发生中止事件时运行脚本
我不是费圆
2020/09/21
7.5K0
JQuery选择器
1    $("*")      ---------选取所有元素 2   $(this)     --------选择当前HTML元素 3   $("p.a")   -----选取p元素下class为a的元素 4   $("p:first")  ----选取第一个p元素 5   $("ul li:first-child") ----选取ul下第一个li元素 6  $("tr:even")  -------选取偶数位置下的tr 7 $("tr :odd")   --------选取奇数位置的tr
用户3159471
2018/09/13
1.7K0
jQuery(选择器)
注意:但是:first-child选择器可以匹配多个:即为每个父级元素匹配第一 个子元素。这相当于:nth-child(1);
全栈开发日记
2022/05/12
1.5K0
jQuery 选择器
原生 JS 获取元素方式很多,很杂,而且兼容性情况不一致,因此 jQuery 给我们做了封装,使获取元素统一标准。
清出于兰
2020/10/26
1.8K0
jQuery 选择器
jquery选择器
jquery选择器可以快速地选择元素,选择规则和css样式相同,使用length属性判断是否选择成功。
Devops海洋的渔夫
2019/05/30
1.8K0
jQuery 选择器
jQuery网页脚本语言核心之一 概述: 1. 选择器是jQuery的基础 2. 对事件处理,遍历DOM和Ajax操作都依赖于选择器 3. 可简化代码 什么是jQuery选择器? 层叠样式表 良好地继承了css选择器语法,还继承了其获取页面元素便捷高效的特点 于css不同,jQuery选择器获取元素后,为该元素添加的是行为 有良好的兼容性 优势 1. 简洁的写法 (1) $(选择) 2. 完善的处理机制 (1) 简洁,避免某些错误 类型: 可通过css选择器和过滤选择器两种方式选择元素,每种又有不同的方法来
房上的猫
2018/04/18
2.7K0
jQuery 选择器
Jquery选择器
1、  基本选择器 选择器 描述 结果 示例 #id 根据id获取元素 单个 $(“#myid”)选取id的值为myid的元素 .class 根据class获取元素 集合 $(“.myclass”)选取class的值为myclass的元素 a,p,img等html标签 根据指定的html标签获取元素 集合 $(“img”)选取所有的img标签 * 获取所有的元素 集合 $(“*”)获取所有标签元素 a,.myclass,#id等 获取对应标签元素 集合 $(“a,.myclass,
苦咖啡
2018/05/07
2K0
jQuery常用的选择器
当我们想要操所页面中的元素时,首先要做的就是选取元素。选取页面中元素可以使用jQuery给我们提供的$()方法,该方法需要提供选择器作为参数,方法执行完成后会返回给我们一个jQuery对象,被选取的元素就包含在该对象中。
小周sir
2019/09/23
7450
jquery的基本选择器
关于基本选择器包括 “*” ,“.class”,"element","#id","selector1 selementN" "*" 选择器,可以找到文档中的所有的元素,包括 head body $(function(){ // $("#test").find("*").css("border","3px solid red"); //找到 #test 这个元素下面的所有的 元素 //}); ".class" 选择给定样式类名的所有的元素。 //$(function
用户1197315
2018/01/19
6460
锋利的JQuery —— 选择器
图片猛戳链接
用户1154259
2018/01/17
7230
锋利的JQuery —— 选择器
jQuery选择器总结
本文主要介绍了jQuery选择器的使用,包括基本选择器、层次选择器、过滤选择器、内容过滤器、可见选择器、属性选择器和子元素选择器等。通过实例讲解了如何在JavaScript中使用这些选择器,以及如何使用表单元素过滤选择器。
IMWeb前端团队
2018/01/08
1.2K0
jQuery选择器总结
jQuery层次选择器
jQuery是一种流行的JavaScript库,用于简化HTML文档的操作和动态交互。在jQuery中,层次选择器是一种非常有用的选择器,可以根据元素之间的层次关系选择特定的元素。
堕落飞鸟
2023/05/18
4780
jquery 层级选择器
关于层级选择器。 $("parent > child") 选择所有指定“parent”元素中指定的“child”的直接子项元素。 parent :任何有效的选择器。 child: 用来筛选子元素的选择器 $(function(){ $("ul.myul > li").css("border","2px solid red"); //将ul带有.myul选择下面的li 标签添加边框。}); $("ancestor descendant") 选择给定的祖先元素的所有后代
用户1197315
2018/01/19
9120

相似问题

jQuery :eq(索引)选择器

20

jQuery嵌套:eq选择器

31

jQuery选择器eq:()不工作

24

jQuery eq()选择器不工作

41

jQuery选择器(子项、eq和innerhtml)

229
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文