STM32F429I-DISCO ucLinux 开发环境搭建

武, 军/ 十二月 7, 2017/ 未分类

1. 前言
前段时间刚刚体验了RT1050的uclinux,emcraft对uclinux支持力度很大,而且linux官方源码已经支持STM32的MCU了。
所以是时候了解一下uclinux的使用方法了。
用linux最大的优势就在于丰富的代码资源。同时linux也代表了丰富的外围驱动,工程师可以不用花费太多精力在调试驱动上面。
抽屉里恰好有一块STM32F429 Discovery的开发板。所以就拿这块板子练手了。

2. 参考文献
主要是参考下面的链接:
https://elinux.org/STM32

3. 开发板资源
STM32F429 MCU (ARM Cortex-M4 up to 180MHz, 2MB internal flash, 256KB internal RAM)
8MB SDRAM
USB OTG Full-Speed
2.4″ LCD
MEMS motion sensor
STLink/V2 (debugging)
Extension headers

4. 工具链
https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major
下载链接:https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major/+download/gcc-arm-none-eabi-4_9-2014q4-20141203-win32.zip
这个网站给出了交叉编译工具链的编译方法。感兴趣的话可以下源码试一下。

5. bootloader
bootloader使用AFBoot-STM32,编译结果小于2KB。可以用于启动linux。
因为只有2MB的flash资源。尽量把boot压缩到最小。因为内核是直接在flash XIP运行的,所以不需要拷贝代码,直接跳过去就行了。
bootloader实际上只需要实现boot就可以了,不需要loader功能。所以可以做到很小。
看源码也是非常简单。也可以看到boot已经指定了内核的起始地址和dtb的起始地址。
9 OPENOCD = openocd
10 KERNEL_ADDR?=0x08008000
11 DTB_ADDR?=0x08004000

源码下载:git clone https://github.com/mcoquelin-stm32/afboot-stm32.git
cd afboot-stm32
更新环境变量:export PATH=~/uclinux/stm32/gcc-arm-none-eabi-4_9-2014q4/bin:$PATH
默认就是使用arm-none-eabi-gcc编译。
编译:make stm32f429i-disco
烧到内部flash:make flash_stm32f429i-disco
最后一条命令是用openocd烧到内部flash的,我并没有使用openocd,不过要提一下,这个openocd不简单,可以去官网了解一下。
http://openocd.org/   Open On-Chip Debugger 有很多开发板是自带调试器的,这个确实非常方便调试,不需要再但单独购买调试器。
也是每个厂家为推广自己的芯片而开发的一种调试方法。

这个openocd支持的板子非常多,不过没有lm3s1138,那是2008年我参加ZLG电子竞赛的时候用的板子,当时自带调试器还非常罕见。
这里面有ek-lm3s811.cfg ek-lm3s8962.cfg也是我接触过的板子。支持的板子列表附在最后。
wujun@wj-vBox:~/uclinux/stm32/openocd/code/tcl/board$ ls | grep lm3s8
ek-lm3s811.cfg
ek-lm3s811-revb.cfg
ek-lm3s8962.cfg

6. kernel
内核下载:git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
实际上这是linux之父linus torvalds的开发用主分支,下载很慢,体积也较大,并不是发布版本。这个用于跟踪linux的内核更新是很好的。
下面是最近一笔代码提交,
commit 516fb7f2e73dcc303fb97fc3593209fcacf2d982
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Sun Nov 12 18:44:23 2017 -0800
可以看看大牛对内核究竟又干了些什么。
wujun@wj-vBox:~/uclinux/stm32/linux$ git show 516fb7f2e73dcc303fb97fc3593209fcacf2d982

cd linux
编译前要添加交叉编译工具链的路径
export PATH=~/uclinux/stm32/gcc-arm-none-eabi-4_9-2014q4/bin:$PATH
配置内核:make ARCH=arm CROSS_COMPILE=arm-none-eabi- stm32_defconfig
编译内核:make ARCH=arm CROSS_COMPILE=arm-none-eabi-
生成的内核镜像是非压缩的xip运行的,放在flash基址+32KB的位置。路径:arch/arm/boot/xipImage。
编译会同时生成设备树,路径:arch/arm/boot/dts/stm32f429-disco.dtb。
这种情况下编译的内核较小,只是内核而已。

