AM62Ax 使用笔记

TI 官方文档

TRM

spruj16b.pdf

  • MCAN模块介绍查看12.5.1章节

  • MCAN寄存器查看14.9.5章节

DataSheet

AM62Ax Sitara™ 处理器 datasheet (Rev. C)

pin脚属性查看DataSheet,表 6-1. Pin Attributes

Application Note

AM62A7, AM62A7-Q1, AM62A3-Q1 and AM62D-Q1 Families Schematic, Design Guidelines and Review Checklist (Rev. C)

SDK

AM62Ax MCU+ SDK: Introduction

IPC性能参考:

Training

Training

链接文件

Linker command file — AM62Ax Academy

Linker Special Section Types

TI Linker Command File Primer

从lib库中分配一个单一输入部分时,如果库文件名包含特殊字符,在链接脚本中,需要将包含特殊字符的文件名用双引号括起来,确保链接器将其视为整体路径:

1
2
3
4
5
6
7
/* This is used to store memory segments related to the TI SDK library files.
*/
GROUP
{
.ti_lib_text: {"freertos.am62ax.r5f.ti-arm-clang.release.lib"<tasks.obj>
(.text)} align(8)
} > MSRAM

启动

Bootloader是嵌入式系统在上电后执行的第一段代码,最终目标就是引导内核,启动内核。

SPL和SBL

AM62A7处理器支持两种主要类型的启动流程:SPL启动和SBL启动。

ROM Code

ROM Code:或ROM bootloader (RBL),是设备ROM中首先执行并实现引导的片上软件,是一种驻留在片上只读存储器(ROM)中的软件(出厂时固化,不可更改),这段代码执行第一阶段的启动任务,用于帮助用户传输和执行其应用程序代码。AM62Ax有两套协同工作的 ROM 代码,公共 ROM 代码和 M4 ROM 代码。

AM62A7上电复位后,CPU从芯片内部的ROM(Boot ROM)开始执行固化代码(即ROM Code)。

ROM Code会读取启动引脚配置,然后根据配置情况决定以哪种方式加载接下来的外部启动代码。

Bootloader Modes

为了适应各种系统场景,ROM 代码支持多种引导模式。

这些引导模式可分为以下两类:

  • 主机引导模式:AM62Ax通过所选接口(如 UART 或 USB(DFU))从主机接收第二引导加载程序。

  • 内存引导模式:AM62Ax从非易失性存储器(如 SD 卡、eMMC、OSPI/QSPI/SPI 闪存或 GPMC 闪存)中传输第二引导加载程序。

在 OSPI 启动模式下,ROM Code会初始化 OSPI 模块,然后从与选定片选信号相连的 OSPI 闪存中读取映像。如果无法正确从偏移量 0x0 处读取映像,将尝试在偏移量 0x400000 处获取映像。OSPI启动模式不支持XIP(原地执行),ROM Code首先将启动映像复制到片上RAM中,然后执行它。

Booting Parameter Table

一种存储于片上 RAM 内存中的逻辑结构,其包含有启动所需的信息,诸如启动文件名或者用于启动的地址等。

更多参考:

TRM Chapter 5 Initialization:spruj16b.pdf

DM R5F:Developing on the DM R5F

Boot Time Optimizations:6.1.10. Boot Time Optimizations

其他:ARM-Linux嵌入式系统启动流程_arm嵌入式开机启动流程简述题-CSDN博客

时钟

如何查看当前MCU R5内核的时钟频率:

[参考译文] SK-AM62A-LP:需要 MCU-R5内核时钟频率相关信息(SK-AM62A-LP)

1
k3conf dump clock 9

临时修改时钟频率,使用k3conf直接从命令行更改 MCU R5F 内核频率。比如:修改为200Mhz。

1
k3conf set clock 9 0 200000000

如果要永久生效,可以在设备树里面增加如下配置:

1
2
3
4
5
&mcu_r5fss0 {
/* Set DEV_MCU_R5FSS0_CORE0_CPU0_CLK to 200MHz */
    assigned-clocks = <&k3_clks 9 0>;
    assigned-clock-rates = <200000000>;
}

CCT

CCS使用笔记

IPC

IPC共享内存调试

中断

注意:凡是TI提供的接口,代码实现需要到SDK里面去找。

AM62Ax MCU+ SDK: HW Interrupts

R5f核心专用中断控制器,称为向量中断管理器(VIM)。详细内容查看TRM文档第10章。

