汇编led试验
为什么学习汇编
初始化外设、ddr、堆栈(设置sp指针,一般指向ddr,设置好c语言运行环境)
操作流程
灯原理图、参考手册、
初始化io流程
时钟
设置io复用,设为gpio
配置电气属性
设置输入、输出
输出高、低
arm汇编基础
设置sp指针
初始化ddr(芯片本身没有ram、或内部ddr控制器不开放给用户,代码需要在ddr中运行,需要汇编来初始化ddr控制器)
gnu汇编语法
略
一条一条指令构成
处理器内部数据传输指令
储存器访问指令(ram)
ldr
str
压栈和出栈指令
跳转指令
算数运算指令
逻辑运算指令
a7架构
9个模式
寄存器组
r0 - r15
cpsr
编写驱动
vscode
编译
编译程序
将.c .s文件变为 .o arm-linux-gnueabihf-gg -g -c leds.s -o led.o
将所有的 .o 文件连接为 elf格式的可执行文件 arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
将elf文件转为bin文件 arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
将elf文件反汇编(可选)arm-linux-gnueabihf-objdump -D led.elf > led.dis
连接就是:将所有的.o 文件连接在一起,并且连接到指定的地方。连接的时候要指定连接起始地址。连接起始地址就是代码运行的起始地址。对于 来说,连接地址指向ram地址(rom不对外开放)。ram分为内部ram和外部ram(ddr)。内部ram地址范围0x900000 - 0x91ffff;外部ram地址范围0x80000000 - 0x9fffffff(对于512M ddr说)。裸机开发链接地址0x87800000
要使用ddr,那么必须要初始化ddr。.bin文件要添加一个头部,这个头部信息包含了ddr的初始化参数。
运行地址和链接地址文章:https://blog.csdn.net/CSDNmianfeixiazai001/article/details/81455692
烧写程序bin文件
stm32 flash
sd卡、emmc、nand、nor、spi flash,裸机烧写到sd卡
格式化fat32
在linux下烧写bin文件
烧写不是将文件拷到sd卡,烧写到sd卡绝对地址上
找到sd,目录位置/dev/sdx
烧写
拨码开关
建一个Makefile文件
1 leds.bin:leds.s 2 arm-linux-gnueabihf-gcc -g -c leds.s -o led.o 3 arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf 4 arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin 5 arm-linux-gnueabihf-objdump led.elf > led.dis 6 7 clean: 8 rm -rf *.o led.elf led.bin led.dis
注意:
嵌入式Linux开发中基本上不适用jlink
调试点灯、串口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?