极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 98753|回复: 35

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

[复制链接]
发表于 2013-2-4 20:40:43 | 显示全部楼层 |阅读模式
本帖最后由 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下载程序),如果有同学感兴趣,我也可以分享一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +1 收起 理由
幻生幻灭 + 1 鼓励新人贴

查看全部评分

回复

使用道具 举报

发表于 2013-2-5 19:18:02 | 显示全部楼层
我现在就再用stm32f103c8t6的板子   还买了jlink  感觉这玩意比arduino强的不至一点点  并且价钱还便宜 不过没arduino傻瓜化
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-5 20:05:51 | 显示全部楼层
本帖最后由 histamine 于 2013-2-5 20:13 编辑
flashria 发表于 2013-2-5 19:18
我现在就再用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

有任何问题请留言

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-2-5 20:28:15 | 显示全部楼层
这个帖子是实力帖!
回复 支持 反对

使用道具 举报

发表于 2013-2-5 21:37:49 | 显示全部楼层
histamine 发表于 2013-2-5 20:05
可以用maple进行开发,就是stm32版本的arduino
http://leaflabs.com/

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

使用道具 举报

发表于 2013-2-22 19:30:15 | 显示全部楼层
STM32F103C8T6是个好东西,淘宝所有板子都可以吗?多放些资料
回复 支持 反对

使用道具 举报

发表于 2013-3-17 11:50:07 | 显示全部楼层
能开放源码么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-17 12:06:14 | 显示全部楼层
本帖最后由 histamine 于 2013-3-17 12:08 编辑

@pophelix

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

