histamine 发表于 2013-2-4 20:40:43

展示下自制的三个非基于arduino的最小系统(更新stm32f103c8使用maple开发的内容)

本帖最后由 histamine 于 2013-2-5 20:17 编辑

论坛里展示自制arduino最小系统的人比较多,我来展示三个自制的非基于arduino的最小系统

stm8s105k4t6最小系统:
该芯片价格大概3.2元/片,16k flash 2k ram,性价比很高,缺点是没有成熟的开源编译器支持
该mcu首次下载程序时,需要通过串口下载特定的程序修改option byte启用bootloader,就可以一直使用串口下载




pic18f14k50最小系统:
pic 支持usb的8位单片机中性价比极高的一款,淘宝零售购入价6元/片,硬件支持usb通讯,有16k flash , 768b ram,9个支持ad管脚
可以烧录usb hid bootloader,使用usb口进行程序下载




xilinx xc9572xl最小系统:
cpld芯片,管脚可以耐压5v输入,用于替代74系列ic的组合电路,
可以使用arduino制作的svf player下载程序(速度比较慢)或者ft232h/ft2232h核心板制作svf player下载程序




前段时间还研究了一下如何在淘宝上卖的stm32f103c8t6最小系统(30元不到,64k flash 20k ram 72mhz,性价比远高于arduino uno)上使用maple进行开发(兼容arduino,使用stm32自带的usb下载程序),如果有同学感兴趣,我也可以分享一下

flashria 发表于 2013-2-5 19:18:02

我现在就再用stm32f103c8t6的板子   还买了jlink感觉这玩意比arduino强的不至一点点并且价钱还便宜 不过没arduino傻瓜化

histamine 发表于 2013-2-5 20:05:51

本帖最后由 histamine 于 2013-2-5 20:13 编辑

flashria 发表于 2013-2-5 19:18 static/image/common/back.gif
我现在就再用stm32f103c8t6的板子   还买了jlink感觉这玩意比arduino强的不至一点点并且价钱还便宜 不过 ...

可以用maple进行开发,就是stm32版本的arduino
http://leaflabs.com/

不过官方提供的固件需要开发板上有一个由两个三极管和几个电阻组成的usb复位电路才能正常工作,大部分stm32f103c8t6核心都没这个电路,所以固件要自己修改下才能用

这里提供修改好的固件,适用于stm32f103c8t6最小系统 8mhz晶振

固件:


硬件使用说明:
需要把PB9引脚(usb disc)和PA12引脚(usb dp)相连接,用PB9引脚来进行usb复位
正常使用时PB8接GND,bootloader会自动转入user code执行;需要锁定在DFU模式时,将PB8接到VCC上面,bootloader会一直停留在dfu模式,不转入user code

软件使用说明:
maple的固件可以用jlink或者串口下载

下载完后第一次使用请将PB8接到VCC上锁定在DFU模式,将stm32f103c8t6板子上的usb口接到电脑上
这时会识别到maple dfu设备,请安装dfu驱动

安装好dfu驱动后,请将usb.c和usb_config.h两个文件复制到maple IDE下的hardware/leaflabs/cores/maple目录中,替换同名文件,这样才能正常使用usb虚拟串口功能

然后打开maple ide,board选中maple mini,下载任意程序
接着拔掉usb线,将PB8接到GND上,然后再插上usb线,上电执行程序,让bootloader自动跳转入user code
跳转入user code后,电脑会识别到maple虚拟串口设备,请安装相应的虚拟串口驱动

以后每次下载时board选择maple mini并选中stm32虚拟出来的串口即可,注意最终程序大小不要超过44K,可以自行修改下hardware/leaflabs/cores/maple/maple_mini/flash.ld和hardware/leaflabs/boards.txt进行限制


下载程序


stm32f103c8t6最小系统板运行呼吸灯程序

各管脚定义请参考:
http://leaflabs.com/docs/hardware/maple-mini.html

有任何问题请留言

L.anrist 发表于 2013-2-5 20:28:15

这个帖子是实力帖!

flashria 发表于 2013-2-5 21:37:49

histamine 发表于 2013-2-5 20:05 static/image/common/back.gif
可以用maple进行开发,就是stm32版本的arduino
http://leaflabs.com/



谢谢有时间弄下 不过stm32本身的固件库 也不错使用起来也不算太麻烦

太行摄狼 发表于 2013-2-22 19:30:15

STM32F103C8T6是个好东西,淘宝所有板子都可以吗?多放些资料

pophelix 发表于 2013-3-17 11:50:07

