公司项目中要使用K60的芯片,所以需要先行把相关的开发环境搭建起来.之前有中电器材的K60开板,直接在上面做部分开发。嵌入式上的开发环境基本上是两类,一类是IDE,一类是VIM+MAKE+CSCOPE。现在的很多芯片厂商都开始注重生态圈的建设,所以各家都有自己的IDE,而且多数是从Eclipse扩展出来的。另一类属于DIY型,芯片公司已经把Linux移植在芯片上,中间的构建过程都是由shell脚本和makefile文件组成,便于开发者使用。

自从MAC PRO到手后,就一直想在MAC OS下完成大多数的开发任务,不能浪费这么好的系统么。嵌入式开发过程需要软件和硬件的配合才得以完成,当然有些是硬件是在开发板上有提供。我使用的开发板是中电器材的K60(也没个正式的名字,就这样吧),芯片使用Freescale家的MK60N512ZVLQ10,板子分为CPU板和BASE板,CPU板以DDR接口形式插在BASE板上。因为芯片是ARM的,所以调试接口JTAG是支持的,Freescale又搞了OSJTAG使用MINI USB接口与PC相连。我这里使用的Debuger是韦东山的OpenJTAG,是由FTDI提供的USB转JTAG的芯片完成调试功能。

  1. 硬件连接

之前有写过文章openjtag debuger for freescale k60 chip,具体接线参考此文即可。需要购买mini jtag的头和排线。

  1. 软件配置

软件使用OpenOCD与OpenJTAG通讯,在MAC OS下直接使用brew安装即可

brew install openocd

brew中提供的openocd是0.8.0版本的。接下来是写openocd的配置文件,以便识别到OpenJTAG和开发板芯片。

telnet_port 4444
gdb_port 3333
gdb_memory_map disable

# interface for openjtag
interface ft2232
adapter_khz 1000
#jtag_speed 0
ft2232_vid_pid 0x1457 0x5118
ft2232_layout "jtagkey"
ft2232_device_desc "USB<=>JTAG&RS232"

# about target
source [find target/swj-dp.tcl]
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME k60
}

if { [info exists ENDIAN] } {
set _ENDIAN $ENDIAN
} else {
set _ENDIAN little
}

if { [info exists CPUTAPID] } {
set _CPUTAPID $CPUTAPID
} else {
set _CPUTAPID 0x4ba00477
}

set _TARGETNAME $_CHIPNAME.cpu
swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
target create $_TARGETNAME cortex_m -chain-position $_CHIPNAME.cpu

cortex_m reset_config sysresetreq

#
# Bank definition for the 'program flash' (instructions and/or data)
#
flash bank pflash.0 kinetis 0x00000000 0x40000 0 4 $_TARGETNAME
flash bank pflash.1 kinetis 0x00040000 0x40000 0 4 $_TARGETNAME

然后执行openocd即可

sudo openocd -f k60.cfg

输出结果如下:

Open On-Chip Debugger 0.8.0 (2014-08-04-08:53)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 1000 kHz
cortex_m reset_config sysresetreq
Info : add flash_bank kinetis pflash.0
Info : add flash_bank kinetis pflash.1
Warn : Using DEPRECATED interface driver 'ft2232'
Info : Consider using the 'ftdi' interface driver, with configuration files in interface/ftdi/...
Info : clock speed 1000 kHz
Info : JTAG tap: k60.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : k60.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : accepting 'telnet' connection from 4444
Info : accepting 'gdb' connection from 3333
undefined debug reason 7 - target needs reset
Info : JTAG tap: k60.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
  1. 调试程序

开发过程中,调试是必需的步骤,由其是嵌入式开发,很多问题基本是靠debug出来的,然后再解决掉。这里使用GDB调试,通过openocd连接,进行远端调试。

首先,在编译源码时,要编写linker文件,指定程序入口点为内存地址处,这样使用GDB时才可以把ELF文件加载在相应内存处,然后执行。当然,有时候你的RAM是外置的,需要先把RAM初始化后才可以使用。我使用了一个LED的小程序来测试调试的过程。

[k60_led_demo](https://github.com/Blackrose/k60_led_demo)

这里面有两个linker文件,调试时使用k60n128_ram.ld即可。在已经运行OpenOCD基础上,通过GDB连接OpenOCD的调试端口;

arm-none-eabi-gdb out/k60_gpio_demo.elf
target remote localhost:3333
monitor reset init
load

这时,会有加载成功的提示,接下来就与PC上的GDB调试相同了,break,continue之类的。

  1. 烧写程序

调试完成后,通常会把程序烧写进芯片,做外部功能性测试。烧写直接使用OpenOCD就可以了,编译时使用k60n512_flash.ld文件,这样程序是从FLASH的0x0处执行。以下是烧写过程:

telnet localhost 4444
reset init
flash write_image erase out/k60_gpio_demo.elf

等待完成后,断开OpenOCD和JTAG调试器,程序就可以独立运行在芯片上了。