7. filesystem
文件系统Busybox
Below link is a prebuilt minimal Busybox to be used as a Ramdisk: File:Stm32 mini rootfs.cpio.bz2
下载地址:https://elinux.org/File:Stm32_mini_rootfs.cpio.bz2
我是直接使用的这个最小的initramfs。不过花了一些时间在这个上面。这个文件系统不能直接使用,需要新增一个文件。
我们为什么没有选择其他文件系统呢,主要是因为flash太小。只能选择ramfs。而且最好是压缩后与内核放在一起。

8. 合成image
我没有使用openocd,虽然说openocd很方便使用。我还是使用了ST-LINK进行烧写,可以一次性烧入。
制作过程:
(1)制作2M全FF文件 :tr ‘\000’ ‘\377’ < /dev/zero | dd of=stm32f429-disco.img bs=1024 count=2k
(2)0地址开始写boot :dd if=stm32f429i-disco.bin skip=0 of=stm32f429-disco.img seek=0 bs=1K count=2;
(3)0x4000地址写dtb :dd if=stm32f429-disco.dtb skip=0 of=stm32f429-disco.img seek=16 bs=1K count=16;
(4)0x8000地址写xipImage :dd if=xipImage skip=0 of=stm32f429-disco.img seek=32 bs=1K count=2000
最后可以用hexdump验证一下制作的image文件是否正确。
因为ST-LINK只认bin文件,所以,拷到windows下的时候修改后缀名为.bin就可以了。
烧写方法非常简单,这里就不赘述了。

9. 修改内容
如果不做任何修改,直接烧写boot,dtb和xipimage后,运行结果是kernel panic,因为找不到文件系统。
所以第一个需要修改的地方就是增加initramfs到xipimage中。
(1)修改内核编译选项,增加initramfs路径。实际上也可以直接指定Stm32_mini_rootfs.cpio.bz2和压缩格式的。我解压是因为后面还需要增加一个文件。
-CONFIG_INITRAMFS_SOURCE=””
+CONFIG_INITRAMFS_SOURCE=”/home/wujun/uclinux/stm32/rootfs/filesystem”
+CONFIG_INITRAMFS_ROOT_UID=0
+CONFIG_INITRAMFS_ROOT_GID=0
+CONFIG_INITRAMFS_COMPRESSION=”.gz”

这里的filesystem目录下的内容实际上就是Stm32_mini_rootfs.cpio.bz2解压后的文件夹。
wujun@wj-vBox:~/uclinux/stm32/rootfs$ ls
Stm32_mini_rootfs.cpio.bz2
先解压成cpio文件:bzip2 -d Stm32_mini_rootfs.cpio.bz2
创建文件夹:mkdir filesystem && cd filesystem
解压到文件夹:cpio -idmv < ../Stm32_mini_rootfs.cpio
wujun@wj-vBox:~/uclinux/stm32/rootfs/filesystem$ ls
bin  dev  etc  linuxrc  proc  root  sbin  sys  usr

重新编译内核,这时候xipimage会增大Stm32_mini_rootfs.cpio.gz的大小。
然后重新制作image烧入内部flash。实际上也是没有办法启动到用户控制台的。只能说内核启动完成了。但没有console可以用。
心跳灯会正常闪烁了。没有控制台可以用。怀疑应该是缺少/dev/console导致的。
这个问题花费了一些时间,我是参考了buildroot的做法,有兴趣的可以去了解一下buildroot。https://buildroot.org/。
buildroot非常不简单,我的感觉类似一个简约版的yocto。支持的板子非常多。附在最后。