能开放源码么?

histamine 发表于 2013-3-17 12:06:14

本帖最后由 histamine 于 2013-3-17 12:08 编辑

@pophelix

我的代码是在maple主干上修改的,改完了才发现原来还有个maple-mini的分支:L

放上bootloader修改patch
diff --git a/config.h b/config.h
index def4f99..b35c00b 100644
--- a/config.h
+++ b/config.h
@@ -35,21 +35,21 @@

#include "common.h"

-#define LED_BANK GPIOA
-#define LED      5
+#define LED_BANK GPIOB
+#define LED      1
#define BLINK_FAST 0x50000
#define BLINK_SLOW 0x100000

-#define BUTTON_BANK GPIOC
-#define BUTTON      9
+#define BUTTON_BANK GPIOB
+#define BUTTON      8

#define STARTUP_BLINKS 5
-#define BOOTLOADER_WAIT 6
+#define BOOTLOADER_WAIT 10

#define USER_CODE_RAM   ((u32)0x20000C00)
#define RAM_END         ((u32)0x20005000)
#define USER_CODE_FLASH   ((u32)0x08005000)
-#define FLASH_END         ((u32)0x08020000)
+#define FLASH_END         ((u32)0x08010000)

#define VEND_ID0 0xAF
#define VEND_ID1 0x1E
diff --git a/hardware.c b/hardware.c
index d3d985e..36f0f63 100644
--- a/hardware.c
+++ b/hardware.c
@@ -101,18 +101,16 @@ void setupLED(void) {

   /* Setup APB2 (GPIOA) */
   rwmVal =GET_REG(RCC_APB2ENR);
-    rwmVal |= 0x00000004;
+    rwmVal |= 0x00000008;
   SET_REG(RCC_APB2ENR, rwmVal);

   /* Setup GPIOA Pin 5 as PP Out */
-    SET_REG(GPIO_CRL(GPIOA), 0x00100000);
-
-    rwmVal =GET_REG(GPIO_CRL(GPIOA));
-    rwmVal &= 0xFF0FFFFF;
-    rwmVal |= 0x00100000;
-    SET_REG(GPIO_CRL(GPIOA), rwmVal);
+    rwmVal =GET_REG(GPIO_CRL(GPIOB));
+    rwmVal &= 0xFFFFFF0F;
+    rwmVal |= 0x00000010;
+    SET_REG(GPIO_CRL(GPIOB), rwmVal);

-    setPin(GPIOA, 5);
+    setPin(GPIOB, 1);
}