放上bootloader修改patch

  1. diff --git a/config.h b/config.h
  2. index def4f99..b35c00b 100644
  3. --- a/config.h
  4. +++ b/config.h
  5. @@ -35,21 +35,21 @@

  6. #include "common.h"

  7. -#define LED_BANK GPIOA
  8. -#define LED      5
  9. +#define LED_BANK GPIOB
  10. +#define LED      1
  11. #define BLINK_FAST 0x50000
  12. #define BLINK_SLOW 0x100000

  13. -#define BUTTON_BANK GPIOC
  14. -#define BUTTON      9
  15. +#define BUTTON_BANK GPIOB
  16. +#define BUTTON      8

  17. #define STARTUP_BLINKS 5
  18. -#define BOOTLOADER_WAIT 6
  19. +#define BOOTLOADER_WAIT 10

  20. #define USER_CODE_RAM     ((u32)0x20000C00)
  21. #define RAM_END           ((u32)0x20005000)
  22. #define USER_CODE_FLASH   ((u32)0x08005000)
  23. -#define FLASH_END         ((u32)0x08020000)
  24. +#define FLASH_END         ((u32)0x08010000)

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

  32.      /* Setup APB2 (GPIOA) */
  33.      rwmVal =  GET_REG(RCC_APB2ENR);
  34. -    rwmVal |= 0x00000004;
  35. +    rwmVal |= 0x00000008;
  36.      SET_REG(RCC_APB2ENR, rwmVal);

  37.      /* Setup GPIOA Pin 5 as PP Out */
  38. -    SET_REG(GPIO_CRL(GPIOA), 0x00100000);
  39. -
  40. -    rwmVal =  GET_REG(GPIO_CRL(GPIOA));
  41. -    rwmVal &= 0xFF0FFFFF;
  42. -    rwmVal |= 0x00100000;
  43. -    SET_REG(GPIO_CRL(GPIOA), rwmVal);
  44. +    rwmVal =  GET_REG(GPIO_CRL(GPIOB));
  45. +    rwmVal &= 0xFFFFFF0F;
  46. +    rwmVal |= 0x00000010;
  47. +    SET_REG(GPIO_CRL(GPIOB), rwmVal);

  48. -    setPin(GPIOA, 5);
  49. +    setPin(GPIOB, 1);
  50. }

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

  53.      /* Setup APB2 (GPIOC) */
  54.      rwmVal =  GET_REG(RCC_APB2ENR);
  55. -    rwmVal |= 0x00000010;
  56. +    rwmVal |= 0x00000008;
  57.      SET_REG(RCC_APB2ENR, rwmVal);

  58.      /* Setup GPIOC Pin 9 as PP Out */
  59. -    rwmVal =  GET_REG(GPIO_CRH(GPIOC));
  60. -    rwmVal &= 0xFFFFFF0F;
  61. -    rwmVal |= 0x00000040;
  62. -    SET_REG(GPIO_CRH(GPIOC), rwmVal);
  63. +    rwmVal =  GET_REG(GPIO_CRH(GPIOB));
  64. +    rwmVal &= 0xFFFFFFF0;
  65. +    rwmVal |= 0x00000001;
  66. +    SET_REG(GPIO_CRH(GPIOB), rwmVal);

  67. }

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

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

  84. MEMORY
  85. {
  86. -  RAM (xrw)     : ORIGIN = 0x20000000, LENGTH =  20K
  87. -  FLASH (rx)    : ORIGIN = 0x08000000, LENGTH = 128K
  88. +  RAM (xrw)     : ORIGIN = 0x20000000, LENGTH =  20K
  89. +  FLASH (rx)    : ORIGIN = 0x08000000, LENGTH =  64K
  90. }

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

  99. +static inline void delay_us(u32 us) {
  100. +    us *= 12;
  101. +
  102. +    /* fudge for function call overhead  */
  103. +    us--;
  104. +    asm volatile("   mov r0, %[us]          \n\t"
  105. +                 "1: subs r0, #1            \n\t"
  106. +                 "   bhi 1b                 \n\t"
  107. +                 :
  108. +                 : [us] "r" (us)
  109. +                 : "r0");
  110. +}
  111. +
  112. void setupUSB(void) {
  113.      u32 rwmVal; /* read-write-modify place holder var */

  114.      /* Setup the USB DISC Pin */
  115.      rwmVal  = GET_REG(RCC_APB2ENR);
  116. -    rwmVal |= 0x00000010;
  117. +    rwmVal |= 0x00000008;
  118.      SET_REG(RCC_APB2ENR, rwmVal);

  119.      // todo, macroize usb_disc pin
  120.      /* Setup GPIOC Pin 12 as OD out */
  121. -    rwmVal  = GET_REG(GPIO_CRH(GPIOC));
  122. -    rwmVal &= 0xFFF0FFFF;
  123. -    rwmVal |= 0x00050000;
  124. -    setPin(GPIOC, 12);
  125. -    SET_REG(GPIO_CRH(GPIOC), rwmVal);
  126. +    rwmVal  = GET_REG(GPIO_CRH(GPIOB));
  127. +    rwmVal &= 0xFFFFFF0F;
  128. +    rwmVal |= 0x00000010;
  129. +    SET_REG(GPIO_CRH(GPIOB), rwmVal);
  130. +    setPin(GPIOB, 9);

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

  133.      /* initialize the usb application */
  134. -    resetPin(GPIOC, 12);  /* present ourselves to the host */
  135. +    resetPin(GPIOB, 9);  /* present ourselves to the host */
  136. +    delay_us(100);
  137. +
  138. +    rwmVal  = GET_REG(GPIO_CRH(GPIOB));
  139. +    rwmVal &= 0xFFFFFF0F;
  140. +    rwmVal |= 0x00000040;
  141. +    SET_REG(GPIO_CRH(GPIOB), rwmVal);
  142. +
  143.      usbAppInit();

  144. }
复制代码
serialusb修改过后的源代码已经包含在上面的固件包里面了
回复 支持 反对

使用道具 举报

发表于 2013-4-1 15:57:02 | 显示全部楼层
这个得要支持呀。
回复 支持 反对

使用道具 举报

发表于 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文件做覆盖也做了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
回复 支持 反对

使用道具 举报

发表于 2013-5-17 16:54:10 | 显示全部楼层
我把usb_config.h中的USB_DISC_DEV, USB_DISC_PIN改了成gpioc,13。尝试下载一个程序,提示如lz位的图1。但是虚拟的串口设备还是没有出来,电脑提示usb无法识别
回复 支持 反对

使用道具 举报

发表于 2013-5-18 01:35:12 | 显示全部楼层
下载maple-bootloader的分支mini-boot重新改了一下端口,ok了。
感谢lz帮忙。
回复 支持 反对

使用道具 举报

发表于 2013-6-5 00:07:17 来自手机 | 显示全部楼层
stm32是好东西
回复 支持 反对

使用道具 举报

发表于 2013-6-17 10:50:17 | 显示全部楼层
STM8很好的片子,各种外设用起来很爽。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 21:15 , Processed in 0.047109 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表