汇编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

  调试点灯、串口

 

posted @   我爱茜茜公主  阅读(78)  评论(0编辑  收藏  举报
编辑推荐:
· .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 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示