esp32笔记[18]-使用汇编在riscv架构的esp32c3点灯

news/2024/9/19 23:46:45/文章来源:https://www.cnblogs.com/qsbye/p/18401244

摘要

使用esp-idf工具链编译汇编程序实现在riscv架构的esp32c3点灯.

Abstract

Compiling an assembly program using the esp-idf toolchain to blink an LED on the RISC-V based ESP32-C3.

原理简介

esp32c3的riscv架构

[https://www.bilibili.com/read/cv21025938/]
[https://smist08.wordpress.com/tag/assembly-language/]
[https://www.elektor.com/risc-v-assembly-language-programming-using-esp32-c3-and-qemu-e-book]
[https://github.com/bigmagic123/esp32c3_bare_metal]
[https://esp32.com/viewtopic.php?t=27734]
[https://github.com/TimSchulzRC/ESP32C3_Assembly_blink]
Focusing on the CPU resource, Espressif states that the ESP32-C3 device supports the RV32IMC ISA. Therefore, the following base and extensions are supported:
• I - Base Integer Instruction Set, 32-bit
• M - Standard Extension for Integer Multiplication and Division
• C - Standard Extension for Compressed Instructions

专注于CPU资源,Espressif公司给出了ESP32-C3设备支持RV32IMC指令集架构。因此,ESP32-C3支持RV32IMC ISA,即以下基础和扩展:
• I - 32位基本整数指令集
• M - 整数乘法和除法的标准扩展
• C - 压缩指令的标准扩展

(来源:Warren Gay - RISC-V Assembly Language Programming. Using ESP32-C3 and QEMU-Elektor International Media (2022)(Z-Lib.io))

esp32c3时钟频率

  • ESP32-C3 只支持 40MHz 晶振(精度为 ± 10 p p m ),匹配电容 C15 和 C17 的取值需要经过测试之后再行确定。
  • 每个ESP32定时器都是使用APB时钟(一般是80MHz)作为基础时钟。
  • 该定时器使用APB_CLK 时钟源(通常为80 MHz),时钟频率偏差小于±10 ppm,时间分辨率为1 μs。

运行二进制的一般过程

编译->链接->执行,这里使用汇编代码,但是还是需要使用esp-idf工具链进行编译以生成正确的app.bin(blink.bin)文件.

esp-idf生成的二进制文件

  1. bootloader.bin : 引导程序
  2. partition.bin : 分区地址
  3. blink.bin : 应用程序(反编译生成的blink.dump.s和源程序main.s不一致)

实现

git clone https://github.com/TimSchulzRC/ESP32C3_Assembly_blink.git
cd ESP32C3_Assembly_blink
  1. 修改汇编程序指向正确的io口
    main/main.s
.data
LED_PIN: .word 12              # 定义一个名为LED_PIN的变量,值为12,通常代表LED所连接的GPIO编号
C3_GPIO: .word 0x60004000      # 定义一个名为C3_GPIO的变量,值为0x60004000,通常这是GPIO寄存器的基址.text
.global app_main               # 声明app_main函数为全局可见
app_main:                      # app_main函数开始lw      a0, C3_GPIO    # 将C3_GPIO的值加载到寄存器a0,即GPIO寄存器的基址lw      a1, LED_PIN    # 将LED_PIN的值加载到寄存器a1,即LED的GPIO编号# Aktiviere den Outputli      t0, 1          # 将立即数1加载到寄存器t0sll     t0, t0, a1     # 将t0左移a1位,构建出LED对应的位掩码sw      t0, 32(a0)     # 将位掩码写入到GPIO输出使能寄存器,使能LED对应的GPIO输出toggle_led:                    # toggle_led标签,用于切换LED状态# Schalte LED an oder auslw      t4, 4(a0)      # 从GPIO输出寄存器加载当前状态到t4xor     t4, t4, t0     # 通过异或操作切换LED对应的位状态sw      t4, 4(a0)      # 将新的状态写回GPIO输出寄存器,切换LEDli      t5, 0          # 将立即数0加载到寄存器t5,用于计数li      t6, 10000000   # 将立即数10000000加载到寄存器t6,作为延迟计数loop:                          # loop标签,用于创建延迟addi    t5, t5, 1      # 将t5加1blt     t5, t6, loop   # 如果t5小于t6,则跳转到loop,继续延迟j       toggle_led     # 跳转到toggle_led,切换LED状态
  1. 编译
docker pull espressif/idf:release-v4.4
alias esp-idf='docker run --rm --privileged -v $PWD:/project -w /project -it espressif/idf:release-v4.4 bash -c'
esp-idf "cd /project && idf.py build"
  1. 烧录
esptool.py --chip auto --port /dev/cu.wchusbserial56910187941 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 80m 0x0 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/blink.bin
  1. (可选)反编译
/Applications/riscv-gnu-toolchain/xpack-riscv-none-elf-gcc-14.2.0-1/bin/riscv-none-elf-objdump -d build/blink.elf > build/blink.dump.s
cat build/blink.dump.s

效果

io12的灯闪烁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/793323.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、编程语言简介与C++

编程语言是编程的工具 计算机系统是分层的编程语言是软件,也i是分层的

AI证件照,抠图、换背景、任意尺寸...有了这个神器,证件照通通自己搞定(本地化部署教程)

最近有个Github开源的AI证件照神器火了,以后再也不用专门跑一趟照相馆拍证件照了! 你随手一张日常生活照或自拍,上传到它那里,分分钟就能帮你换上。 蓝底、白底,抠掉杂乱的背景,生成各种尺寸规格的证件照。 这款名叫HivisionIDPhotos的开源工具,它不仅能帮你便捷地制作出免冠白…

软件工程导论作业 2:python实现论文查重

github项目地址这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229这个作业的目标 通过Python开发个人项目,实现项目单元测试1.PSP表格PSP2.1 Personal Software P…

【工具推荐】Jeecg_Tools v1.0(最新版) - jeecg框架一键漏洞利用getshell

工具介绍: Jeecg_Tools是一款jeecg框架漏洞利用工具。本工具为jeecg框架漏洞利用工具非jeecg-boot! 下载链接: 链接:https://pan.quark.cn/s/9a1016a03402使用说明 运行于jdk8环境 java -jar Jeecg_Tools-1.0-java8.jar功能: 包含poc: 登录绕过检测 jeecgFormDemo文件上传…

必应每日壁纸API封装

简介 这个类封装了必应首页的每日壁纸查看功能,提供了查看、保存壁纸的方法,最大支持查看近8天的壁纸 使用方法 async Task Main() {try{var bing = BingWallpaperAPI.CreateInstance(8); //初始化,参数8表示一共会加载8张图片var task = await bing.Current();task.Wallpap…

第17篇 RabbitMQ安装详细步骤

一.RabbitMQ是什么? RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 ​ AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。…

How to create the Gold gold using RGB color values All In One

How to create the Gold gold using RGB color values All In OneHow to create the Gold gold using RGB color values All In One如何使用 RGB 颜色值创建金色Gold (Golden) Color Color Name: Gold (Golden) Hex Color Code: #FFD700 RGB Color Code: RGB(255, 215, 0) CMYK…

代码整洁之道--读书笔记(3)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

谈谈Spring中的BeanPostProcessor接口(转)

原文:谈谈Spring中的BeanPostProcessor接口 作者:特务依昂一. 前言这几天正在复习Spring的相关内容,在了解bean的生命周期的时候,发现其中涉及到一个特殊的接口——BeanPostProcessor接口。由于网上没有找到比较好的博客,所有最后花了好几个小时,通过Spring的官方文档对它…

【python】打包神器--pyinstaller

1:简介pyinstaller是一个python的第三方库,它能够在Windows、Linux、 Mac OS 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个独立文件方便传递和管理。在Windows上使用就打包成.exe文件。在Mac上使用…

MYSQL的安装与配置流程

MYSQL的安装与配置流程 1.下载安装包 mysql官方下载链接2.解压并配置文件用管理员身份打开命令提示符进入解压的地址中使用一下命令安装MySQL服务mysqld install MySQL80 若显示下面失败的提示可以使用该指令卸载该服务后再重新安装 mysqld -remove MySQL80//此处为直接修改的服…