التصحيح اللاسلكي STM32

أريد أن أتحدث عن الاستخدام غير المعتاد لـ ESP8266 كوسيط بين STM32 و openOCD. تحتوي هذه الطريقة على الكثير من العيوب ولا يمكن تطبيقها إلا بسبب عدم القدرة على استخدام أداة التصحيح (السلكية) المعتادة.

هذه الطريقة لها زائد واحد ، وهي واضحة ، لذلك سأذهب مباشرة إلى العيوب:

  1. مطلوب تصحيح OpenOCD
  2. تحتاج إلى تغيير البرامج الثابتة في ESP8266
  3. سرعة منخفضة

كيف يعمل؟ يقوم OpenOCD بتنفيذ دعم بروتوكول SWD ، بالإضافة إلى وجود برنامج تشغيل يسمى remote_bitbang. من الاسم يمكن ملاحظة أن مستويات المنطق تنتقل ببساطة عن طريق الرقمين 1 و 0 ثم يتم إرسالها عبر الشبكة.

يجب أن يقوم جهاز الاستقبال (في حالتنا ESP8266) بتعيين المستوى المقابل في المطاريف وفقًا لهذه الأرقام. لسوء الحظ ، يفتقر remote_bitbang إلى دعم موقع التخلص من النفايات الصلبة ، ولكن إضافته ليس هناك صعوبة على الإطلاق:

هنا رقعة صغيرة
--- 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 ، وعند تشغيلها ، يجب أن تكون المحطة الثانية على مستوى عالٍ ، وإلا ستدخل وحدة التحكم في وضع أداة تحميل التشغيل. لذلك ، من المستحسن سحب الساق إلى مصدر الطاقة من خلال المقاوم 10 كيلو.

أما السرعة المنخفضة. نعم ، يمشي خطوة بخطوة إلى حد ما للأسف ، ولكن يمكنك ملء البرامج الثابتة ، أو ضبط مقاطعة أو قراءة متغير.

نظريًا ، إذا قمت بفتح openOCD إلى ESP8266 ، يمكنك تحقيق سرعة مماثلة لـ st-link ، لكني أتركها للقراء.

آمل أن يكون شخص ما مفيدًا.

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


All Articles