(2)增加了一个init文件到文件系统根目录。
wujun@wj-vBox:~/uclinux/stm32/rootfs/filesystem$ cat init
#!/bin/sh
# devtmpfs does not get automounted for initramfs
/bin/mount -t devtmpfs devtmpfs /dev
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /sbin/init $*
文件的内容是直接共buildroot的文件系统里拷贝出来的。
重新编译内核并合入到image烧写到内部flash运行成功。
开机log附在最后。

10. 测试应用程序
编译hello world。放在文件系统里。开机运行。
wujun@wj-vBox:~/uclinux/stm32/app$ vi hello.c

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/time.h>
4
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/time.h>
4
5 int main(int argc, char **argv)
6 {
7     struct timeval delay;
8     unsigned int delay_s = 1;
9     unsigned long timeout;
10     struct timeval tv;
11
12     printf(“Hello world, this is my first app!\r\n”);
13     if (argc > 1) {
14         delay_s = atoi(argv[1]);
15         printf(“delay is %s : %d\r\n”, argv[1], delay_s);
16     }
17     while (1) {
18         delay.tv_sec = delay_s;
19         delay.tv_usec = 0;
20         select( 0, NULL, NULL, NULL, &delay );
21         gettimeofday(&tv,NULL);
22         printf(“current time: %d.%d.\n”, tv.tv_sec, tv.tv_usec);
23     }
24
25     return 0;
26 }

手动启动了4个hello在后台运行
42 0           84 S    ./hello
44 0           84 S    ./hello
45 0           84 S    ./hello
46 0           84 S    ./hello

/root # Hello world, this is my first app!
……
current time: 946702135.671177.
current time: 946702135.671719.
current time: 946702135.672231.
current time: 946702135.672747.
current time: 946702136.714072.
current time: 946702136.714616.
current time: 946702136.715127.
current time: 946702136.715642

11. 展望
因为内部空间太小了,没有使用压缩内核,下一步打算还是使用uboot + 压缩内核 + initramfs。
把内核压缩成gz大概能节省出800KB的空间,uboot占用160KB,其余用于放压缩后的initramfs。
内核解压到SDRAM里运行linux、
增加lrz,lsz工具,不排除增加网口和SPI flash。
因为自带LCD,所以可以搞个framebuffer玩玩。