源码分析

R5F的中断是通过 HwiP_irq_handler统一处理的, HwiP_irq_handler调用vApplicationIRQHandlerConstHwiP_irq_handler_c),然后根据 HwiP_construct注册的中断号和处理函数,执行对应的中断服务函数。对于上层应用来说,我们调用 HwiP_construct注册需要的中断就行了。

中断向量表

HwiP_armv7r_vectors_freertos_asm.S

HwiP_disable()

Disable all interrupts.

Note: In case of ARM R5F, ARM M4F, this only disables IRQ.FIQ is not disabled.

Returns: interrupt state before disable, typically used by HwiP_restore later

TI的SDK有问题。这个禁用所有中断的函数不起作用,e2e有类似的帖子:

PROCESSOR-SDK-AM62X: M4 FreeRTOS Interrupt Disable Not Working (HwiP_disable)

1
2
3
4
5
6
7
8
9
10
11
/* FUNCTION DEF: uint32_t HwiP_disable(void) */
.global HwiP_disable
    .type HwiP_disable,%function
    .section ".text.hwi","ax",%progbits
    .arm
.align 2
HwiP_disable:
    mrs r0, cpsr
    orr r12, r0, #0x80
    msr cpsr_cf, r12
    bx LR

HwiP_init()

HwiP_armv7r_vim.c

MCU+ SDK替换

背景

遇到了HwiP_disable()禁用中断不起作用的问题,TI的回复是使用 MCU+SDK v10.01看是否还有问题。

软件安装

CCS使用笔记

编译报错

CCS报错

1
missing required argument 'sw_version'

从上面的信息可以看出 source_code.out已经生成了,但是在调用 elf2rprc.js,将source_code.out转换为 source_code.rprc时出现了错误。

对比两个SDK版本的js文件,发现10.01增加了一个 sw_version参数,所以导致了这个错误。

解决方法:替换 makefile_ccs_bootimage_gen文件。

Makefile报错

  1. makefile需要修改SDK的路径为实际的安装路径

    执行编译脚本,出现如下报错:

  2. 需要修改SDK下面的 imports.mak文件

    修改工具安装路径,修改ccs的版本改为实际的版本:

  3. 修改完后,出现了和上面一样的错误

    1
    missing required argument 'sw_version'

    需要修改makefile增加参数

指令

反汇编

  1. out文件反汇编

    检查 ELF文件头:

    1
    arm-none-eabi-readelf -h xxx.out

    输出示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    ELF Header:
    Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
    Class: ELF32
    Data: 2's complement, little endian
    Version: 1 (current)
    OS/ABI: UNIX - System V
    ABI Version: 0
    Type: EXEC (Executable file)
    Machine: ARM
    Version: 0x1
    Entry point address: 0x0
    Start of program headers: 3755220 (bytes into file)
    Start of section headers: 3755444 (bytes into file)
    Flags: 0x5000000, Version5 EABI
    Size of this header: 52 (bytes)
    Size of program headers: 32 (bytes)
    Number of program headers: 7
    Size of section headers: 40 (bytes)
    Number of section headers: 39
    Section header string table index: 38

    反汇编,并将结果保存到disassembly.txt文件中:

    1
    arm-none-eabi-objdump.exe -d --prefix-addresses -marm xxx.out > disassembly.txt

    其中, xxx.out文件名需要按实际情况修改。

  2. obj文件反汇编

    1
    2
    D:\ti\ccs1240\ccs\tools\compiler\ti-cgt-armllvm_2.1.3.LTS\bin\tiarmobjdump.exe
    -d queue.obj > disassembly_obj.txt

    tiarmobjdump.exe需要替换为自己的安装路径。

    1
    2
    D:\ti\ccs1240\ccs\tools\compiler\ti-cgt-armllvm_2.1.3.LTS\bin\tiarmobjdump.exe
    -s -j .rodata queue.obj

    .rodata.str1.97075527348778053441是目标文件 queue.obj 中的一个只读数据段,使用以下命令查看具体内容:

    1
    2
    D:\ti\ccs1240\ccs\tools\compiler\ti-cgt-armllvm_2.1.3.LTS\bin\tiarmobjdump.exe
    -s -j .rodata.str1.97075527348778053441 queue.obj

SDK编译

进入SDK安装目录,命令终端输入指令:

1
gmake -s libs PROFILE=release

clean指令:

1
gmake -s libs-clean PROFILE=release

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2025 wrd
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信