首页 > 其他分享 >拿到一个新的芯片之后做的事

拿到一个新的芯片之后做的事

时间:2023-08-16 21:35:14浏览次数:35  
标签:gnueabihf led 芯片 elf 之后 拿到 linux r0 arm

一、首先,看半导体厂商是否有对应的开发板,有的话就直接用厂商的,I.MX6ULL是有的,没有的话就要看芯片手册自己画PCB制作。

二、看芯片手册注意上电时序、串口 1 RXD 上拉、 启动方式。

三、1、尝试点灯,看芯片手册,看引脚寄存器的地址、功能,参照STM32的程序设计此芯片的程序。使能时钟、设置复用功能、哪个引脚、模式(上下拉、速度等)、输入输出、高低电平。

2、使用汇编语言进行编写,注意GNU汇编与intel汇编的区别,直接对芯片的地址进行操作

1 ldr r0, =0X020C4068 
2 ldr r1, =0XFFFFFFFF
3 str r1, [r0]

使用交叉编译器arm-linux-gnueabihf-gcc,可能由于版本不一而不好用,尝试降低版本。

只编译但是不链接

1 arm-linux-gnueabihf-gcc -g -c led.s -o led.o

链接.o文件

2 arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf

格式转换为二进制

3 arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin

进行反汇编来查看其汇编代码来调试代码

4 arm-linux-gnueabihf-objdump -D led.elf > led.dis

也可直接使用Makefile,要注意使用Tab,不使用空格

1 led.bin:led.s
2     arm-linux-gnueabihf-gcc -g -c led.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 -D led.elf > led.dis
6 clean:
7     rm -rf *.o led.bin led.elf led.dis

要注意第三行的链接地址的选择。这个链接地址是在DDR中

通过烧写工具将led.bin文件烧写进SD卡中,也可以其他方式,主要看选择的启动方式是怎样的。


 

四、以上是用汇编语言写的代码,我们大多数用C语言写,需要用汇编语言搭一个环境,就是SP指针

 1 .global _start /* 全局标号 */
 2 
 3 /*
 4 * 描述: _start 函数,程序从此函数开始执行,此函数主要功能是设置 C
 5 * 运行环境。
 6 */
 7 _start:
 8 /* 进入 SVC 模式 */
 9     mrs r0, cpsr
10     bic r0, r0, #0x1f /* 将 r0 的低 5 位清零,也就是 cpsr 的 M0~M4 */
11     orr r0, r0, #0x13 /* r0 或上 0x13,表示使用 SVC 模式 */
12     msr cpsr, r0 /* 将 r0 的数据写入到 cpsr_c 中 */
13 
14     ldr sp, =0X80200000 /* 设置栈指针 */
15     b main /* 跳转到 main 函数 */

main.h以宏定义的形式定义寄存器,

1 #define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)

main.c定义函数进行应用。

1 SW_MUX_GPIO1_IO03 = 0x5;

对以上的Makefile和链接进行升级

 1 objs := start.o main.o
 2 
 3 ledc.bin:$(objs)
 4     arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^
 5     arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
 6     arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
 7 
 8 %.o:%.s
 9     arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
10 
11 %.o:%.S
12     arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
13 
14 %.o:%.c
15     arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
16 
17 clean:
18     rm -rf *.o ledc.bin ledc.elf ledc.dis

在Makefile同目录下新建一个名为“imx6ul.lds”的文件,此为链接脚本。

 1 SECTIONS{
 2     . = 0X87800000;
 3     .text :
 4     {
 5         start.o
 6         main.o
 7         *(.text)
 8      }
 9     .rodata ALIGN(4) : {*(.rodata*)}
10     .data ALIGN(4) : { *(.data) }
11     __bss_start = .;
12     .bss ALIGN(4) : { *(.bss) *(COMMON) }
13     __bss_end = .;
14 }                    

五、如果半导体厂商提供SDK包,可以改一改,增删文件进行使用,如果没有,就要自己写SDK包。

六、由于文件个数比较多,要对程序进行分功能管理,使其美观、功能模块清晰、易于阅读。BSP(board support package)板级支持包。

七、编译和链接终极模板:

1、编译

 1 CROSS_COMPILE ?= arm-linux-gnueabihf-    #编译器名
 2 TARGET ?= bsp                            #文件名或者例程名,注意更改
 3 
 4 CC := $(CROSS_COMPILE)gcc
 5 LD := $(CROSS_COMPILE)ld
 6 OBJCOPY := $(CROSS_COMPILE)objcopy
 7 OBJDUMP := $(CROSS_COMPILE)objdump
 8 
 9 INCDIRS := imx6ul \                    #头文件目录,添加新的
10            bsp/clk \
11            bsp/led \
12            bsp/delay
13 
14 SRCDIRS := project \                   #.c或.s目录,添加新的
15            bsp/clk \
16            bsp/led \
17            bsp/delay
18 
19 INCLUDE := $(patsubst %, -I %, $(INCDIRS))
20 SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
21 CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
22 
23 SFILENDIR := $(notdir $(SFILES))
24 CFILENDIR := $(notdir $(CFILES))
25 
26 SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
27 COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
28 OBJS := $(SOBJS) $(COBJS)
29 
30 VPATH := $(SRCDIRS)
31 
32 .PHONY: clean
33 
34 $(TARGET).bin : $(OBJS)
35     $(LD) -Timx6ul.lds -o $(TARGET).elf $^
36     $(OBJCOPY) -O binary -S $(TARGET).elf $@
37     $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
38 
39     $(SOBJS) : obj/%.o : %.S
40     $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
41 
42 $(COBJS) : obj/%.o : %.c
43     $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
44 clean:
45     rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)    

