From ce8c16a0b9697b3421196c6284dcfd7291d9adcb Mon Sep 17 00:00:00 2001 From: Andreas Berthoud Date: Tue, 22 Jun 2021 21:04:44 +0200 Subject: [PATCH] usb: Add example of command interpreter --- .gitignore | 1 + nucleo-wb55-usb/Core/Inc/main.h | 6 ++++ nucleo-wb55-usb/Core/Src/main.c | 49 +++++++++++++++++++++++-- nucleo-wb55-usb/nucleo-wb55-usb.ioc | 31 +++++++++++----- requirements.txt | 1 + serial_communication.py | 55 +++++++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 10 deletions(-) create mode 100644 requirements.txt create mode 100644 serial_communication.py diff --git a/.gitignore b/.gitignore index 73bcf0f..1ee3cdf 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ local.properties Debug/ Release/ .vscode/ +venv*/ diff --git a/nucleo-wb55-usb/Core/Inc/main.h b/nucleo-wb55-usb/Core/Inc/main.h index a579cc6..551a101 100644 --- a/nucleo-wb55-usb/Core/Inc/main.h +++ b/nucleo-wb55-usb/Core/Inc/main.h @@ -58,6 +58,12 @@ void Error_Handler(void); /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ +#define LED_GREEN_Pin GPIO_PIN_0 +#define LED_GREEN_GPIO_Port GPIOB +#define LED_RED_Pin GPIO_PIN_1 +#define LED_RED_GPIO_Port GPIOB +#define LED_BLUE_Pin GPIO_PIN_5 +#define LED_BLUE_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ diff --git a/nucleo-wb55-usb/Core/Src/main.c b/nucleo-wb55-usb/Core/Src/main.c index 52b88ac..e629901 100644 --- a/nucleo-wb55-usb/Core/Src/main.c +++ b/nucleo-wb55-usb/Core/Src/main.c @@ -56,7 +56,41 @@ static void MX_GPIO_Init(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void usb_receive(uint8_t *Buf, uint32_t *Len) { - CDC_Transmit_FS(Buf, *Len); + switch (Buf[0]) { + case 0x00: // echo + CDC_Transmit_FS(Buf, *Len); + break; + case 0x01: // blue LED + switch (Buf[1]) { + case 0x00: + HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_RESET); + break; + case 0x01: + HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_SET); + break; + } + break; + case 0x02: // green LED + switch (Buf[1]) { + case 0x00: + HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET); + break; + case 0x01: + HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET); + break; + } + break; + case 0x03: // RED LED + switch (Buf[1]) { + case 0x00: + HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET); + break; + case 0x01: + HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET); + break; + } + break; + } } /* USER CODE END 0 */ @@ -186,10 +220,21 @@ void SystemClock_Config(void) */ static void MX_GPIO_Init(void) { + GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, LED_GREEN_Pin|LED_RED_Pin|LED_BLUE_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pins : LED_GREEN_Pin LED_RED_Pin LED_BLUE_Pin */ + GPIO_InitStruct.Pin = LED_GREEN_Pin|LED_RED_Pin|LED_BLUE_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } diff --git a/nucleo-wb55-usb/nucleo-wb55-usb.ioc b/nucleo-wb55-usb/nucleo-wb55-usb.ioc index 2118249..93815af 100644 --- a/nucleo-wb55-usb/nucleo-wb55-usb.ioc +++ b/nucleo-wb55-usb/nucleo-wb55-usb.ioc @@ -10,7 +10,7 @@ RCC.SAI1Freq_Value=48000000 RCC.CortexFreq_Value=64000000 ProjectManager.KeepUserCode=true Mcu.UserName=STM32WB55RGVx -Mcu.PinsNb=8 +Mcu.PinsNb=11 ProjectManager.NoMain=false USB_DEVICE.VirtualModeFS=Cdc_FS RCC.RFWKPFreq_Value=244.140625 @@ -20,6 +20,7 @@ RCC.PLLSAI1RoutputFreq_Value=48000000 ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USB_Device_Init-USB_DEVICE-false-HAL-false PA11.Mode=Device ProjectManager.DefaultFWLocation=true +PB0.GPIO_Label=LED_GREEN ProjectManager.DeletePrevious=true RCC.HCLK2Freq_Value=32000000 boardIOC=true @@ -30,6 +31,7 @@ RCC.FamilyName=M RCC.MCO1PinFreq_Value=64000000 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK ProjectManager.StackSize=0x4000 +PB5.GPIOParameters=GPIO_Label RCC.I2C3Freq_Value=64000000 RCC.LPTIM1Freq_Value=64000000 PA13.Signal=SYS_JTMS-SWDIO @@ -52,20 +54,24 @@ RCC.HCLKRFFreq_Value=4000000 ProjectManager.PreviousToolchain= RCC.APB2TimFreq_Value=64000000 PCC.Ble.PowerLevel=Min -Mcu.Pin6=VP_SYS_VS_Systick -Mcu.Pin7=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS +PB5.Locked=true +Mcu.Pin6=PA14 +Mcu.Pin7=PB3 ProjectManager.RegisterCallBack= OSC_IN.Signal=RCC_OSC_IN +Mcu.Pin8=PB5 RCC.USBFreq_Value=48000000 +Mcu.Pin9=VP_SYS_VS_Systick RCC.LSE_VALUE=32768 RCC.AHBFreq_Value=64000000 RCC.PLLSAI1PoutputFreq_Value=48000000 Mcu.Pin0=OSC_IN -Mcu.Pin1=PA11 -Mcu.Pin2=PA12 -Mcu.Pin3=PA13 -Mcu.Pin4=PA14 -Mcu.Pin5=PB3 +PB1.Locked=true +Mcu.Pin1=PB0 +Mcu.Pin2=PB1 +Mcu.Pin3=PA11 +Mcu.Pin4=PA12 +Mcu.Pin5=PA13 RCC.SMPSCLockSelectionVirtual=RCC_SMPSCLKSOURCE_HSI ProjectManager.ProjectBuild=false RCC.HSE_VALUE=8000000 @@ -82,6 +88,7 @@ ProjectManager.LastFirmware=true RCC.SMPS1Freq_Value=16000000 ProjectManager.FirmwarePackage=STM32Cube FW_WB V1.11.1 MxDb.Version=DB.6.0.21 +PB0.GPIOParameters=GPIO_Label RCC.APB2Freq_Value=64000000 ProjectManager.BackupPrevious=false MxCube.Version=6.2.1 @@ -90,6 +97,7 @@ PCC.Ble.DataLength=6 RCC.I2C1Freq_Value=64000000 PA14.Mode=Trace_Asynchronous_SW RCC.RNGFreq_Value=32000 +PB1.GPIO_Label=LED_RED RCC.PLLSAI1QoutputFreq_Value=48000000 RCC.ADCFreq_Value=48000000 File.Version=6 @@ -104,6 +112,7 @@ ProjectManager.AskForMigrate=true Mcu.Name=STM32WB55RGVx RCC.LPTIM2Freq_Value=64000000 ProjectManager.HalAssertFull=false +PB0.Locked=true ProjectManager.ProjectName=nucleo-wb55-usb ProjectManager.UnderRoot=true RCC.APB3Freq_Value=4000000 @@ -111,6 +120,8 @@ ProjectManager.CoupleFile=false PB3.Signal=SYS_JTDO-SWO RCC.SYSCLKFreq_VALUE=64000000 Mcu.Package=VFQFPN68 +PB5.Signal=GPIO_Output +PB1.Signal=GPIO_Output PA12.Mode=Device PCC.Ble.ConnectionInterval=1000.0 NVIC.ForceEnableDMAVector=true @@ -131,18 +142,22 @@ NVIC.USB_LP_IRQn=true\:0\:0\:false\:false\:true\:false\:true ProjectManager.ComputerToolchain=false RCC.HSI_VALUE=16000000 NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +PB5.GPIO_Label=LED_BLUE RCC.PLLN=32 RCC.PLLPoutputFreq_Value=64000000 +Mcu.Pin10=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS RCC.APB1TimFreq_Value=64000000 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false RCC.PWRFreq_Value=64000000 RCC.LPUART1Freq_Value=64000000 RCC.APB1Freq_Value=64000000 RCC.SMPSDivider=1 +PB0.Signal=GPIO_Output USB_DEVICE.VirtualMode=Cdc ProjectManager.CustomerFirmwarePackage= ProjectManager.DeviceId=STM32WB55RGVx ProjectManager.LibraryCopy=1 RCC.HSI48_VALUE=48000000 RCC.PLLSAI1N=24 +PB1.GPIOParameters=GPIO_Label isbadioc=false diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..731aac6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pyserial>=3.5,<4 diff --git a/serial_communication.py b/serial_communication.py new file mode 100644 index 0000000..a5f0146 --- /dev/null +++ b/serial_communication.py @@ -0,0 +1,55 @@ +import logging +import time +from typing import Sequence + +import serial + +DEVICE_ID = "/dev/tty.usbmodem207E3283544E1" +BAUDRATE = 115200 + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + +def write_bytes( + serial: serial.Serial, + values: Sequence[int], +): + data = bytearray(values) + serial.write(data) + + +def main(): + with serial.Serial(DEVICE_ID, BAUDRATE) as serial_connection: + logger.info(f"Connection open with: {serial_connection.name}") + serial_connection.write(int.to_bytes(0, 1, "little") + b'Hello') + time.sleep(0.1) + logger.info(f"in_waiting: {serial_connection.in_waiting}") + x = serial_connection.read(serial_connection.in_waiting) + logger.info(f"received: {x}") + logger.info(f"in_waiting: {serial_connection.in_waiting}") + + delay = 0.1 + while True: + logger.info("Set blue LED") + write_bytes(serial_connection, [1, 1]) + time.sleep(delay) + logger.info("Set green LED") + write_bytes(serial_connection, [2, 1]) + time.sleep(delay) + logger.info("Set red LED") + write_bytes(serial_connection, [3, 1]) + time.sleep(delay) + + logger.info("Reset blue LED") + write_bytes(serial_connection, [1, 0]) + time.sleep(delay) + logger.info("Reset green LED") + write_bytes(serial_connection, [2, 0]) + time.sleep(delay) + logger.info("Reset red LED") + write_bytes(serial_connection, [3, 0]) + time.sleep(delay) + + +if __name__ == "__main__": + main()