STM32 debugging nirkabel

Saya ingin berbicara tentang penggunaan ESP8266 yang tidak biasa sebagai perantara antara STM32 dan openOCD. Metode ini memiliki banyak kelemahan dan penerapannya hanya dapat disebabkan oleh ketidakmampuan untuk menggunakan alat debugging (kabel) biasa.

Metode ini memiliki satu nilai tambah, dan itu sudah jelas, jadi saya akan langsung menuju kekurangan:

  1. Diperlukan patch OpenOCD
  2. Perlu mengubah firmware di ESP8266
  3. Kecepatan rendah

Bagaimana cara kerjanya? OpenOCD mengimplementasikan dukungan untuk protokol SWD, selain itu ada driver yang disebut remote_bitbang. Dari namanya dapat dilihat bahwa level logika hanya ditransmisikan oleh angka 1 dan 0 dan kemudian dikirim melalui jaringan.

Penerima (dalam kasus kami ESP8266) harus mengatur level yang sesuai pada terminal sesuai dengan angka-angka ini. Sayangnya, remote_bitbang tidak memiliki dukungan SWD, tetapi menambahkannya sama sekali tidak sulit:

Ini tambalan kecil
--- 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,
 };


Selanjutnya, kita perlu mengubah firmware ESP8266 sehingga mengerti perintah yang berasal dari openOCD. Untuk tujuan ini, saya menggunakan SDK esp-open-rtos . Saya tidak akan memberikan seluruh kode firmware - ini agak banyak, saya hanya akan memberikan bagiannya mengenai pemrosesan data yang diterima dari openOCD.

Spoiler
#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);
	}
}


Kode sumber lengkap dapat ditemukan di sini.

Saya menggunakan ESP-01. Ia memiliki dua kaki bebas, GPIO-0 dan GPIO-2, dan ketika dinyalakan, kaki ke-2 harus berada pada tingkat tinggi, jika tidak maka controller akan masuk ke mode bootloader. Oleh karena itu, disarankan untuk menarik kaki ke catu daya melalui resistor 10k.

Sedangkan untuk kecepatan rendah. Ya, dia berjalan langkah demi langkah dengan agak sedih, tetapi Anda dapat mengisi firmware, mengatur interupsi atau membaca variabel.

Secara teoritis, jika Anda melakukan port openOCD ke ESP8266, Anda dapat mencapai kecepatan yang sebanding dengan st-link, tetapi saya serahkan kepada pembaca.

Semoga ada yang bisa bermanfaat.

Source: https://habr.com/ru/post/id398781/


All Articles