无线调试STM32

我想谈谈ESP8266作为STM32和openOCD之间的中介的不寻常用法。此方法有很多缺点,其应用只能由无法使用常规(有线)调试工具引起。

这种方法有一个优点,而且很明显,因此我将直接介绍缺点:

  1. 需要OpenOCD补丁
  2. 需要在ESP8266中更改固件
  3. 低速

如何运作?OpenOCD实现了对SWD协议的支持,此外还有一个名为remote_bitbang的驱动程序。从名称可以看出,逻辑电平仅通过数字1和0传输,然后通过网络发送。

接收器(在我们的情况下为ESP8266)必须根据这些编号在终端上设置相应的电平。不幸的是,remote_bitbang缺乏SWD支持,但是添加它一点也不困难:

这是一个小补丁
--- remote_bitbang.c	2016-10-31 11:06:57.812267924 +0600
+++ remote_bitbang.c	2016-10-31 12:33:57.921692808 +0600
@@ -120,11 +120,25 @@
 	remote_bitbang_putc(c);
 }
 
+static int remote_bitbang_swdio_read (void)
+{
+	remote_swd_putc ('R');
+	return remote_bitbang_rread ();
+}
+
+static void remote_bitbang_swdio_drive (bool is_output)
+{
+	char c = is_output ? 'o' : 'i';
+	remote_bitbang_putc (c);
+}
+
 static struct bitbang_interface remote_bitbang_bitbang = {
 	.read = &remote_bitbang_read,
 	.write = &remote_bitbang_write,
 	.reset = &remote_bitbang_reset,
 	.blink = &remote_bitbang_blink,
+	.swdio_read = &remote_bitbang_swdio_read,
+	.swdio_drive = &remote_bitbang_swdio_drive,	
 };
 
 static int remote_bitbang_init_tcp(void)
@@ -271,10 +285,14 @@
 	COMMAND_REGISTRATION_DONE,
 };
 
+static const char * const remote_bitbang_transport[] = { "jtag", "swd", NULL };
+
 struct jtag_interface remote_bitbang_interface = {
 	.name = "remote_bitbang",
+	.transports = remote_bitbang_transport,
 	.execute_queue = &bitbang_execute_queue,
 	.commands = remote_bitbang_command_handlers,
+	.swd = &bitbang_swd,
 	.init = &remote_bitbang_init,
 	.quit = &remote_bitbang_quit,
 };


接下来,我们需要更改ESP8266固件,以使其了解来自openOCD的命令。为此,我使用了esp-open-rtos open SDK 我不会给出完整的固件代码-它相当庞大,我只会给出有关处理来自openOCD的数据的部分。

扰流板
#define SWCLK				0
#define SWDIO				2

IRAM void openocd_handler (void *pvParameters)
{
	struct netconn *nc = (struct netconn *) pvParameters;
	struct netbuf *rbuf = NULL;
	char *rx_buf;
	char d, r;
	err_t err;
	uint16_t len;
	uint16_t i;
	
	gpio_set_pullup (SWCLK, false, false);
	gpio_set_pullup (SWDIO, false, false);
	gpio_enable (SWCLK, GPIO_OUTPUT);
	gpio_enable (SWDIO, GPIO_OUTPUT);
	
	while (1)
	{
		if ((err = netconn_recv (nc, &rbuf)) != ERR_OK) {
			printf ("R ERROR %d\n", err);
			return;
		}
		
		netbuf_data (rbuf, (void **) &rx_buf, &len);	
		
		for (i = 0; i < len; i++)
		{
			switch (rx_buf [i])
			{
			case 'Q':		// Quit
				netconn_disconnect (nc);
				return;
			
			case '0'...'7':
				d = rx_buf [i] - '0';
				gpio_write (SWDIO, (d & 0x1));
				gpio_write (SWCLK, !!(d & 0x4));								
				break;
			
			case 'i':
				gpio_enable (SWDIO, GPIO_INPUT);
				break;
			
			case 'o':
				gpio_enable (SWDIO, GPIO_OUTPUT);
				break;
			
			case 'R':		// Writeback
				r = ((char) gpio_read (SWDIO)) + '0';
				netconn_write (nc, &r, 1, NETCONN_COPY);
				break; 
			}
		}
		
		netbuf_delete (rbuf);
	}
}


完整的源代码可以在这里找到

我正在使用ESP-01。她有两个空闲的支脚,GPIO-0和GPIO-2,并且在打开时,第二支支脚应处于高电平,否则控制器将进入引导加载程序模式。因此,建议通过10k电阻将脚拉至电源。

至于低速。是的,他一步步走得很可悲,但是您可以填写固件,设置中断或读取变量。

从理论上讲,如果将openOCD移植到ESP8266,则可以达到与st-link相当的速度,但我将其留给读者。

我希望有人会有用。

Source: https://habr.com/ru/post/zh-CN398781/


All Articles