附录:
附录1:开机log
.[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.14.0-00005-g516fb7f-dirty (wujun@wj-vBox) (gcc version 4.9.3 20141119 (release) [ARM/embedded-4_9-branch revision 218278] (GNU Tools for ARM Embedded Processors)) #18 PREEMPT Sun Nov 19 13:28:55 CST 2017
[    0.000000] CPU: ARMv7-M [410fc241] revision 1 (ARMv7M), cr=00000000
[    0.000000] CPU: unknown data cache, unknown instruction cache
[    0.000000] OF: fdt: Machine model: STMicroelectronics STM32F429i-DISCO board
[    0.000000] Built 1 zonelists, mobility grouping off.  Total pages: 2032
[    0.000000] Kernel command line: root=/dev/ram
[    0.000000] PID hash table entries: 32 (order: -5, 128 bytes)
[    0.000000] Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.000000] Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.000000] Memory: 7728K/8192K available (1176K kernel code, 172K rwdata, 408K rodata, 64K init, 115K bss, 464K reserved, 0K cma-reserved)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0x00000000 – 0x00001000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 – 0xfff00000   (3072 kB)
[    0.000000]     vmalloc : 0x00000000 – 0xffffffff   (4095 MB)
[    0.000000]     lowmem  : 0x90000000 – 0x90800000   (   8 MB)
[    0.000000]       .text : 0x08008000 – 0x081942e8   (1585 kB)
[    0.000000]       .init : 0x9000a000 – 0x9000d000   (  12 kB)
[    0.000000]       .data : 0x90008000 – 0x900361c0   ( 185 kB)
[    0.000000]        .bss : 0x900361c0 – 0x90052eec   ( 116 kB)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000] Tasks RCU enabled.
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[    0.000000] /soc/interrupt-controller@40013c00: 23 External IRQs detected
[    0.000000] clocksource: arm_system_timer: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 355517175 ns
[    0.000000] ARM System timer initialized as clocksource
[    0.000000] /soc/timer@40000c00: STM32 clockevent driver initialized (32 bits)
[    0.000000] sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 21474836475000000ns
[    0.010000] Calibrating delay loop… 110.48 BogoMIPS (lpj=552448)
[    0.100000] pid_max: default: 4096 minimum: 301
[    0.100000] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.100000] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.100000] Hierarchical SRCU implementation.
[    0.110000] devtmpfs: initialized
[    0.170000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.170000] pinctrl core: initialized pinctrl subsystem
[    0.220000] stm32f429-pinctrl soc:pin-controller: GPIOA bank added
[    0.220000] stm32f429-pinctrl soc:pin-controller: GPIOB bank added
[    0.220000] stm32f429-pinctrl soc:pin-controller: GPIOC bank added
[    0.220000] stm32f429-pinctrl soc:pin-controller: GPIOD bank added
[    0.220000] stm32f429-pinctrl soc:pin-controller: GPIOE bank added
[    0.230000] stm32f429-pinctrl soc:pin-controller: GPIOF bank added
[    0.230000] stm32f429-pinctrl soc:pin-controller: GPIOG bank added
[    0.230000] stm32f429-pinctrl soc:pin-controller: GPIOH bank added
[    0.230000] stm32f429-pinctrl soc:pin-controller: GPIOI bank added
[    0.230000] stm32f429-pinctrl soc:pin-controller: GPIOJ bank added
[    0.230000] stm32f429-pinctrl soc:pin-controller: GPIOK bank added
[    0.240000] stm32f429-pinctrl soc:pin-controller: Pinctrl STM32 initialized
[    0.270000] stm32-dma 40026000.dma-controller: STM32 DMA driver registered
[    0.280000] stm32-dma 40026400.dma-controller: STM32 DMA driver registered
[    0.290000] clocksource: Switched to clocksource arm_system_timer
[    0.550000] workingset: timestamp_bits=30 max_order=11 bucket_order=0
[    0.590000] random: fast init done
[    0.640000] io scheduler noop registered (default)
[    0.640000] io scheduler mq-deadline registered
[    0.640000] io scheduler kyber registered
[    0.640000] STM32 USART driver initialized
[    0.640000] 40011000.serial: ttyS0 at MMIO 0x40011000 (irq = 32, base_baud = 5250000) is a stm32-usart
[    1.020000] console [ttyS0] enabled
[    1.020000] stm32_rtc 40002800.rtc: rtc core: registered 40002800.rtc as rtc0
[    1.040000] stm32_rtc 40002800.rtc: Date/Time must be initialized
[    1.040000] i2c /dev entries driver
[    1.050000] IR NEC protocol handler initialized
[    1.050000] IR RC5(x/sz) protocol handler initialized
[    1.060000] IR RC6 protocol handler initialized
[    1.060000] IR JVC protocol handler initialized
[    1.070000] IR Sony protocol handler initialized
[    1.070000] IR SANYO protocol handler initialized
[    1.080000] IR Sharp protocol handler initialized
[    1.080000] IR MCE Keyboard/mouse protocol handler initialized
[    1.090000] IR XMP protocol handler initialized
[    1.100000] input: gpio_keys as /devices/platform/gpio_keys/input/input0
[    1.110000] stm32_rtc 40002800.rtc: setting system clock to 2000-01-01 00:00:06 UTC (946684806)
[    1.130000] Warning: unable to open an initial console.
[    1.130000] Freeing unused kernel memory: 12K
[    1.130000] This architecture does not have kernel memory protection.
/ #
/ # ls
bin      dev      etc      init     linuxrc  proc     sbin     sys      usr

