Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ART-Pi Smart
imx6
使用openocd和gdb调试imx6ull
1.00
发布于 2022-04-16 13:23:42 浏览:3189
订阅该版
[tocm] # 使用openocd调试imx6ull ## **一、前言** 目前很多人开发imx6ull基本的组合是uboot+linux,以开发应用层软件的居多(此时可以直接在开发板运行gdb工具链调试APP);其次是开发linux驱动程序(此时多数是通过printk打印消息调试);而有一小撮人会拿imx6ull当单片机使用,直接使用NXP的SDK做裸机开发,此时调试就需要像其他Cortex-M核单片机一样使用调试器。imx6ull支持jtag接口,同时目前openocd已经支持imx6ull,那么我们就可以使用openocd加上GDB调试了。现在我们遇到的第一个问题是imx6ull内部的sram是128kb显然比较小,而外接的DDR就很大了。ddr的初始化对于imx6ull有两种方式:第一种是通过给程序加上DCD头部,在系统启动时由bootrom根据dcd头初始化ddr;第二种是bootrom将uboot-spl加载到内部sram中由uboot-spl初始化ddr。好了现在开始实操。 ## **二、硬件** 开发板:野火imx6ull pro 仿真器:野火CMSIS-DAP高速版(旧款) 野火6ull pro使用的jtag是10口的: | **1P** | **3V3** | **3V3** | **2P** | | ------ | --------- | --------- | ------- | | **3P** | **NTRST** | **NSRST** | **4P** | | **5P** | **TDI** | **TDO** | **6P** | | **7P** | **TMS** | **NC** | **8P** | | **9P** | **TCK** | **GND** | **10P** | 野火CMSIS-DAP仿真器使用的jtag是20口的: | **1P** | **VREF** | **NC** | **2P** | | ------- | ------------- | ------- | ------- | | **3P** | **NC** | **GND** | **4P** | | **5P** | **TDI** | **GND** | **6P** | | **7P** | **TMS/SWDIO** | **GND** | **8P** | | **9P** | **TCK/SWCLK** | **GND** | **10P** | | **11P** | **NC** | **GND** | **12P** | | **13P** | **TDO/SWDIO** | **GND** | **14P** | | **15P** | **NSRST** | **GND** | **16P** | | **17P** | **NC** | **GND** | **18P** | | **19P** | **NC** | **GND** | **20P** | 野火仿真器3P对应的NTRST是悬空的,11P对应的RTCK也是悬空的,再看野火开发板8P对应的RTCK也是悬空的,所以仿真器和开发板的连接如下(开发板nTRST可以串联nSRST): | 引脚编号 | 开发板 | 仿真器 | 引脚编号 | | :------: | :----: | :----: | :------: | | 1P | 3V3 | VREF | 1P | | 2P | 3V3 | VREF | 1P | | 3P | NTRST | 不接 | | | 4P | NSRST | NSRST | 15P | | 5P | TDI | TDI | 5P | | 6P | TDO | TDO | 13P | | 7P | TMS | TMS | 7P | | 8P | NC | 不接 | | | 9P | TCK | TCK | 9P | | 10P | GND | GND | 2P | ## **三、软件链接** 以下是gdb和openocd下载链接: [arm-gcc](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) [openocd](https://github.com/openocd-org/openocd/releases) 资源包: [led_rgb.zip](https://oss-club.rt-thread.org/uploads/20220416/a01df7f4a97f4e9012cf2acbed003951.zip) ## **四、SRAM和DDR中运行点灯** ### sram中运行: 先运行 ``` openocd.exe -f imx6ull_sram.cfg ``` ![捕获01.PNG](https://oss-club.rt-thread.org/uploads/20220416/8c4290ad22f8b1b510945a07414b276c.png) 再在另一个新的窗口运行 ``` telnet localhost 4444 ``` ![捕获02.PNG](https://oss-club.rt-thread.org/uploads/20220416/0adb6105bae28c77c7755f0eff03f217.png) 成功连接telnet: ```shell >reset init >load_image led_sram.bin 0x910000 bin >resume 0x910000 ``` 以上三条命令分别是复位、加载代码、从0x910000处开始执行代码。 ### ddr中运行: 先运行 ``` openocd.exe -f imx6ull_ddr.cfg ``` 再在另一个新的窗口运行 ``` telnet localhost 4444 ``` 成功连接telnet: ```shell >reset init >load_image led_ddr.bin 0x80000000 bin >resume 0x80000000 ``` 以上三条命令分别是复位、加载代码、从0x80000000处开始执行代码。 ## **五、开始使用GDB调试** 先运行 ``` openocd.exe -f imx6ull_ddr.cfg ``` 再在另一个新的窗口运行 ``` arm-none-eabi-gdb -q ``` ```shell >source gdb_ddr.init ``` ![捕获03.PNG](https://oss-club.rt-thread.org/uploads/20220416/7413a3529d6fa0ff0c982ef30298a6ba.png) ## **六、关于smart对应引脚** | JTAG PIN number | | | Smart 40Pin number | | --------------- | ----- | ---------- | ------------------ | | 3P | NTRST | JTAG_NTRST | 40P | | 5P | TDI | JTAG_TDI | 32P | | 7P | TMS | JTAG_TMS | 37P | | 9P | TCK | JTAG_TCK | 17P | | 11P | RTCK | NC | 悬空 | | 13P | TDO | JTAG_TDO | 35P | | 15P | NSRST | POR_B | 复位引脚 | ## **七、技术细节** 关于openocd下初始化DDR有两个思路,第一种是获取你的开发板的uboot里的spl程序,通过telnet命令加载到内部sram中运行让它初始化ddr(地址根据链接脚本设置 比如0x908000),操作方式类似上文中sram运行点灯程序,然后再通过gdb链接openocd开始调试;第二种是将ddr初始化编写成openocd脚本函数,具体内容自行查看资源包里的imx6ull_ddr.cfg中的dcd_header函数,本质上是对特定寄存器映射地址写配置数据,它的来源是你的开发板的厂商提供的uboot源代码目录下的imximage.cfg文件的内容。 **简单对imx6ull_ddr.cfg内容作了注释:** ``` # 包含cmsis-dap仿真器的配置文件 source [find interface/cmsis-dap.cfg] # 设置仿真器的速率 adapter speed 1000 # 设置别名,大概意思是这颗soc的型号名称 set CHIPNAME imx6ull # 给TAP设置ID set DAP_TAPID 0x5ba00477 set SJC_TAPID 0x088c101d # 选择jtag接口 transport select jtag # 指定复位引脚,这里只需要nSRST。 # jtag接口的复位引脚还包含nTRST,用于复位TAP使用。 # 我的cmsis-dap仿真器nTRST引脚为nc, # 执行这句似乎会有错误,虽然也能调试,不知道为何。 # reset_config srst_only #### jtag_nsrst_delay 500 # 包含openocd提供的针对imx6ul系列的参数配置 source [find target/imx6ul.cfg] # function to apply initial configuration after a reset. It # provides a basic pad configuration and also DDR memory and clocks # sufficient to load and execute a boot loader (e.g. barebox) from # DDR memory. This list is extracted from the barebox flash image # header. # DDR初始化脚本函数 proc dcd_header { } { mww 0x020c4068 0xffffffff mww 0x020c406c 0xffffffff mww 0x020c4070 0xffffffff mww 0x020c4074 0xffffffff mww 0x020c4078 0xffffffff mww 0x020c407c 0xffffffff mww 0x020c4080 0xffffffff mww 0x020E04B4 0x000C0000 mww 0x020E04AC 0x00000000 mww 0x020E027C 0x00000030 mww 0x020E0250 0x00000030 mww 0x020E024C 0x00000030 mww 0x020E0490 0x00000030 mww 0x020E0288 0x000C0030 mww 0x020E0270 0x00000000 mww 0x020E0260 0x00000030 mww 0x020E0264 0x00000030 mww 0x020E04A0 0x00000030 mww 0x020E0494 0x00020000 mww 0x020E0280 0x00000030 mww 0x020E0284 0x00000030 mww 0x020E04B0 0x00020000 mww 0x020E0498 0x00000030 mww 0x020E04A4 0x00000030 mww 0x020E0244 0x00000030 mww 0x020E0248 0x00000030 mww 0x021B001C 0x00008000 mww 0x021B0800 0xA1390003 mww 0x021B080C 0x00000004 mww 0x021B083C 0x41640158 mww 0x021B0848 0x40403237 mww 0x021B0850 0x40403C33 mww 0x021B081C 0x33333333 mww 0x021B0820 0x33333333 mww 0x021B082C 0xf3333333 mww 0x021B0830 0xf3333333 mww 0x021B08C0 0x00944009 mww 0x021B08b8 0x00000800 mww 0x021B0004 0x0002002D mww 0x021B0008 0x1B333030 mww 0x021B000C 0x676B52F3 mww 0x021B0010 0xB66D0B63 mww 0x021B0014 0x01FF00DB mww 0x021B0018 0x00201740 mww 0x021B001C 0x00008000 mww 0x021B002C 0x000026D2 mww 0x021B0030 0x006B1023 mww 0x021B0040 0x0000004F mww 0x021B0000 0x84180000 mww 0x021B0890 0x00400000 mww 0x021B001C 0x02008032 mww 0x021B001C 0x00008033 mww 0x021B001C 0x00048031 mww 0x021B001C 0x15208030 mww 0x021B001C 0x04008040 mww 0x021B0020 0x00000800 mww 0x021B0818 0x00000227 mww 0x021B0004 0x0002552D mww 0x021B0404 0x00011006 mww 0x021B001C 0x00000000 } # 关闭看门狗? proc disable_wdog { } { mwh 0x020bc000 0x30 } proc clear_regs {} { puts " " reg r1 0 reg r2 0 reg r3 0 reg r4 0 reg r5 0 reg r6 0 reg r7 0 reg r8 0 reg r9 0 reg r10 0 reg r11 0 reg r12 0 # assume our executable is at 0x00908000. otherwise the # user must manually set the value after a reset. # reg pc 0x00908000 # shamelessly stolen from the samsung configuration # this fixes problems executing loaded code. reg cpsr 0x1d3 arm mcr 15 0 15 2 4 0x70000013 puts " " } # This function applies the initial configuration after a "reset init" # command proc fire_init { } { global _TARGETNAME $_TARGETNAME arm core_state arm #disable_wdog #clear_regs dcd_header } # prevent cortex-a code from asserting SRST again $_TARGETNAME configure -event reset-assert { } # hook the init function into the reset-init event # 当在gdb或telnet运行""reset init"时会调用 fire_init 这个配置函数 $_TARGETNAME configure -event reset-init { fire_init } # make sure target is halted when gdb attaches # 当gdb链接openocd时触发 halt 内置命令,功能是让处理器挂起 $_TARGETNAME configure -event gdb-attach { halt } ```
6
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
lizimu
这家伙很懒,什么也没写!
文章
9
回答
22
被采纳
3
关注TA
发私信
相关文章
1
bsp/imx6ul 编译错误
2
imx6ull跑rt_thread没反应
3
imx6ul跑rt_thread下载进SD,emmc无反应
4
rt-smart 编译 imx6ull 提示错误。
5
使用qemu模拟imx6ull体验rt-smart的若干问题
6
rtt 支持 NXP i.MX 6ULL 或 i.MX 6Q 吗?
7
听说 rtt 有计划 打算支持 IMX 6ULL ?
8
rt_thread移植
9
请问大家有没有在rt-thread上支持起来imx6q的开发板
10
在imx6q中到最后调用rt_system_scheduler_start总会出现undefined abort
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部