2、链接

 1 SECTIONS{
 2 . = 0X87800000;
 3 .text :
 4  {
 5      obj/start.o             
 6      *(.text)
 7  }
 8 .rodata ALIGN(4) : {*(.rodata*)}
 9 .data ALIGN(4) : { *(.data) }
10 __bss_start = .;
11 .bss ALIGN(4) : { *(.bss) *(COMMON) }
12 __bss_end = .;
13 }

 

标签:gnueabihf,led,芯片,elf,之后,拿到,linux,r0,arm
From: https://www.cnblogs.com/linchangchao/p/17636238.html

相关文章

  • AI芯片暴涨!沙特、阿联酋等国加入抢货行列 | 百能云芯
    在全球半导体市场中,一场异常激烈的竞争正在酝酿,引发了各国科技巨头和企业的争相购买英伟达AI芯片的浪潮。除了美国科技大厂之外,包括百度、字节跳动、阿里等中国企业在内,沙特阿拉伯与阿拉伯联合酋长国也纷纷加入了这场角逐,似乎每个人都想在人工智能领域抢先一步。在这场全球疯抢英伟......
  • 【8月摸鱼计划】cw32f0芯片上数值计算库的推荐
    对于在cw32f0芯片上进行数值计算,以下是几个常用的数值计算库的推荐:Cmath:Cmath是C++标准库中的一部分,提供了常用的数学函数和运算符,包括矩阵求逆。它可以通过使用固定点数或整数运算来进行数值计算,适合在没有浮点计算单元的系统上使用。Armadillo:Armadillo是一个C++的线性代......
  • 紫光展锐T610(虎贲610)_芯片性能介绍_全国产安卓核心板定制
    紫光展锐T610核心板是影像全面升级的8核架构的4G移动平台。采用旗舰级DynamIQ架构设计,基于自主研发的第五代影像引擎Vivimagic解决方案,和高画质显示处理技术,为用户带来精致的高画质体验。展锐T610(虎贲610)安卓核心板基本概述虎贲T610处理器是由紫光展锐研发的一颗基于12nm工艺的4G芯......
  • 拿到开发板需要做的事情 -- 配置Python环境
    1.查看系统时间date-R 2.修改系统时间windows上时间项目时间正常,Ubuntu16.04上时间错误-贾斯丁哔哔-博客园(cnblogs.com) 3.安装pip3sudoapt-getupdatesudoapt-getinstallpython3-pip ......
  • FP6298支持9V输出异步升压芯片,3-5V升压到5V/9V
    FP6298低噪声4.5A升压型电流模式PWM转换器。FP6298是电流模式的升压型DC-DC转换器。这是PWM电路,内置0.08Ω功率MOSFET,使该稳压器高节能。内部补偿网络也最大限度地减少了多达6个外部元件数量。误差放大器的非反相输入端连接到一个0.6V的精确的参考电压,内部软启动功能,可以减少浪涌电......
  • 浏览器中输入:“www.learnjava.com”之后都发生了什么?请详细阐述
    当在浏览器中输入"www.woaijava.com"并按下回车后,会依次发生以下步骤:域名解析:浏览器首先会将输入的域名"www.woaijava.com"解析为对应的IP地址。它会查询本地DNS缓存,如果找不到,则会向域名服务器发起请求。DNS查询:如果本地DNS缓存中没有对应的IP地址,浏览器会......
  • 安森美RSL15蓝牙芯片 FOTA流程
    第一步先拉bootloader工程,然后通过jlink将bootloader下载到芯片中第二步在bootloader工程下有一个utility文件夹,该文件夹下有一个updater的文件。使用命令行执行该文件可以将.fota固件通过串口烧录芯片中pythonupdater.pyCOM3ble_peripheral_server_fota.fota 第三......
  • 一场大火烧毁了印度的芯片梦 | 百能云芯
    谈起印度的半导体发展史,鲜为人知的是,该国曾有可能成为全球半导体制造业的重要中心。然而,一个意外的事件彻底改变了历史进程,让印度错失了超越台积电的机会。01半导体制造潜力在高科技行业,也许很多人都不看好印度,但实际上,他们在半导体设计方面,还颇有一些成就。半导体领域几乎所有的大......
  • elementUi中的radio回显之后无法选择的问题
    情况:在用el-radio时,在回显数据之后,点击其他的radio想要选择的时候,勾选不了。原因:接口返回数据中没有声明radio的对应变量,导致直接赋值给list中未声明的变量,所以双向绑定不会被vue监听,即没有刷新。=》vue中对数据双向绑定的支持限于基本添加删除的方法,详情看官网解决方案:1、原本......
  • 紫光展锐T310(虎贲310)_芯片性能介绍_全国产安卓核心板定制
    紫光展锐T310核心板是全球首款基于DynamIQ架构的4核LTE平台,可实现优异的运算性能及低功耗管理,在单核场景下性能比目前主流4核产品提高120%,多核场景下性能提升超过20%,为全球主流市场用户提供流畅的应用体验。展锐T310(虎贲310)安卓核心板基本概述虎贲T310是可运行android11.0操作......