Browse Source

usb: Add example of command interpreter

master
Andreas Berthoud 5 years ago
parent
commit
ce8c16a0b9
  1. 1
      .gitignore
  2. 6
      nucleo-wb55-usb/Core/Inc/main.h
  3. 49
      nucleo-wb55-usb/Core/Src/main.c
  4. 31
      nucleo-wb55-usb/nucleo-wb55-usb.ioc
  5. 1
      requirements.txt
  6. 55
      serial_communication.py

1
.gitignore

@ -63,3 +63,4 @@ local.properties
Debug/
Release/
.vscode/
venv*/

6
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 */

49
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);
}

31
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

1
requirements.txt

@ -0,0 +1 @@
pyserial>=3.5,<4

55
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()
Loading…
Cancel
Save