void setupBUTTON(void) {
@@ -121,14 +119,14 @@ void setupBUTTON(void) {

   /* Setup APB2 (GPIOC) */
   rwmVal =GET_REG(RCC_APB2ENR);
-    rwmVal |= 0x00000010;
+    rwmVal |= 0x00000008;
   SET_REG(RCC_APB2ENR, rwmVal);

   /* Setup GPIOC Pin 9 as PP Out */
-    rwmVal =GET_REG(GPIO_CRH(GPIOC));
-    rwmVal &= 0xFFFFFF0F;
-    rwmVal |= 0x00000040;
-    SET_REG(GPIO_CRH(GPIOC), rwmVal);
+    rwmVal =GET_REG(GPIO_CRH(GPIOB));
+    rwmVal &= 0xFFFFFFF0;
+    rwmVal |= 0x00000001;
+    SET_REG(GPIO_CRH(GPIOB), rwmVal);

}

diff --git a/hardware.h b/hardware.h
index 70f06c7..ec447a6 100644
--- a/hardware.h
+++ b/hardware.h
@@ -33,6 +33,7 @@
#define RCC   ((u32)0x40021000)
#define FLASH ((u32)0x40022000)
#define GPIOA ((u32)0x40010800)
+#define GPIOB ((u32)0x40010C00)
#define GPIOC ((u32)0x40011000)

#define RCC_CR      RCC
diff --git a/stm32_lib/c_only_md.ld b/stm32_lib/c_only_md.ld
index 43073a7..a301023 100644
--- a/stm32_lib/c_only_md.ld
+++ b/stm32_lib/c_only_md.ld
@@ -24,8 +24,8 @@ _Minimum_Stack_Size = 0x100 ;

MEMORY
{
-RAM (xrw)   : ORIGIN = 0x20000000, LENGTH =20K
-FLASH (rx)    : ORIGIN = 0x08000000, LENGTH = 128K
+RAM (xrw)   : ORIGIN = 0x20000000, LENGTH =20K
+FLASH (rx)    : ORIGIN = 0x08000000, LENGTH =64K
}

/* higher address of the user mode stack */
diff --git a/usb.c b/usb.c
index b6d2a67..f848eaa 100644
--- a/usb.c
+++ b/usb.c
@@ -33,26 +33,47 @@
#include "usb.h"
#include "dfu.h"

+static inline void delay_us(u32 us) {
+    us *= 12;
+
+    /* fudge for function call overhead*/
+    us--;
+    asm volatile("   mov r0, %          \n\t"
+               "1: subs r0, #1            \n\t"
+               "   bhi 1b               \n\t"
+               :
+               : "r" (us)
+               : "r0");
+}
+
void setupUSB(void) {
   u32 rwmVal; /* read-write-modify place holder var */

   /* Setup the USB DISC Pin */
   rwmVal= GET_REG(RCC_APB2ENR);
-    rwmVal |= 0x00000010;
+    rwmVal |= 0x00000008;
   SET_REG(RCC_APB2ENR, rwmVal);

   // todo, macroize usb_disc pin
   /* Setup GPIOC Pin 12 as OD out */
-    rwmVal= GET_REG(GPIO_CRH(GPIOC));
-    rwmVal &= 0xFFF0FFFF;
-    rwmVal |= 0x00050000;
-    setPin(GPIOC, 12);
-    SET_REG(GPIO_CRH(GPIOC), rwmVal);
+    rwmVal= GET_REG(GPIO_CRH(GPIOB));
+    rwmVal &= 0xFFFFFF0F;
+    rwmVal |= 0x00000010;
+    SET_REG(GPIO_CRH(GPIOB), rwmVal);
+    setPin(GPIOB, 9);

+    delay_us(200);
   pRCC->APB1ENR |= 0x00800000;

   /* initialize the usb application */
-    resetPin(GPIOC, 12);/* present ourselves to the host */
+    resetPin(GPIOB, 9);/* present ourselves to the host */
+    delay_us(100);
+
+    rwmVal= GET_REG(GPIO_CRH(GPIOB));
+    rwmVal &= 0xFFFFFF0F;
+    rwmVal |= 0x00000040;
+    SET_REG(GPIO_CRH(GPIOB), rwmVal);
+
   usbAppInit();

}
serialusb修改过后的源代码已经包含在上面的固件包里面了

shellcode 发表于 2013-4-1 15:57:02

这个得要支持呀。

luhuaneda 发表于 2013-5-17 13:20:18

本帖最后由 luhuaneda 于 2013-5-17 13:41 编辑

手头上有奋斗stm32的tiny开发板,用的ic是stm32f103c8,按照lz上面的方法,改成maple不成功,请教Lz一些问题。
tiny板上面连接是
USB DISC Pin 是GPIOC 13,
BOTTON      是GPIOB 8,
Led               是GPIOB 5.
BOOT0         的电路我改成官方电路。
tiny板上USB DISC Pin的电路

根据lz的代码跟tiny板上对应改好,代码包是maple-bootloader-master。下载程序。上电后发现新硬件,选择drivers\mapleDrv\dfu驱动。然后电脑的设备管理器 发现有libusb_win32 devices ,Maple 003的设备。但是没有发现虚拟串口的提示。lz上面介绍用压缩文件包里面的usb文件做覆盖也做了。

histamine 发表于 2013-5-17 14:01:29

如果USB DISC Pin引脚定义变了,我提供的libmaple中的usb.c和usb_config.h这两个文件中的USB Disc pin也需要对应的改一下才行

没出来虚拟串口设备,应该和usb disc pin的操作有关,从bootloader转入usercode,usercode需要通过控制usb disc pin拉高一下usb dp才能让电脑重新对usb设备进行枚举识别

@luhuaneda

luhuaneda 发表于 2013-5-17 16:54:10

我把usb_config.h中的USB_DISC_DEV, USB_DISC_PIN改了成gpioc,13。尝试下载一个程序,提示如lz位的图1。但是虚拟的串口设备还是没有出来,电脑提示usb无法识别

luhuaneda 发表于 2013-5-18 01:35:12

下载maple-bootloader的分支mini-boot重新改了一下端口,ok了。
感谢lz帮忙。

xuqin3 发表于 2013-6-5 00:07:17

stm32是好东西

xu4hang 发表于 2013-6-17 10:50:17

STM8很好的片子,各种外设用起来很爽。
页: [1] 2 3
查看完整版本: 展示下自制的三个非基于arduino的最小系统(更新stm32f103c8使用maple开发的内容)