10-05-2019, 06:11 PM
XTW100 编程器用的是 STM32F103 的 MCU,理论上可以刷任何 STM32 的固件。
首先是刷写问题,根据帖子 http://bbs.mydigit.cn/read.php?tid=21699...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 的那个串口例子跑起来了。
接下来是尝试刷 serprog,我用的是 stm32-vserprog. 添加 XTW100 的头文件:https://github.com/dword1511/stm32-vserprog/pull/37/files
但是 XTW100 的板子的线路和 stm32-vserprog 的参考实现不太一样,测试时发现只有第一次 flash 读是正常的,之后再读或者做擦除/写入操作就出错了。
首先是刷写问题,根据帖子 http://bbs.mydigit.cn/read.php?tid=21699...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 读是正常的,之后再读或者做擦除/写入操作就出错了。