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
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 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
2 #include
3 #include
4
1 #include
2 #include
3 #include
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