附录2:buildroot支持的板卡列表
大部分的开发板基本都在这里了。包括imx6ulekv,orangepi,raspberrypi。
wujun@wj-vBox:~/uclinux/stm32/smt32-build/board$ tree -L 2
.
├── acmesystems
│   ├── aria-g25
│   └── arietta-g25
├── altera
│   └── socrates_cyclone5
├── arcturus
│   └── ppc-ucp1020
├── arm
│   ├── foundation-v8
│   └── juno
├── armadeus
│   ├── apf27
│   ├── apf28
│   ├── apf51
│   └── readme.txt
├── atmel
│   ├── at91sam9x5ek_mmc
│   ├── flasher.sh
│   ├── nandflash.tcl
│   ├── readme.txt
│   ├── sama5d2_xplained_mmc
│   ├── sama5d3_xplained_mmc
│   └── sama5d4_xplained_mmc
├── avnet
│   └── s6lx9_microboard
├── beagleboardx15
│   ├── genimage.cfg
│   ├── post-image.sh
│   └── readme.txt
├── beaglebone
│   ├── genimage.cfg
│   ├── genimage_linux41.cfg
│   ├── linux-4.1-sgx.fragment
│   ├── patches
│   ├── post-image.sh
│   ├── readme.txt
│   └── uEnv.txt
├── boundarydevices
│   └── common
├── chromebook
│   └── snow
├── ci20
│   └── readme.txt
├── ci40
│   ├── genimage.cfg
│   ├── post-build.sh
│   └── readme.txt
├── csky
│   ├── gx6605s
│   └── readme.txt
├── cubietech
│   └── cubieboard2
├── digilent
│   └── zybo
├── embest
│   └── riotboard
├── engicam
│   ├── geam6ul
│   ├── icorem6
│   ├── icorem6_rqs
│   └── isiot
├── firefly
│   └── firefly-rk3288
├── freescale
│   ├── common
│   ├── imx23evk
│   ├── imx25pdk
│   ├── imx28evk
│   ├── imx31_3stack
│   ├── imx51evk
│   ├── imx6sabre
│   ├── imx6-sabresd
│   ├── imx6ulevk
│   ├── imx7dsdb
│   ├── mpc8315erdb
│   ├── p1010rdb
│   └── warpboard
├── friendlyarm
│   ├── nanopi-m1
│   ├── nanopi-m1-plus
│   └── nanopi-neo
├── gdb
│   ├── bfin-bf512
│   └── post-build.sh
├── grinn
│   ├── chiliboard
│   └── liteboard
├── hardkernel
│   └── odroidc2
├── intel
│   └── galileo
├── lego
│   └── ev3
├── lemaker
│   └── bananapro
├── linksprite
│   └── pcduino
├── minnowboard
│   ├── fs-overlay-graphical
│   ├── genimage.cfg
│   ├── grub.cfg
│   ├── linux.config
│   ├── post-build.sh
│   ├── post-image.sh
│   └── readme.txt
├── nexbox
│   └── a95x
├── olimex
│   ├── a13_olinuxino
│   ├── a20_olinuxino
│   └── imx233_olinuxino
├── openblocks
│   └── a6
├── orangepi
│   ├── orangepi-one
│   ├── orangepi-pc
│   ├── orangepi-plus
│   ├── orangepi-zero
│   ├── post-build.sh
│   └── post-image.sh
├── pandaboard
│   ├── genimage.cfg
│   ├── post-image.sh
│   └── readme.txt
├── pc
│   ├── genimage-bios.cfg
│   ├── genimage-efi.cfg
│   ├── linux.config
│   ├── post-image.sh
│   └── readme.txt
├── qemu
│   ├── aarch64-virt
│   ├── arm-versatile
│   ├── arm-vexpress
│   ├── m68k-mcf5208
│   ├── m68k-q800
│   ├── microblazebe-mmu
│   ├── microblazeel-mmu
│   ├── mips32r2el-malta
│   ├── mips32r2-malta
│   ├── mips32r6el-malta
│   ├── mips32r6-malta
│   ├── mips64el-malta
│   ├── mips64-malta
│   ├── mips64r6el-malta
│   ├── mips64r6-malta
│   ├── nios2-10m50
│   ├── or1k
│   ├── ppc64le-pseries
│   ├── ppc64-pseries
│   ├── ppc-g3beige
│   ├── ppc-mpc8544ds
│   ├── ppc-virtex-ml507
│   ├── sh4eb-r2d
│   ├── sh4-r2d
│   ├── sparc64-sun4u
│   ├── sparc-ss10
│   ├── x86
│   ├── x86_64
│   └── xtensa-lx60
├── raspberrypi
│   ├── genimage-raspberrypi0.cfg
│   ├── genimage-raspberrypi2.cfg
│   ├── genimage-raspberrypi3-64.cfg
│   ├── genimage-raspberrypi3.cfg
│   ├── genimage-raspberrypi.cfg
│   ├── post-build.sh
│   ├── post-image.sh
│   └── readme.txt
├── raspberrypi0 -> raspberrypi
├── raspberrypi2 -> raspberrypi
├── raspberrypi3 -> raspberrypi
├── raspberrypi3-64 -> raspberrypi
├── roseapplepi
│   ├── genimage.cfg
│   ├── patches
│   ├── post-image.sh
│   └── uEnv.txt
├── sinovoip
│   └── m2-plus
├── solidrun
│   └── mx6cubox
├── stmicroelectronics
│   ├── stm32f429-disco
│   ├── stm32f469-disco
│   └── stm32-post-build.sh
├── synopsys
│   ├── axs10x
│   └── vdk
├── technexion
│   ├── imx6ulpico
│   └── imx7dpico
├── technologic
│   ├── ts4800
│   ├── ts4900
│   ├── ts5x00
│   └── ts7680
├── telit
│   └── evk-pro3
├── toradex
│   └── apalis-imx6
├── udoo
│   ├── mx6qdl
│   └── neo
├── wandboard
│   ├── boot.scr.txt
│   ├── genimage.cfg
│   ├── post-build.sh
│   ├── post-image.sh
│   └── readme.txt
├── warp7
│   ├── readme.txt
│   └── rootfs_overlay
└── zynq
└── readme.txt

