Передача данных между МК и ПК

Если подключить к микроконтроллеру драйвер L293D, то возможно управлять мотором, путем создания разных или одинаковых сигналов на двух выводах Input 1/2. В этом примере управляющие каналы драйвера подключены к выводам PC14 и PC15.

С помощью модуля MicroSTM32F1TPorts возможно принимать пакеты с идентификаторами от ПК через USB-UART преобразователь. Тот же, который используется для прошивки. Для ПК он определяется как COM-порт (в настоящем примере это COM10).

Код для микроконтроллера:

MODULE Main;

	IMPORT SYSTEM, 
		MCU := MicroSTM32F10xxD,
		ARMv7M := MicroARMv7M,
		Pins := MicroSTM32F10xPinCfg,
		TPs := MicroSTM32F1TPorts,
		Sys := MicroSTM32F103x8System;

	CONST
		motorStartForward = 021X;
		motorStartBackward = 022X;
		motorStop = 023X;
		
	VAR
		p0: TPs.Port;
		
	PROCEDURE Receive (id: CHAR; a: ARRAY OF CHAR; len: INTEGER);
	BEGIN
		IF id = motorStartForward THEN
			SYSTEM.PUT(MCU.GPIOCBSRR, {15, 14+16})
		ELSIF id = motorStartBackward THEN
			SYSTEM.PUT(MCU.GPIOCBSRR, {15 + 16, 14})
		ELSIF id = motorStop THEN
			SYSTEM.PUT(MCU.GPIOCBSRR, {15 + 16, 14 + 16})
		END
	END Receive;

	PROCEDURE InitPort;
		VAR par: TPs.InitPar2;
	BEGIN
		par.n := TPs.USART1;
		par.RXPinPort := Pins.A; par.RXPinN := 10;
		par.TXPinPort := Pins.A; par.TXPinN := 9;
		par.UCLK := Sys.PCLK2;
		par.baud := 19200;
		par.parity := TPs.parityNone;
		par.receive := Receive;  (* устанавливаем процедуру для вызова при приёме данных *)
		TPs.Init(p0, par)
	END InitPort;

	PROCEDURE Init;
	VAR ok: BOOLEAN;
	BEGIN
		InitPort;
		Pins.Configure(Pins.C, 14, Pins.outputPushPull2MHz);
		Pins.Configure(Pins.C, 15, Pins.outputPushPull2MHz);
	END Init;

	PROCEDURE MainLoop;
	BEGIN
		REPEAT
			TPs.Receive(p0); (* принимаем данные по UART *)
			ARMv7M.WFI
		UNTIL FALSE
	END MainLoop;

BEGIN
	Init;
	MainLoop
	
END Main.

Программа для ПК на языке Компонентный Паскаль:

MODULE KrisControl1;

	IMPORT MicroTPorts;

	TYPE MessagesHandler = POINTER TO RECORD (MicroTPorts.MessagesHandler) END;

	CONST
		motorStartForward = 021X;
		motorStartBackward = 022X;
		motorStop = 023X;

	VAR
		p: MicroTPorts.Port;
		mh: MessagesHandler;

	PROCEDURE (h: MessagesHandler) MessageReceived (id: SHORTCHAR; IN a: ARRAY OF SHORTCHAR; len: INTEGER);
	BEGIN
	END MessageReceived;

	PROCEDURE Open*(port: ARRAY OF CHAR);
	BEGIN
		IF p = NIL THEN
			p := MicroTPorts.NewPort(port, 19200, {}, mh);
			IF p # NIL THEN
				Log.String("успешно соединенился"); Log.Ln;
			END
		END
	END Open;

	PROCEDURE Close*;
	BEGIN
		MicroTPorts.Close(p);
		Log.String("успешно закрыл соединение"); Log.Ln;
	END Close;
	
	PROCEDURE Forward*;
	VAR a: ARRAY 1 OF SHORTCHAR;
	BEGIN
		MicroTPorts.SendMessage(p, motorStartForward, a, 1)
	END Forward;

	PROCEDURE Backward*;
	VAR a: ARRAY 1 OF SHORTCHAR;
	BEGIN
		MicroTPorts.SendMessage(p, motorStartBackward, a, 1)
	END Backward;
	
	PROCEDURE Stop*;
	VAR a: ARRAY 1 OF SHORTCHAR;
	BEGIN
		MicroTPorts.SendMessage(p, motorStop, a, 1)
	END Stop;

BEGIN
	NEW(mh)
CLOSE
	Close
END KrisControl1.

Комнады для управления:

"KrisControl1.Open('\\.\COM10')"

KrisControl1.Forward

KrisControl1.Backward

KrisControl1.Stop

KrisControl1.Close

Эти команды возможно привязать к кнопкам, чтобы сделать графический интерфейс управления моторами: