Browse Source

usb: Dongle is working

master
Andreas Berthoud 5 years ago
parent
commit
05a3a5f53a
  1. 16
      nucleo-wb55-dongle-usb/.mxproject
  2. 4
      nucleo-wb55-dongle-usb/Core/Inc/main.h
  3. 77
      nucleo-wb55-dongle-usb/Core/Src/main.c
  4. 4
      nucleo-wb55-dongle-usb/STM32WB55CGUX_FLASH.ld
  5. 4
      nucleo-wb55-dongle-usb/STM32WB55CGUX_RAM.ld
  6. 11
      nucleo-wb55-dongle-usb/USB_Device/App/usbd_cdc_if.c
  7. 2
      nucleo-wb55-dongle-usb/USB_Device/App/usbd_cdc_if.h
  8. 91
      nucleo-wb55-dongle-usb/nucleo-wb55-dongle-usb.ioc

16
nucleo-wb55-dongle-usb/.mxproject

File diff suppressed because one or more lines are too long

4
nucleo-wb55-dongle-usb/Core/Inc/main.h

@ -58,12 +58,12 @@ void Error_Handler(void);
/* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/
#define LED_BLUE_Pin GPIO_PIN_4
#define LED_BLUE_GPIO_Port GPIOA
#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 */

77
nucleo-wb55-dongle-usb/Core/Src/main.c

@ -23,7 +23,7 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usbd_cdc_if.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@ -55,7 +55,43 @@ static void MX_GPIO_Init(void);
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void usb_receive(uint8_t *Buf, uint32_t *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 */
/**
@ -112,12 +148,6 @@ void SystemClock_Config(void)
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
/** Macro to configure the PLL multiplication factor
*/
__HAL_RCC_PLL_PLLM_CONFIG(RCC_PLLM_DIV1);
/** Macro to configure the PLL clock source
*/
__HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_MSI);
/** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
@ -133,7 +163,13 @@ void SystemClock_Config(void)
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
RCC_OscInitStruct.PLL.PLLN = 24;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
@ -143,14 +179,14 @@ void SystemClock_Config(void)
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV2;
RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
@ -187,14 +223,24 @@ static void MX_GPIO_Init(void)
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, LED_GREEN_Pin|LED_RED_Pin|LED_BLUE_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, LED_GREEN_Pin|LED_RED_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : LED_BLUE_Pin */
GPIO_InitStruct.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(LED_BLUE_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : LED_GREEN_Pin LED_RED_Pin LED_BLUE_Pin */
GPIO_InitStruct.Pin = LED_GREEN_Pin|LED_RED_Pin|LED_BLUE_Pin;
/*Configure GPIO pins : LED_GREEN_Pin LED_RED_Pin */
GPIO_InitStruct.Pin = LED_GREEN_Pin|LED_RED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
@ -215,6 +261,7 @@ void Error_Handler(void)
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
while (1)
{
}

4
nucleo-wb55-dongle-usb/STM32WB55CGUX_FLASH.ld

@ -39,8 +39,8 @@ ENTRY(Reset_Handler)
/* Highest address of the user mode stack */
_estack = 0x20030000; /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200 ; /* required amount of heap */
_Min_Stack_Size = 0x400 ; /* required amount of stack */
_Min_Heap_Size = 0x2000 ; /* required amount of heap */
_Min_Stack_Size = 0x4000 ; /* required amount of stack */
/* Specify the memory areas */
MEMORY

4
nucleo-wb55-dongle-usb/STM32WB55CGUX_RAM.ld

@ -39,8 +39,8 @@ ENTRY(Reset_Handler)
/* Highest address of the user mode stack */
_estack = 0x20030000; /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200 ; /* required amount of heap */
_Min_Stack_Size = 0x400 ; /* required amount of stack */
_Min_Heap_Size = 0x2000 ; /* required amount of heap */
_Min_Stack_Size = 0x4000 ; /* required amount of stack */
/* Specify the memory areas */
MEMORY

11
nucleo-wb55-dongle-usb/USB_Device/App/usbd_cdc_if.c

@ -32,7 +32,7 @@
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t buffer[7];
/* USER CODE END PV */
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
@ -129,7 +129,7 @@ static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);
static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum);
/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
__weak void usb_receive(uint8_t *Buf, uint32_t *Len) {}
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
/**
@ -221,10 +221,16 @@ static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
/* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */
/*******************************************************************************/
case CDC_SET_LINE_CODING:
for (int i = 0; i< 7; i++) {
buffer[i] = pbuf[i];
}
break;
case CDC_GET_LINE_CODING:
for (int i = 0; i< 7; i++) {
pbuf[i] = buffer[i];
}
break;
@ -264,6 +270,7 @@ static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
usb_receive(Buf, Len);
return (USBD_OK);
/* USER CODE END 6 */
}

2
nucleo-wb55-dongle-usb/USB_Device/App/usbd_cdc_if.h

@ -110,7 +110,7 @@ extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS;
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
/* USER CODE BEGIN EXPORTED_FUNCTIONS */
void usb_receive(uint8_t *Buf, uint32_t *Len);
/* USER CODE END EXPORTED_FUNCTIONS */
/**

91
nucleo-wb55-dongle-usb/nucleo-wb55-dongle-usb.ioc

@ -3,38 +3,37 @@ Mcu.Family=STM32WB
ProjectManager.MainLocation=Core/Src
PCC.Ble.Mode=NOT_SELECTED
USB_DEVICE.CLASS_NAME_FS=CDC
RCC.PLLQoutputFreq_Value=64000000
RCC.USART1Freq_Value=16000000
RCC.PLLQoutputFreq_Value=48000000
RCC.USART1Freq_Value=48000000
ProjectManager.ProjectFileName=nucleo-wb55-dongle-usb.ioc
RCC.SAI1Freq_Value=48000000
RCC.CortexFreq_Value=16000000
RCC.CortexFreq_Value=48000000
ProjectManager.KeepUserCode=true
Mcu.UserName=STM32WB55CGUx
Mcu.PinsNb=8
Mcu.PinsNb=9
ProjectManager.NoMain=false
USB_DEVICE.VirtualModeFS=Cdc_FS
RCC.RFWKPFreq_Value=244.140625
RCC.HCLK3Freq_Value=16000000
RCC.HCLK3Freq_Value=48000000
RCC.PLLSAI1RoutputFreq_Value=48000000
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false
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=8000000
RCC.HCLK2Freq_Value=24000000
boardIOC=true
USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS
RCC.AHB2CLKDivider=RCC_SYSCLK_DIV2
PinOutPanel.RotationAngle=0
RCC.FamilyName=M
RCC.MCO1PinFreq_Value=16000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_HSI
ProjectManager.StackSize=0x400
PB5.GPIOParameters=GPIO_Label
RCC.I2C3Freq_Value=16000000
RCC.LPTIM1Freq_Value=16000000
RCC.MCO1PinFreq_Value=48000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
ProjectManager.StackSize=0x4000
RCC.I2C3Freq_Value=48000000
RCC.LPTIM1Freq_Value=48000000
Mcu.IP4=USB_DEVICE
RCC.FCLKCortexFreq_Value=16000000
RCC.FCLKCortexFreq_Value=48000000
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false
Mcu.IP2=SYS
Mcu.IP3=USB
@ -45,50 +44,53 @@ Mcu.UserConstants=
RCC.VCOSAI1OutputFreq_Value=96000000
ProjectManager.TargetToolchain=STM32CubeIDE
Mcu.ThirdPartyNb=0
RCC.HCLKFreq_Value=16000000
RCC.HCLKFreq_Value=48000000
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS
Mcu.IPNb=5
RCC.HCLKRFFreq_Value=4000000
ProjectManager.PreviousToolchain=
RCC.APB2TimFreq_Value=16000000
RCC.APB2TimFreq_Value=48000000
PCC.Ble.PowerLevel=Min
PB5.Locked=true
Mcu.Pin6=VP_SYS_VS_Systick
Mcu.Pin7=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.Pin6=PA12
Mcu.Pin7=VP_SYS_VS_Systick
ProjectManager.RegisterCallBack=
OSC_IN.Signal=RCC_OSC_IN
Mcu.Pin8=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
RCC.USBFreq_Value=48000000
OSC_OUT.Mode=HSE-External-Oscillator
RCC.LSE_VALUE=32768
RCC.AHBFreq_Value=16000000
OSC_OUT.Signal=RCC_OSC_OUT
RCC.AHBFreq_Value=48000000
RCC.PLLSAI1PoutputFreq_Value=48000000
Mcu.Pin0=OSC_IN
Mcu.Pin0=PA4
PB1.Locked=true
Mcu.Pin1=PB0
Mcu.Pin2=PB1
Mcu.Pin3=PA11
Mcu.Pin4=PA12
Mcu.Pin5=PB5
Mcu.Pin1=OSC_OUT
Mcu.Pin2=OSC_IN
Mcu.Pin3=PB0
Mcu.Pin4=PB1
Mcu.Pin5=PA11
ProjectManager.ProjectBuild=false
RCC.HSE_VALUE=8000000
RCC.FCLK2Freq_Value=8000000
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false
RCC.FCLK2Freq_Value=24000000
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false
board=P-NUCLEO-WB55-USBDongle
RCC.Cortex2Freq_Value=1000000
RCC.VCOOutputFreq_Value=128000000
PA4.Locked=true
RCC.Cortex2Freq_Value=3000000
RCC.Cortex2_Div=SYSTICK_CLKSOURCE_HCLK_DIV8
RCC.VCOOutputFreq_Value=96000000
NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true
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=16000000
RCC.APB2Freq_Value=48000000
ProjectManager.BackupPrevious=false
MxCube.Version=6.2.1
RCC.VCOInputFreq_Value=4000000
PCC.Ble.DataLength=6
RCC.I2C1Freq_Value=16000000
RCC.I2C1Freq_Value=48000000
RCC.RNGFreq_Value=32000
PB1.GPIO_Label=LED_RED
RCC.PLLSAI1QoutputFreq_Value=48000000
@ -96,28 +98,29 @@ RCC.ADCFreq_Value=48000000
File.Version=6
VP_SYS_VS_Systick.Mode=SysTick
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false
RCC.PLLRCLKFreq_Value=64000000
RCC.PLLRCLKFreq_Value=48000000
PA4.GPIOParameters=GPIO_Label
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false
ProjectManager.FreePins=false
RCC.IPParameters=ADCFreq_Value,AHB2CLKDivider,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,APB3Freq_Value,Cortex2Freq_Value,Cortex2_Div,CortexFreq_Value,FCLK2Freq_Value,FCLKCortexFreq_Value,FamilyName,HCLK2Freq_Value,HCLK3Freq_Value,HCLKFreq_Value,HCLKRFFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PWRFreq_Value,RFWKPFreq_Value,RNGFreq_Value,SAI1Freq_Value,SMPS1Freq_Value,SMPSDivider,SYSCLKFreq_VALUE,SYSCLKSource,USART1Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value
ProjectManager.AskForMigrate=true
Mcu.Name=STM32WB55CGUx
RCC.LPTIM2Freq_Value=16000000
RCC.LPTIM2Freq_Value=48000000
ProjectManager.HalAssertFull=false
PB0.Locked=true
ProjectManager.ProjectName=nucleo-wb55-dongle-usb
ProjectManager.UnderRoot=true
RCC.APB3Freq_Value=4000000
ProjectManager.CoupleFile=false
RCC.SYSCLKFreq_VALUE=16000000
PB5.Signal=GPIO_Output
PA4.Signal=GPIO_Output
RCC.SYSCLKFreq_VALUE=48000000
Mcu.Package=UFQFPN48
PB1.Signal=GPIO_Output
PA12.Mode=Device
PCC.Ble.ConnectionInterval=1000.0
NVIC.ForceEnableDMAVector=true
KeepUserPlacement=false
OSC_IN.Mode=HSE-External-Clock-Source
OSC_IN.Mode=HSE-External-Oscillator
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false
ProjectManager.CompilerOptimize=6
ProjectManager.ToolChainLocation=
@ -125,24 +128,24 @@ RCC.LSI_VALUE=32000
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
PA11.Signal=USB_DM
RCC.LSCOPinFreq_Value=32000
ProjectManager.HeapSize=0x200
ProjectManager.HeapSize=0x2000
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS
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.PLLPoutputFreq_Value=64000000
RCC.PLLN=32
RCC.APB1TimFreq_Value=16000000
RCC.PLLN=24
RCC.PLLPoutputFreq_Value=48000000
RCC.APB1TimFreq_Value=48000000
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false
RCC.PWRFreq_Value=16000000
RCC.LPUART1Freq_Value=16000000
RCC.APB1Freq_Value=16000000
RCC.PWRFreq_Value=48000000
RCC.LPUART1Freq_Value=48000000
RCC.APB1Freq_Value=48000000
RCC.SMPSDivider=1
PB0.Signal=GPIO_Output
USB_DEVICE.VirtualMode=Cdc
PA4.GPIO_Label=LED_BLUE
ProjectManager.CustomerFirmwarePackage=
ProjectManager.DeviceId=STM32WB55CGUx
ProjectManager.LibraryCopy=1

Loading…
Cancel
Save