附录3:openocd支持的板卡列表
wujun@wj-vBox:~/uclinux/stm32/elinux/openocd/code/tcl/board$ tree
.
├── actux3.cfg
├── adapteva_parallella1.cfg
├── alphascale_asm9260_ek.cfg
├── altera_sockit.cfg
├── am3517evm.cfg
├── arm_evaluator7t.cfg
├── asus-rt-n16.cfg
├── asus-rt-n66u.cfg
├── at91cap7a-stk-sdram.cfg
├── at91eb40a.cfg
├── at91rm9200-dk.cfg
├── at91rm9200-ek.cfg
├── at91sam9261-ek.cfg
├── at91sam9263-ek.cfg
├── at91sam9g20-ek.cfg
├── atmel_at91sam7s-ek.cfg
├── atmel_at91sam9260-ek.cfg
├── atmel_at91sam9rl-ek.cfg
├── atmel_sam3n_ek.cfg
├── atmel_sam3s_ek.cfg
├── atmel_sam3u_ek.cfg
├── atmel_sam3x_ek.cfg
├── atmel_sam4e_ek.cfg
├── atmel_sam4l8_xplained_pro.cfg
├── atmel_sam4s_ek.cfg
├── atmel_sam4s_xplained_pro.cfg
├── atmel_samc20_xplained_pro.cfg
├── atmel_samc21_xplained_pro.cfg
├── atmel_samd20_xplained_pro.cfg
├── atmel_samd21_xplained_pro.cfg
├── atmel_same70_xplained.cfg
├── atmel_samg53_xplained_pro.cfg
├── atmel_samg55_xplained_pro.cfg
├── atmel_saml21_xplained_pro.cfg
├── atmel_samr21_xplained_pro.cfg
├── atmel_samv71_xplained_ultra.cfg
├── balloon3-cpu.cfg
├── bcm28155_ap.cfg
├── bt-homehubv1.cfg
├── colibri.cfg
├── crossbow_tech_imote2.cfg
├── csb337.cfg
├── csb732.cfg
├── da850evm.cfg
├── digi_connectcore_wi-9c.cfg
├── digilent_analog_discovery.cfg
├── digilent_atlys.cfg
├── digilent_zedboard.cfg
├── diolan_lpc4350-db1.cfg
├── diolan_lpc4357-db1.cfg
├── dk-tm4c129.cfg
├── dm355evm.cfg
├── dm365evm.cfg
├── dm6446evm.cfg
├── dp_busblaster_v3.cfg
├── efikamx.cfg
├── efm32.cfg
├── eir.cfg
├── ek-lm3s1968.cfg
├── ek-lm3s3748.cfg
├── ek-lm3s6965.cfg
├── ek-lm3s811.cfg
├── ek-lm3s811-revb.cfg
├── ek-lm3s8962.cfg
├── ek-lm3s9b9x.cfg
├── ek-lm3s9d92.cfg
├── ek-lm4f120xl.cfg
├── ek-lm4f232.cfg
├── ek-tm4c123gxl.cfg
├── ek-tm4c1294xl.cfg
├── embedded-artists_lpc2478-32.cfg
├── emcraft_twr-vf6-som-bsb.cfg
├── emcraft_vf6-som.cfg
├── ethernut3.cfg
├── frdm-kl25z.cfg
├── frdm-kl46z.cfg
├── fsl_imx6q_sabresd.cfg
├── glyn_tonga2.cfg
├── gumstix-aerocore.cfg
├── hammer.cfg
├── hilscher_nxdb500sys.cfg
├── hilscher_nxeb500hmi.cfg
├── hilscher_nxhx10.cfg
├── hilscher_nxhx500.cfg
├── hilscher_nxhx50.cfg
├── hilscher_nxsb100.cfg
├── hitex_lpc1768stick.cfg
├── hitex_lpc2929.cfg
├── hitex_stm32-performancestick.cfg
├── hitex_str9-comstick.cfg
├── iar_lpc1768.cfg
├── iar_str912_sk.cfg
├── icnova_imx53_sodimm.cfg
├── icnova_sam9g45_sodimm.cfg
├── imx27ads.cfg
├── imx27lnst.cfg
├── imx28evk.cfg
├── imx31pdk.cfg
├── imx35pdk.cfg
├── imx53loco.cfg
├── imx53-m53evk.cfg
├── insignal_arndale.cfg
├── kc705.cfg
├── keil_mcb1700.cfg
├── keil_mcb2140.cfg
├── kwikstik.cfg
├── la_fonera-fon2200.cfg
├── lemaker_hikey.cfg
├── linksys_nslu2.cfg
├── linksys-wag200g.cfg
├── linksys-wrt54gl.cfg
├── lisa-l.cfg
├── logicpd_imx27.cfg
├── lpc1850_spifi_generic.cfg
├── lpc4350_spifi_generic.cfg
├── lubbock.cfg
├── marsohod2.cfg
├── marsohod3.cfg
├── marsohod.cfg
├── mbed-lpc11u24.cfg
├── mbed-lpc1768.cfg
├── mcb1700.cfg
├── microchip_explorer16.cfg
├── mini2440.cfg
├── mini6410.cfg
├── minispartan6.cfg
├── nds32_xc5.cfg
├── netgear-dg834v3.cfg
├── netgear-wg102.cfg
├── nordic_nrf51822_mkit.cfg
├── nordic_nrf51_dk.cfg
├── nordic_nrf52_dk.cfg
├── novena-internal-fpga.cfg
├── numato_opsis.cfg
├── nxp_lpc-link2.cfg
├── olimex_LPC2378STK.cfg
├── olimex_lpc_h2148.cfg
├── olimex_sam7_ex256.cfg
├── olimex_sam7_la2.cfg
├── olimex_sam9_l9260.cfg
├── olimex_stm32_h103.cfg
├── olimex_stm32_h107.cfg
├── olimex_stm32_p107.cfg
├── omap2420_h4.cfg
├── open-bldc.cfg
├── openrd.cfg
├── or1k_generic.cfg
├── osk5912.cfg
├── phone_se_j100i.cfg
├── phytec_lpc3250.cfg
├── pic-p32mx.cfg
├── pipistrello.cfg
├── propox_mmnet1001.cfg
├── pxa255_sst.cfg
├── quark_d2000_refboard.cfg
├── quark_x10xx_board.cfg
├── redbee.cfg
├── renesas_dk-s7g2.cfg
├── rsc-w910.cfg
├── sheevaplug.cfg
├── smdk6410.cfg
├── spansion_sk-fm4-176l-s6e2cc.cfg
├── spansion_sk-fm4-u120-9b560.cfg
├── spear300evb.cfg
├── spear300evb_mod.cfg
├── spear310evb20.cfg
├── spear310evb20_mod.cfg
├── spear320cpu.cfg
├── spear320cpu_mod.cfg
├── steval_pcc010.cfg
├── stm320518_eval.cfg
├── stm320518_eval_stlink.cfg
├── stm32100b_eval.cfg
├── stm3210b_eval.cfg
├── stm3210c_eval.cfg
├── stm3210e_eval.cfg
├── stm3220g_eval.cfg
├── stm3220g_eval_stlink.cfg
├── stm3241g_eval.cfg
├── stm3241g_eval_stlink.cfg
├── stm32429i_eval.cfg
├── stm32429i_eval_stlink.cfg
├── stm32439i_eval.cfg
├── stm32439i_eval_stlink.cfg
├── stm327x6g_eval.cfg
├── stm32f0discovery.cfg
├── stm32f334discovery.cfg
├── stm32f3discovery.cfg
├── stm32f429disc1.cfg
├── stm32f429discovery.cfg
├── stm32f469discovery.cfg
├── stm32f4discovery.cfg
├── stm32f7discovery.cfg
├── stm32l0discovery.cfg
├── stm32l4discovery.cfg
├── stm32ldiscovery.cfg
├── stm32vldiscovery.cfg
├── st_nucleo_f0.cfg
├── st_nucleo_f103rb.cfg
├── st_nucleo_f3.cfg
├── st_nucleo_f4.cfg
├── st_nucleo_f7.cfg
├── st_nucleo_l073rz.cfg
├── st_nucleo_l1.cfg
├── st_nucleo_l476rg.cfg
├── str910-eval.cfg
├── telo.cfg
├── ti_am335xevm.cfg
├── ti_am437x_idk.cfg
├── ti_am43xx_evm.cfg
├── ti_beagleboard.cfg
├── ti_beagleboard_xm.cfg
├── ti_beaglebone-base.cfg
├── ti_beaglebone_black.cfg
├── ti_beaglebone.cfg
├── ti_blaze.cfg
├── ti-cc3200-launchxl.cfg
├── ti_pandaboard.cfg
├── ti_pandaboard_es.cfg
├── ti_tmdx570ls20susb.cfg
├── ti_tmdx570ls31usb.cfg
├── tocoding_poplar.cfg
├── topas910.cfg
├── topasa900.cfg
├── tp-link_tl-mr3020.cfg
├── tp-link_wdr4300.cfg
├── twr-k60f120m.cfg
├── twr-k60n512.cfg
├── twr-vf65gs10.cfg
├── twr-vf65gs10_cmsisdap.cfg
├── tx25_stk5.cfg
├── tx27_stk5.cfg
├── unknown_at91sam9260.cfg
├── uptech_2410.cfg
├── verdex.cfg
├── voipac.cfg
├── voltcraft_dso-3062c.cfg
├── x300t.cfg
├── xmc1100-boot-kit.cfg
├── xmc-2go.cfg
├── xmc4200-application-kit-actuator.cfg
├── xmc4300-relax.cfg
├── xmc4500-application-kit-general.cfg
├── xmc4500-application-kit-sdram.cfg
├── xmc4500-relax.cfg
├── xmc4700-relax.cfg
├── xmc4800-relax.cfg
├── xmos_xk-xac-xa8_arm.cfg
└── zy1000.cfg

附录4:STM32F429I-DISCO-mini.bin.gz
想偷懒的同学可以直接解压用ST link烧到内部flash就行了。

控制台接PA9和PA10用TTL转USB接到PC、

http://pan.baidu.com/s/1boP66sB