WeHack BBS
尝试把 XTW100 编程器变成 serprog 协议的编程器 - 可打印的版本

+- WeHack BBS (https://bbs.wehack.space)
+-- 版块: 计算机技术 (https://bbs.wehack.space/forum-5.html)
+--- 版块: 固件技术讨论区 (https://bbs.wehack.space/forum-8.html)
+--- 主题: 尝试把 XTW100 编程器变成 serprog 协议的编程器 (/thread-83.html)



尝试把 XTW100 编程器变成 serprog 协议的编程器 - vimacs - 10-05-2019

XTW100 编程器用的是 STM32F103 的 MCU,理论上可以刷任何 STM32 的固件。

首先是刷写问题,根据帖子 http://bbs.mydigit.cn/read.php?tid=2169979&ds=1&page=2#58286050 的提示,把 0 欧电阻 R6 拆掉,就可以用 ISP1 那几个引脚编程了。方法是拿一个 USB 转 TTL 的串口转接器,把 ISP1 的 N 和 E 两脚短接,T 接串口的 RXD,R 接串口的 TXD,G 接串口的 GND,然后就可以用 stm32flash 刷 STM32 的固件了。

在开始尝试刷 serprog 失败后,我想到的 STM32 固件是 GNUK OpenPGP 智能卡固件。GNUK 用了一个称为 chopstx 的库,里面带了几个示例,例如 USB 串口测试程序。开始的时候我不知道怎么让 XTW100 的 USB 工作起来,后来发现它的 USBDP 除了接着 PA12 之外,还隔着一个电阻接着 PB8,根据这个改 chopstx 的配置,终于把 chopstx 的那个串口例子跑起来了。

代码:
#define BOARD_NAME "XTW100 PRO"
#define BOARD_ID    0xabcd1234

#define MCU_STM32F1 1
#define STM32F10X_MD        /* Medium-density device */

#define STM32_PLLXTPRE                  STM32_PLLXTPRE_DIV1
#define STM32_PLLMUL_VALUE              9
#define STM32_HSECLK                    8000000

#define GPIO_LED_BASE   GPIOB_BASE
#define GPIO_LED_SET_TO_EMIT          7
#define GPIO_USB_BASE   GPIOB_BASE
#define GPIO_USB_SET_TO_ENABLE        8
#define GPIO_OTHER_BASE GPIOA_BASE

/*
* Port A setup.
* PA11 - Push Pull output 10MHz 0 default (until USB enabled) (USBDM)
* PA12 - Push Pull output 10MHz 0 default (until USB enabled) (USBDP)
*
* Port B setup.
* PB7 - Push pull output 50MHz (LED 1:ON 0:OFF)
* PB8 - Push pull output 50MHz (USB 1:ON 0:OFF)
* ------------------------ Default
* PAx  - input with pull-up
* PCx  - input with pull-up
*/
#define VAL_GPIO_OTHER_ODR            0xFFFFE7FF
#define VAL_GPIO_OTHER_CRL            0x88888888      /*  PA7...PA0 */
#define VAL_GPIO_OTHER_CRH            0x88811888      /* PA15...PA8 */

#define VAL_GPIO_LED_ODR            0xFFFFFFFF
#define VAL_GPIO_LED_CRL            0x38888888      /*  PB7...PB0 */
#define VAL_GPIO_LED_CRH            0x88888883      /* PB15...PB8 */

#define RCC_ENR_IOP_EN      (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN)
#define RCC_RSTR_IOP_RST    (RCC_APB2RSTR_IOPARST | RCC_APB2RSTR_IOPBRST)

接下来是尝试刷 serprog,我用的是 stm32-vserprog. 添加 XTW100 的头文件:https://github.com/dword1511/stm32-vserprog/pull/37/files

但是 XTW100 的板子的线路和 stm32-vserprog 的参考实现不太一样,测试时发现只有第一次 flash 读是正常的,之后再读或者做擦除/写入操作就出错了。