Firmware, Bootloader: add f3 target. (#215)
* Firmware, Bootloader: add f3 target. Refactor code to be portable across targets. * Firmware: remove bkpt * Makefile: debug agent. Debug: f3 platform throw openocd. * freertos-openocd helper * separate hal resources * return of input_dump app * using hew target resources abstration layer for backlight and blink * dirty hack for input driver, f3 has no charging pin * worked input interrupts * working display * F3: switch to 32mHz resonator * F3: configure SD_CS pin * NFC: port to F3. * fat uart app * sd card hal api * separate CC1101 spi config * faster spi gpio for sd card * Assets: disable LFS * Cube: disable css on LSE * Input: format code * Make: add bootloader source code to formatting rule * F3: enable rf by default, adjust clock settings, map all pins where they should be. * libs for coreglitch_demo_0 * nvic priority * bus clocks all to 64 * lf-rfid timer and pin * irda * ir rx setup * tim2 irq handler * Makefile: environment aware mkdir * Makefile, Irukagotchi: commit seq number. * split falling and rising ir rx events * Makefile: proper git branch detect on old git. Firmware: api fix. * fix irda * Makefile,Irukagotchi: date timestamp. * NFC: adjust SPI speed * Irukagotchi: format code * Make: add blackmagic debug in host mode * Makefile: detach blackmagic from terminal signals * Makefile,Irukagotchi: stamp target * add F3 bootloader/firmware to CI Co-authored-by: Aleksandr Kutuzov <aku@plooks.com> Co-authored-by: DrZlo13 <who.just.the.doctor@gmail.com> Co-authored-by: aanper <mail@s3f.ru>
This commit is contained in:
		
							
								
								
									
										106
									
								
								firmware/targets/f3/Src/adc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								firmware/targets/f3/Src/adc.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : ADC.c
 | 
			
		||||
  * Description        : This file provides code for the configuration
 | 
			
		||||
  *                      of the ADC instances.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "adc.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
ADC_HandleTypeDef hadc1;
 | 
			
		||||
 | 
			
		||||
/* ADC1 init function */
 | 
			
		||||
void MX_ADC1_Init(void)
 | 
			
		||||
{
 | 
			
		||||
  ADC_ChannelConfTypeDef sConfig = {0};
 | 
			
		||||
 | 
			
		||||
  /** Common config
 | 
			
		||||
  */
 | 
			
		||||
  hadc1.Instance = ADC1;
 | 
			
		||||
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
 | 
			
		||||
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
 | 
			
		||||
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
 | 
			
		||||
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
 | 
			
		||||
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
 | 
			
		||||
  hadc1.Init.LowPowerAutoWait = DISABLE;
 | 
			
		||||
  hadc1.Init.ContinuousConvMode = DISABLE;
 | 
			
		||||
  hadc1.Init.NbrOfConversion = 1;
 | 
			
		||||
  hadc1.Init.DiscontinuousConvMode = DISABLE;
 | 
			
		||||
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
 | 
			
		||||
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
 | 
			
		||||
  hadc1.Init.DMAContinuousRequests = DISABLE;
 | 
			
		||||
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
 | 
			
		||||
  hadc1.Init.OversamplingMode = DISABLE;
 | 
			
		||||
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /** Configure Regular Channel
 | 
			
		||||
  */
 | 
			
		||||
  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
 | 
			
		||||
  sConfig.Rank = ADC_REGULAR_RANK_1;
 | 
			
		||||
  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
 | 
			
		||||
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
 | 
			
		||||
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
 | 
			
		||||
  sConfig.Offset = 0;
 | 
			
		||||
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  if(adcHandle->Instance==ADC1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN ADC1_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END ADC1_MspInit 0 */
 | 
			
		||||
    /* ADC1 clock enable */
 | 
			
		||||
    __HAL_RCC_ADC_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN ADC1_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END ADC1_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  if(adcHandle->Instance==ADC1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN ADC1_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END ADC1_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_ADC_CLK_DISABLE();
 | 
			
		||||
  /* USER CODE BEGIN ADC1_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END ADC1_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										181
									
								
								firmware/targets/f3/Src/app_freertos.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								firmware/targets/f3/Src/app_freertos.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,181 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : app_freertos.c
 | 
			
		||||
  * Description        : Code for freertos applications
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "main.h"
 | 
			
		||||
#include "cmsis_os.h"
 | 
			
		||||
 | 
			
		||||
/* Private includes ----------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN Includes */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Includes */
 | 
			
		||||
 | 
			
		||||
/* Private typedef -----------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PTD */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PTD */
 | 
			
		||||
 | 
			
		||||
/* Private define ------------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PD */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PD */
 | 
			
		||||
 | 
			
		||||
/* Private macro -------------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PM */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PM */
 | 
			
		||||
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN Variables */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Variables */
 | 
			
		||||
/* Definitions for defaultTask */
 | 
			
		||||
osThreadId_t defaultTaskHandle;
 | 
			
		||||
const osThreadAttr_t defaultTask_attributes = {
 | 
			
		||||
  .name = "defaultTask",
 | 
			
		||||
  .priority = (osPriority_t) osPriorityNormal,
 | 
			
		||||
  .stack_size = 1024 * 4
 | 
			
		||||
};
 | 
			
		||||
/* Definitions for app_main */
 | 
			
		||||
osThreadId_t app_mainHandle;
 | 
			
		||||
const osThreadAttr_t app_main_attributes = {
 | 
			
		||||
  .name = "app_main",
 | 
			
		||||
  .priority = (osPriority_t) osPriorityLow,
 | 
			
		||||
  .stack_size = 1024 * 4
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Private function prototypes -----------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN FunctionPrototypes */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END FunctionPrototypes */
 | 
			
		||||
 | 
			
		||||
void StartDefaultTask(void *argument);
 | 
			
		||||
extern void app(void *argument);
 | 
			
		||||
 | 
			
		||||
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
 | 
			
		||||
 | 
			
		||||
/* Hook prototypes */
 | 
			
		||||
void configureTimerForRunTimeStats(void);
 | 
			
		||||
unsigned long getRunTimeCounterValue(void);
 | 
			
		||||
void vApplicationIdleHook(void);
 | 
			
		||||
void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName);
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
/* Functions needed when configGENERATE_RUN_TIME_STATS is on */
 | 
			
		||||
__weak void configureTimerForRunTimeStats(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__weak unsigned long getRunTimeCounterValue(void)
 | 
			
		||||
{
 | 
			
		||||
return 0;
 | 
			
		||||
}
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 2 */
 | 
			
		||||
__weak void vApplicationIdleHook( void )
 | 
			
		||||
{
 | 
			
		||||
   /* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set
 | 
			
		||||
   to 1 in FreeRTOSConfig.h. It will be called on each iteration of the idle
 | 
			
		||||
   task. It is essential that code added to this hook function never attempts
 | 
			
		||||
   to block in any way (for example, call xQueueReceive() with a block time
 | 
			
		||||
   specified, or call vTaskDelay()). If the application makes use of the
 | 
			
		||||
   vTaskDelete() API function (as this demo application does) then it is also
 | 
			
		||||
   important that vApplicationIdleHook() is permitted to return to its calling
 | 
			
		||||
   function, because it is the responsibility of the idle task to clean up
 | 
			
		||||
   memory allocated by the kernel to any task that has since been deleted. */
 | 
			
		||||
}
 | 
			
		||||
/* USER CODE END 2 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 4 */
 | 
			
		||||
__weak void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)
 | 
			
		||||
{
 | 
			
		||||
   /* Run time stack overflow checking is performed if
 | 
			
		||||
   configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook function is
 | 
			
		||||
   called if a stack overflow is detected. */
 | 
			
		||||
}
 | 
			
		||||
/* USER CODE END 4 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  FreeRTOS initialization
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void MX_FREERTOS_Init(void) {
 | 
			
		||||
  /* USER CODE BEGIN Init */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END Init */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN RTOS_MUTEX */
 | 
			
		||||
  /* add mutexes, ... */
 | 
			
		||||
  /* USER CODE END RTOS_MUTEX */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN RTOS_SEMAPHORES */
 | 
			
		||||
  /* add semaphores, ... */
 | 
			
		||||
  /* USER CODE END RTOS_SEMAPHORES */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN RTOS_TIMERS */
 | 
			
		||||
  /* start timers, add new ones, ... */
 | 
			
		||||
  /* USER CODE END RTOS_TIMERS */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN RTOS_QUEUES */
 | 
			
		||||
  /* add queues, ... */
 | 
			
		||||
  /* USER CODE END RTOS_QUEUES */
 | 
			
		||||
 | 
			
		||||
  /* Create the thread(s) */
 | 
			
		||||
  /* creation of defaultTask */
 | 
			
		||||
  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
 | 
			
		||||
 | 
			
		||||
  /* creation of app_main */
 | 
			
		||||
  app_mainHandle = osThreadNew(app, NULL, &app_main_attributes);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN RTOS_THREADS */
 | 
			
		||||
  /* add threads, ... */
 | 
			
		||||
  /* USER CODE END RTOS_THREADS */
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN Header_StartDefaultTask */
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Function implementing the defaultTask thread.
 | 
			
		||||
  * @param  argument: Not used
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header_StartDefaultTask */
 | 
			
		||||
void StartDefaultTask(void *argument)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN StartDefaultTask */
 | 
			
		||||
  /* Infinite loop */
 | 
			
		||||
  for(;;)
 | 
			
		||||
  {
 | 
			
		||||
    osDelay(1);
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE END StartDefaultTask */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Private application code --------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN Application */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Application */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										98
									
								
								firmware/targets/f3/Src/comp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								firmware/targets/f3/Src/comp.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,98 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : COMP.c
 | 
			
		||||
  * Description        : This file provides code for the configuration
 | 
			
		||||
  *                      of the COMP instances.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "comp.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
COMP_HandleTypeDef hcomp1;
 | 
			
		||||
 | 
			
		||||
/* COMP1 init function */
 | 
			
		||||
void MX_COMP1_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  hcomp1.Instance = COMP1;
 | 
			
		||||
  hcomp1.Init.InputMinus = COMP_INPUT_MINUS_1_2VREFINT;
 | 
			
		||||
  hcomp1.Init.InputPlus = COMP_INPUT_PLUS_IO1;
 | 
			
		||||
  hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
 | 
			
		||||
  hcomp1.Init.Hysteresis = COMP_HYSTERESIS_NONE;
 | 
			
		||||
  hcomp1.Init.BlankingSrce = COMP_BLANKINGSRC_NONE;
 | 
			
		||||
  hcomp1.Init.Mode = COMP_POWERMODE_HIGHSPEED;
 | 
			
		||||
  hcomp1.Init.WindowMode = COMP_WINDOWMODE_DISABLE;
 | 
			
		||||
  hcomp1.Init.TriggerMode = COMP_TRIGGERMODE_NONE;
 | 
			
		||||
  if (HAL_COMP_Init(&hcomp1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_COMP_MspInit(COMP_HandleTypeDef* compHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
  if(compHandle->Instance==COMP1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN COMP1_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END COMP1_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOC_CLK_ENABLE();
 | 
			
		||||
    /**COMP1 GPIO Configuration
 | 
			
		||||
    PC5     ------> COMP1_INP
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = RFID_RF_IN_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    HAL_GPIO_Init(RFID_RF_IN_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN COMP1_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END COMP1_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_COMP_MspDeInit(COMP_HandleTypeDef* compHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  if(compHandle->Instance==COMP1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN COMP1_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END COMP1_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
    /**COMP1 GPIO Configuration
 | 
			
		||||
    PC5     ------> COMP1_INP
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(RFID_RF_IN_GPIO_Port, RFID_RF_IN_Pin);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN COMP1_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END COMP1_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										56
									
								
								firmware/targets/f3/Src/fatfs/fatfs.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								firmware/targets/f3/Src/fatfs/fatfs.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file   fatfs.c
 | 
			
		||||
  * @brief  Code for fatfs applications
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
#include "fatfs.h"
 | 
			
		||||
 | 
			
		||||
uint8_t retUSER;    /* Return value for USER */
 | 
			
		||||
char USERPath[4];   /* USER logical drive path */
 | 
			
		||||
FATFS USERFatFS;    /* File system object for USER logical drive */
 | 
			
		||||
FIL USERFile;       /* File object for USER */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN Variables */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Variables */    
 | 
			
		||||
 | 
			
		||||
void MX_FATFS_Init(void) 
 | 
			
		||||
{
 | 
			
		||||
  /*## FatFS: Link the USER driver ###########################*/
 | 
			
		||||
  retUSER = FATFS_LinkDriver(&USER_Driver, USERPath);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN Init */
 | 
			
		||||
  /* additional user code for init */     
 | 
			
		||||
  /* USER CODE END Init */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Gets Time from RTC 
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval Time in DWORD
 | 
			
		||||
  */
 | 
			
		||||
DWORD get_fattime(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN get_fattime */
 | 
			
		||||
  return 0;
 | 
			
		||||
  /* USER CODE END get_fattime */  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN Application */
 | 
			
		||||
     
 | 
			
		||||
/* USER CODE END Application */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										49
									
								
								firmware/targets/f3/Src/fatfs/fatfs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								firmware/targets/f3/Src/fatfs/fatfs.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file   fatfs.h
 | 
			
		||||
  * @brief  Header for fatfs applications
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Define to prevent recursive inclusion -------------------------------------*/
 | 
			
		||||
#ifndef __fatfs_H
 | 
			
		||||
#define __fatfs_H
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "fatfs/ff.h"
 | 
			
		||||
#include "fatfs/ff_gen_drv.h"
 | 
			
		||||
#include "user_diskio.h" /* defines USER_Driver as external */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN Includes */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Includes */
 | 
			
		||||
 | 
			
		||||
extern uint8_t retUSER; /* Return value for USER */
 | 
			
		||||
extern char USERPath[4]; /* USER logical drive path */
 | 
			
		||||
extern FATFS USERFatFS; /* File system object for USER logical drive */
 | 
			
		||||
extern FIL USERFile; /* File object for USER */
 | 
			
		||||
 | 
			
		||||
void MX_FATFS_Init(void);
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN Prototypes */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Prototypes */
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
#endif /*__fatfs_H */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										270
									
								
								firmware/targets/f3/Src/fatfs/ffconf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								firmware/targets/f3/Src/fatfs/ffconf.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,270 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  *  FatFs - Generic FAT file system module  R0.12c (C)ChaN, 2017
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
#ifndef _FFCONF
 | 
			
		||||
#define _FFCONF 68300	/* Revision ID */
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------------------------/
 | 
			
		||||
/ Additional user header to be used  
 | 
			
		||||
/-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "main.h"
 | 
			
		||||
#include "stm32wbxx_hal.h"
 | 
			
		||||
#include "cmsis_os.h" /* _FS_REENTRANT set to 1 and CMSIS API chosen */
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------------------------/
 | 
			
		||||
/ Function Configurations
 | 
			
		||||
/-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define _FS_READONLY         0      /* 0:Read/Write or 1:Read only */
 | 
			
		||||
/* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
 | 
			
		||||
/  Read-only configuration removes writing API functions, f_write(), f_sync(),
 | 
			
		||||
/  f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()
 | 
			
		||||
/  and optional writing functions as well. */
 | 
			
		||||
 | 
			
		||||
#define _FS_MINIMIZE         0      /* 0 to 3 */
 | 
			
		||||
/* This option defines minimization level to remove some basic API functions.
 | 
			
		||||
/
 | 
			
		||||
/   0: All basic functions are enabled.
 | 
			
		||||
/   1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename()
 | 
			
		||||
/      are removed.
 | 
			
		||||
/   2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.
 | 
			
		||||
/   3: f_lseek() function is removed in addition to 2. */
 | 
			
		||||
 | 
			
		||||
#define _USE_STRFUNC         2      /* 0:Disable or 1-2:Enable */
 | 
			
		||||
/* This option switches string functions, f_gets(), f_putc(), f_puts() and
 | 
			
		||||
/  f_printf().
 | 
			
		||||
/
 | 
			
		||||
/  0: Disable string functions.
 | 
			
		||||
/  1: Enable without LF-CRLF conversion.
 | 
			
		||||
/  2: Enable with LF-CRLF conversion. */
 | 
			
		||||
 | 
			
		||||
#define _USE_FIND            0
 | 
			
		||||
/* This option switches filtered directory read functions, f_findfirst() and
 | 
			
		||||
/  f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */
 | 
			
		||||
 | 
			
		||||
#define _USE_MKFS            1
 | 
			
		||||
/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */
 | 
			
		||||
 | 
			
		||||
#define _USE_FASTSEEK        1
 | 
			
		||||
/* This option switches fast seek feature. (0:Disable or 1:Enable) */
 | 
			
		||||
 | 
			
		||||
#define	_USE_EXPAND		0
 | 
			
		||||
/* This option switches f_expand function. (0:Disable or 1:Enable) */
 | 
			
		||||
 | 
			
		||||
#define _USE_CHMOD		0
 | 
			
		||||
/* This option switches attribute manipulation functions, f_chmod() and f_utime().
 | 
			
		||||
/  (0:Disable or 1:Enable) Also _FS_READONLY needs to be 0 to enable this option. */
 | 
			
		||||
 | 
			
		||||
#define _USE_LABEL           0
 | 
			
		||||
/* This option switches volume label functions, f_getlabel() and f_setlabel().
 | 
			
		||||
/  (0:Disable or 1:Enable) */
 | 
			
		||||
 | 
			
		||||
#define _USE_FORWARD         0
 | 
			
		||||
/* This option switches f_forward() function. (0:Disable or 1:Enable) */
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------------------------/
 | 
			
		||||
/ Locale and Namespace Configurations
 | 
			
		||||
/-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define _CODE_PAGE         850
 | 
			
		||||
/* This option specifies the OEM code page to be used on the target system.
 | 
			
		||||
/  Incorrect setting of the code page can cause a file open failure.
 | 
			
		||||
/
 | 
			
		||||
/   1   - ASCII (No extended character. Non-LFN cfg. only)
 | 
			
		||||
/   437 - U.S.
 | 
			
		||||
/   720 - Arabic
 | 
			
		||||
/   737 - Greek
 | 
			
		||||
/   771 - KBL
 | 
			
		||||
/   775 - Baltic
 | 
			
		||||
/   850 - Latin 1
 | 
			
		||||
/   852 - Latin 2
 | 
			
		||||
/   855 - Cyrillic
 | 
			
		||||
/   857 - Turkish
 | 
			
		||||
/   860 - Portuguese
 | 
			
		||||
/   861 - Icelandic
 | 
			
		||||
/   862 - Hebrew
 | 
			
		||||
/   863 - Canadian French
 | 
			
		||||
/   864 - Arabic
 | 
			
		||||
/   865 - Nordic
 | 
			
		||||
/   866 - Russian
 | 
			
		||||
/   869 - Greek 2
 | 
			
		||||
/   932 - Japanese (DBCS)
 | 
			
		||||
/   936 - Simplified Chinese (DBCS)
 | 
			
		||||
/   949 - Korean (DBCS)
 | 
			
		||||
/   950 - Traditional Chinese (DBCS)
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define _USE_LFN     2    /* 0 to 3 */
 | 
			
		||||
#define _MAX_LFN     255  /* Maximum LFN length to handle (12 to 255) */
 | 
			
		||||
/* The _USE_LFN switches the support of long file name (LFN).
 | 
			
		||||
/
 | 
			
		||||
/   0: Disable support of LFN. _MAX_LFN has no effect.
 | 
			
		||||
/   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
 | 
			
		||||
/   2: Enable LFN with dynamic working buffer on the STACK.
 | 
			
		||||
/   3: Enable LFN with dynamic working buffer on the HEAP.
 | 
			
		||||
/
 | 
			
		||||
/  To enable the LFN, Unicode handling functions (option/unicode.c) must be added
 | 
			
		||||
/  to the project. The working buffer occupies (_MAX_LFN + 1) * 2 bytes and
 | 
			
		||||
/  additional 608 bytes at exFAT enabled. _MAX_LFN can be in range from 12 to 255.
 | 
			
		||||
/  It should be set 255 to support full featured LFN operations.
 | 
			
		||||
/  When use stack for the working buffer, take care on stack overflow. When use heap
 | 
			
		||||
/  memory for the working buffer, memory management functions, ff_memalloc() and
 | 
			
		||||
/  ff_memfree(), must be added to the project. */
 | 
			
		||||
 | 
			
		||||
#define _LFN_UNICODE    0 /* 0:ANSI/OEM or 1:Unicode */
 | 
			
		||||
/* This option switches character encoding on the API. (0:ANSI/OEM or 1:UTF-16)
 | 
			
		||||
/  To use Unicode string for the path name, enable LFN and set _LFN_UNICODE = 1.
 | 
			
		||||
/  This option also affects behavior of string I/O functions. */
 | 
			
		||||
 | 
			
		||||
#define _STRF_ENCODE    3
 | 
			
		||||
/* When _LFN_UNICODE == 1, this option selects the character encoding ON THE FILE to
 | 
			
		||||
/  be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf().
 | 
			
		||||
/
 | 
			
		||||
/  0: ANSI/OEM
 | 
			
		||||
/  1: UTF-16LE
 | 
			
		||||
/  2: UTF-16BE
 | 
			
		||||
/  3: UTF-8
 | 
			
		||||
/
 | 
			
		||||
/  This option has no effect when _LFN_UNICODE == 0. */
 | 
			
		||||
 | 
			
		||||
#define _FS_RPATH       0 /* 0 to 2 */
 | 
			
		||||
/* This option configures support of relative path.
 | 
			
		||||
/
 | 
			
		||||
/   0: Disable relative path and remove related functions.
 | 
			
		||||
/   1: Enable relative path. f_chdir() and f_chdrive() are available.
 | 
			
		||||
/   2: f_getcwd() function is available in addition to 1.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------/
 | 
			
		||||
/ Drive/Volume Configurations
 | 
			
		||||
/----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define _VOLUMES    1
 | 
			
		||||
/* Number of volumes (logical drives) to be used. */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN Volumes */  
 | 
			
		||||
#define _STR_VOLUME_ID          0	/* 0:Use only 0-9 for drive ID, 1:Use strings for drive ID */
 | 
			
		||||
#define _VOLUME_STRS            "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3"
 | 
			
		||||
/* _STR_VOLUME_ID switches string support of volume ID.
 | 
			
		||||
/  When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive
 | 
			
		||||
/  number in the path name. _VOLUME_STRS defines the drive ID strings for each
 | 
			
		||||
/  logical drives. Number of items must be equal to _VOLUMES. Valid characters for
 | 
			
		||||
/  the drive ID strings are: A-Z and 0-9. */
 | 
			
		||||
/* USER CODE END Volumes */  
 | 
			
		||||
 | 
			
		||||
#define _MULTI_PARTITION     0 /* 0:Single partition, 1:Multiple partition */
 | 
			
		||||
/* This option switches support of multi-partition on a physical drive.
 | 
			
		||||
/  By default (0), each logical drive number is bound to the same physical drive
 | 
			
		||||
/  number and only an FAT volume found on the physical drive will be mounted.
 | 
			
		||||
/  When multi-partition is enabled (1), each logical drive number can be bound to
 | 
			
		||||
/  arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk()
 | 
			
		||||
/  funciton will be available. */
 | 
			
		||||
#define _MIN_SS    512  /* 512, 1024, 2048 or 4096 */
 | 
			
		||||
#define _MAX_SS    512  /* 512, 1024, 2048 or 4096 */
 | 
			
		||||
/* These options configure the range of sector size to be supported. (512, 1024,
 | 
			
		||||
/  2048 or 4096) Always set both 512 for most systems, all type of memory cards and
 | 
			
		||||
/  harddisk. But a larger value may be required for on-board flash memory and some
 | 
			
		||||
/  type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured
 | 
			
		||||
/  to variable sector size and GET_SECTOR_SIZE command must be implemented to the
 | 
			
		||||
/  disk_ioctl() function. */
 | 
			
		||||
 | 
			
		||||
#define	_USE_TRIM      0
 | 
			
		||||
/* This option switches support of ATA-TRIM. (0:Disable or 1:Enable)
 | 
			
		||||
/  To enable Trim function, also CTRL_TRIM command should be implemented to the
 | 
			
		||||
/  disk_ioctl() function. */
 | 
			
		||||
 | 
			
		||||
#define _FS_NOFSINFO    0 /* 0,1,2 or 3 */
 | 
			
		||||
/* If you need to know correct free space on the FAT32 volume, set bit 0 of this
 | 
			
		||||
/  option, and f_getfree() function at first time after volume mount will force
 | 
			
		||||
/  a full FAT scan. Bit 1 controls the use of last allocated cluster number.
 | 
			
		||||
/
 | 
			
		||||
/  bit0=0: Use free cluster count in the FSINFO if available.
 | 
			
		||||
/  bit0=1: Do not trust free cluster count in the FSINFO.
 | 
			
		||||
/  bit1=0: Use last allocated cluster number in the FSINFO if available.
 | 
			
		||||
/  bit1=1: Do not trust last allocated cluster number in the FSINFO.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------/
 | 
			
		||||
/ System Configurations
 | 
			
		||||
/----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#define _FS_TINY    0      /* 0:Normal or 1:Tiny */
 | 
			
		||||
/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
 | 
			
		||||
/  At the tiny configuration, size of file object (FIL) is reduced _MAX_SS bytes.
 | 
			
		||||
/  Instead of private sector buffer eliminated from the file object, common sector
 | 
			
		||||
/  buffer in the file system object (FATFS) is used for the file data transfer. */
 | 
			
		||||
 | 
			
		||||
#define _FS_EXFAT	0
 | 
			
		||||
/* This option switches support of exFAT file system. (0:Disable or 1:Enable)
 | 
			
		||||
/  When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1)
 | 
			
		||||
/  Note that enabling exFAT discards C89 compatibility. */
 | 
			
		||||
 | 
			
		||||
#define _FS_NORTC	0
 | 
			
		||||
#define _NORTC_MON	6
 | 
			
		||||
#define _NORTC_MDAY	4
 | 
			
		||||
#define _NORTC_YEAR	2015
 | 
			
		||||
/* The option _FS_NORTC switches timestamp functiton. If the system does not have
 | 
			
		||||
/  any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable
 | 
			
		||||
/  the timestamp function. All objects modified by FatFs will have a fixed timestamp
 | 
			
		||||
/  defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR in local time.
 | 
			
		||||
/  To enable timestamp function (_FS_NORTC = 0), get_fattime() function need to be
 | 
			
		||||
/  added to the project to get current time form real-time clock. _NORTC_MON,
 | 
			
		||||
/  _NORTC_MDAY and _NORTC_YEAR have no effect. 
 | 
			
		||||
/  These options have no effect at read-only configuration (_FS_READONLY = 1). */
 | 
			
		||||
 | 
			
		||||
#define _FS_LOCK    2     /* 0:Disable or >=1:Enable */
 | 
			
		||||
/* The option _FS_LOCK switches file lock function to control duplicated file open
 | 
			
		||||
/  and illegal operation to open objects. This option must be 0 when _FS_READONLY
 | 
			
		||||
/  is 1.
 | 
			
		||||
/
 | 
			
		||||
/  0:  Disable file lock function. To avoid volume corruption, application program
 | 
			
		||||
/      should avoid illegal open, remove and rename to the open objects.
 | 
			
		||||
/  >0: Enable file lock function. The value defines how many files/sub-directories
 | 
			
		||||
/      can be opened simultaneously under file lock control. Note that the file
 | 
			
		||||
/      lock control is independent of re-entrancy. */
 | 
			
		||||
 | 
			
		||||
#define _FS_REENTRANT    1  /* 0:Disable or 1:Enable */
 | 
			
		||||
#define _FS_TIMEOUT      1000 /* Timeout period in unit of time ticks */
 | 
			
		||||
#define _SYNC_t          osMutexId_t
 | 
			
		||||
/* The option _FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs
 | 
			
		||||
/  module itself. Note that regardless of this option, file access to different
 | 
			
		||||
/  volume is always re-entrant and volume control functions, f_mount(), f_mkfs()
 | 
			
		||||
/  and f_fdisk() function, are always not re-entrant. Only file/directory access
 | 
			
		||||
/  to the same volume is under control of this function.
 | 
			
		||||
/
 | 
			
		||||
/   0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect.
 | 
			
		||||
/   1: Enable re-entrancy. Also user provided synchronization handlers,
 | 
			
		||||
/      ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj()
 | 
			
		||||
/      function, must be added to the project. Samples are available in
 | 
			
		||||
/      option/syscall.c.
 | 
			
		||||
/
 | 
			
		||||
/  The _FS_TIMEOUT defines timeout period in unit of time tick.
 | 
			
		||||
/  The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*,
 | 
			
		||||
/  SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be
 | 
			
		||||
/  included somewhere in the scope of ff.h. */
 | 
			
		||||
 | 
			
		||||
/* define the ff_malloc ff_free macros as standard malloc free */
 | 
			
		||||
#if !defined(ff_malloc) && !defined(ff_free)
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#define ff_malloc  malloc
 | 
			
		||||
#define ff_free  free
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* _FFCONF */
 | 
			
		||||
							
								
								
									
										124
									
								
								firmware/targets/f3/Src/fatfs/spi_sd_hal.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								firmware/targets/f3/Src/fatfs/spi_sd_hal.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,124 @@
 | 
			
		||||
#include "main.h"
 | 
			
		||||
 | 
			
		||||
#define SD_DUMMY_BYTE 0xFF
 | 
			
		||||
#define SD_CS_LOW() HAL_GPIO_WritePin(SD_CS_GPIO_Port, SD_CS_Pin, GPIO_PIN_RESET)
 | 
			
		||||
#define SD_CS_HIGH() HAL_GPIO_WritePin(SD_CS_GPIO_Port, SD_CS_Pin, GPIO_PIN_SET)
 | 
			
		||||
 | 
			
		||||
const uint32_t SpiTimeout = 1000;
 | 
			
		||||
extern SPI_HandleTypeDef SPI_SD_HANDLE;
 | 
			
		||||
uint8_t SD_IO_WriteByte(uint8_t Data);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
                            BUS OPERATIONS
 | 
			
		||||
 *******************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief  SPI error treatment function
 | 
			
		||||
 * @retval None
 | 
			
		||||
 */
 | 
			
		||||
static void SPIx_Error(void) {
 | 
			
		||||
    /* De-initialize the SPI communication BUS */
 | 
			
		||||
    HAL_SPI_DeInit(&SPI_SD_HANDLE);
 | 
			
		||||
 | 
			
		||||
    /* Re-Initiaize the SPI communication BUS */
 | 
			
		||||
    HAL_SPI_Init(&SPI_SD_HANDLE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief  SPI Write byte(s) to device
 | 
			
		||||
 * @param  DataIn: Pointer to data buffer to write
 | 
			
		||||
 * @param  DataOut: Pointer to data buffer for read data
 | 
			
		||||
 * @param  DataLength: number of bytes to write
 | 
			
		||||
 * @retval None
 | 
			
		||||
 */
 | 
			
		||||
static void SPIx_WriteReadData(const uint8_t* DataIn, uint8_t* DataOut, uint16_t DataLength) {
 | 
			
		||||
    HAL_StatusTypeDef status = HAL_OK;
 | 
			
		||||
    status =
 | 
			
		||||
        HAL_SPI_TransmitReceive(&SPI_SD_HANDLE, (uint8_t*)DataIn, DataOut, DataLength, SpiTimeout);
 | 
			
		||||
 | 
			
		||||
    /* Check the communication status */
 | 
			
		||||
    if(status != HAL_OK) {
 | 
			
		||||
        /* Execute user timeout callback */
 | 
			
		||||
        SPIx_Error();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief  SPI Write a byte to device
 | 
			
		||||
 * @param  Value: value to be written
 | 
			
		||||
 * @retval None
 | 
			
		||||
 */
 | 
			
		||||
__attribute__((unused)) static void SPIx_Write(uint8_t Value) {
 | 
			
		||||
    HAL_StatusTypeDef status = HAL_OK;
 | 
			
		||||
    uint8_t data;
 | 
			
		||||
 | 
			
		||||
    status = HAL_SPI_TransmitReceive(&SPI_SD_HANDLE, (uint8_t*)&Value, &data, 1, SpiTimeout);
 | 
			
		||||
 | 
			
		||||
    /* Check the communication status */
 | 
			
		||||
    if(status != HAL_OK) {
 | 
			
		||||
        /* Execute user timeout callback */
 | 
			
		||||
        SPIx_Error();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
                            LINK OPERATIONS
 | 
			
		||||
 *******************************************************************************/
 | 
			
		||||
 | 
			
		||||
/********************************* LINK SD ************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * @brief  Initialize the SD Card and put it into StandBy State (Ready for
 | 
			
		||||
 *         data transfer).
 | 
			
		||||
 * @retval None
 | 
			
		||||
 */
 | 
			
		||||
void SD_IO_Init(void) {
 | 
			
		||||
    uint8_t counter = 0;
 | 
			
		||||
 | 
			
		||||
    /* SD chip select high */
 | 
			
		||||
    SD_CS_HIGH();
 | 
			
		||||
 | 
			
		||||
    /* Send dummy byte 0xFF, 10 times with CS high */
 | 
			
		||||
    /* Rise CS and MOSI for 80 clocks cycles */
 | 
			
		||||
    for(counter = 0; counter <= 200; counter++) {
 | 
			
		||||
        /* Send dummy byte 0xFF */
 | 
			
		||||
        SD_IO_WriteByte(SD_DUMMY_BYTE);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief  Set SD interface Chip Select state
 | 
			
		||||
 * @param  val: 0 (low) or 1 (high) state
 | 
			
		||||
 * @retval None
 | 
			
		||||
 */
 | 
			
		||||
void SD_IO_CSState(uint8_t val) {
 | 
			
		||||
    if(val == 1) {
 | 
			
		||||
        SD_CS_HIGH();
 | 
			
		||||
    } else {
 | 
			
		||||
        SD_CS_LOW();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief  Write byte(s) on the SD
 | 
			
		||||
 * @param  DataIn: Pointer to data buffer to write
 | 
			
		||||
 * @param  DataOut: Pointer to data buffer for read data
 | 
			
		||||
 * @param  DataLength: number of bytes to write
 | 
			
		||||
 * @retval None
 | 
			
		||||
 */
 | 
			
		||||
void SD_IO_WriteReadData(const uint8_t* DataIn, uint8_t* DataOut, uint16_t DataLength) {
 | 
			
		||||
    /* Send the byte */
 | 
			
		||||
    SPIx_WriteReadData(DataIn, DataOut, DataLength);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief  Write a byte on the SD.
 | 
			
		||||
 * @param  Data: byte to send.
 | 
			
		||||
 * @retval Data written
 | 
			
		||||
 */
 | 
			
		||||
uint8_t SD_IO_WriteByte(uint8_t Data) {
 | 
			
		||||
    uint8_t tmp;
 | 
			
		||||
 | 
			
		||||
    /* Send the byte */
 | 
			
		||||
    SPIx_WriteReadData(&Data, &tmp, 1);
 | 
			
		||||
    return tmp;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1013
									
								
								firmware/targets/f3/Src/fatfs/stm32_adafruit_sd.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1013
									
								
								firmware/targets/f3/Src/fatfs/stm32_adafruit_sd.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										251
									
								
								firmware/targets/f3/Src/fatfs/stm32_adafruit_sd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								firmware/targets/f3/Src/fatfs/stm32_adafruit_sd.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,251 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file    stm32_adafruit_sd.h
 | 
			
		||||
  * @author  MCD Application Team
 | 
			
		||||
  * @version V3.0.0
 | 
			
		||||
  * @date    23-December-2016
 | 
			
		||||
  * @brief   This file contains the common defines and functions prototypes for
 | 
			
		||||
  *          the stm32_adafruit_sd.c driver.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
  * are permitted provided that the following conditions are met:
 | 
			
		||||
  *   1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
  *      this list of conditions and the following disclaimer.
 | 
			
		||||
  *   2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
  *      this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
  *      and/or other materials provided with the distribution.
 | 
			
		||||
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
 | 
			
		||||
  *      may be used to endorse or promote products derived from this software
 | 
			
		||||
  *      without specific prior written permission.
 | 
			
		||||
  *
 | 
			
		||||
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 | 
			
		||||
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
			
		||||
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
			
		||||
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
			
		||||
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */ 
 | 
			
		||||
 | 
			
		||||
/* Define to prevent recursive inclusion -------------------------------------*/
 | 
			
		||||
#ifndef __STM32_ADAFRUIT_SD_H
 | 
			
		||||
#define __STM32_ADAFRUIT_SD_H
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
 extern "C" {
 | 
			
		||||
#endif 
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/** @addtogroup BSP
 | 
			
		||||
  * @{
 | 
			
		||||
  */ 
 | 
			
		||||
#define __IO    volatile   
 | 
			
		||||
   
 | 
			
		||||
/** @addtogroup STM32_ADAFRUIT
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
    
 | 
			
		||||
/** @defgroup STM32_ADAFRUIT_SD
 | 
			
		||||
  * @{
 | 
			
		||||
  */    
 | 
			
		||||
 | 
			
		||||
/** @defgroup STM32_ADAFRUIT_SD_Exported_Types
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
   
 | 
			
		||||
/** 
 | 
			
		||||
  * @brief  SD status structure definition  
 | 
			
		||||
  */     
 | 
			
		||||
enum {    
 | 
			
		||||
      BSP_SD_OK = 0x00,      
 | 
			
		||||
      MSD_OK = 0x00,
 | 
			
		||||
      BSP_SD_ERROR = 0x01,
 | 
			
		||||
      BSP_SD_TIMEOUT
 | 
			
		||||
};
 | 
			
		||||
   
 | 
			
		||||
typedef struct              
 | 
			
		||||
{
 | 
			
		||||
  uint8_t  Reserved1:2;               /* Reserved */
 | 
			
		||||
  uint16_t DeviceSize:12;             /* Device Size */
 | 
			
		||||
  uint8_t  MaxRdCurrentVDDMin:3;      /* Max. read current @ VDD min */
 | 
			
		||||
  uint8_t  MaxRdCurrentVDDMax:3;      /* Max. read current @ VDD max */
 | 
			
		||||
  uint8_t  MaxWrCurrentVDDMin:3;      /* Max. write current @ VDD min */
 | 
			
		||||
  uint8_t  MaxWrCurrentVDDMax:3;      /* Max. write current @ VDD max */
 | 
			
		||||
  uint8_t  DeviceSizeMul:3;           /* Device size multiplier */
 | 
			
		||||
} struct_v1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct              
 | 
			
		||||
{
 | 
			
		||||
  uint8_t  Reserved1:6;               /* Reserved */
 | 
			
		||||
  uint32_t DeviceSize:22;             /* Device Size */
 | 
			
		||||
  uint8_t  Reserved2:1;               /* Reserved */
 | 
			
		||||
} struct_v2;
 | 
			
		||||
 | 
			
		||||
/** 
 | 
			
		||||
  * @brief  Card Specific Data: CSD Register
 | 
			
		||||
  */ 
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  /* Header part */
 | 
			
		||||
  uint8_t  CSDStruct:2;            /* CSD structure */
 | 
			
		||||
  uint8_t  Reserved1:6;            /* Reserved */
 | 
			
		||||
  uint8_t  TAAC:8;                 /* Data read access-time 1 */
 | 
			
		||||
  uint8_t  NSAC:8;                 /* Data read access-time 2 in CLK cycles */
 | 
			
		||||
  uint8_t  MaxBusClkFrec:8;        /* Max. bus clock frequency */
 | 
			
		||||
  uint16_t CardComdClasses:12;      /* Card command classes */
 | 
			
		||||
  uint8_t  RdBlockLen:4;           /* Max. read data block length */
 | 
			
		||||
  uint8_t  PartBlockRead:1;        /* Partial blocks for read allowed */
 | 
			
		||||
  uint8_t  WrBlockMisalign:1;      /* Write block misalignment */
 | 
			
		||||
  uint8_t  RdBlockMisalign:1;      /* Read block misalignment */
 | 
			
		||||
  uint8_t  DSRImpl:1;              /* DSR implemented */
 | 
			
		||||
  
 | 
			
		||||
  /* v1 or v2 struct */
 | 
			
		||||
  union csd_version {
 | 
			
		||||
    struct_v1 v1;
 | 
			
		||||
    struct_v2 v2;
 | 
			
		||||
  } version;
 | 
			
		||||
  
 | 
			
		||||
  uint8_t  EraseSingleBlockEnable:1;  /* Erase single block enable */
 | 
			
		||||
  uint8_t  EraseSectorSize:7;         /* Erase group size multiplier */
 | 
			
		||||
  uint8_t  WrProtectGrSize:7;         /* Write protect group size */
 | 
			
		||||
  uint8_t  WrProtectGrEnable:1;       /* Write protect group enable */
 | 
			
		||||
  uint8_t  Reserved2:2;               /* Reserved */
 | 
			
		||||
  uint8_t  WrSpeedFact:3;             /* Write speed factor */
 | 
			
		||||
  uint8_t  MaxWrBlockLen:4;           /* Max. write data block length */
 | 
			
		||||
  uint8_t  WriteBlockPartial:1;       /* Partial blocks for write allowed */
 | 
			
		||||
  uint8_t  Reserved3:5;               /* Reserved */
 | 
			
		||||
  uint8_t  FileFormatGrouop:1;        /* File format group */
 | 
			
		||||
  uint8_t  CopyFlag:1;                /* Copy flag (OTP) */
 | 
			
		||||
  uint8_t  PermWrProtect:1;           /* Permanent write protection */
 | 
			
		||||
  uint8_t  TempWrProtect:1;           /* Temporary write protection */
 | 
			
		||||
  uint8_t  FileFormat:2;              /* File Format */
 | 
			
		||||
  uint8_t  Reserved4:2;               /* Reserved */
 | 
			
		||||
  uint8_t  crc:7;                     /* Reserved */
 | 
			
		||||
  uint8_t  Reserved5:1;               /* always 1*/
 | 
			
		||||
  
 | 
			
		||||
} SD_CSD;
 | 
			
		||||
 | 
			
		||||
/** 
 | 
			
		||||
  * @brief  Card Identification Data: CID Register   
 | 
			
		||||
  */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  __IO uint8_t  ManufacturerID;       /* ManufacturerID */
 | 
			
		||||
  __IO uint16_t OEM_AppliID;          /* OEM/Application ID */
 | 
			
		||||
  __IO uint32_t ProdName1;            /* Product Name part1 */
 | 
			
		||||
  __IO uint8_t  ProdName2;            /* Product Name part2*/
 | 
			
		||||
  __IO uint8_t  ProdRev;              /* Product Revision */
 | 
			
		||||
  __IO uint32_t ProdSN;               /* Product Serial Number */
 | 
			
		||||
  __IO uint8_t  Reserved1;            /* Reserved1 */
 | 
			
		||||
  __IO uint16_t ManufactDate;         /* Manufacturing Date */
 | 
			
		||||
  __IO uint8_t  CID_CRC;              /* CID CRC */
 | 
			
		||||
  __IO uint8_t  Reserved2;            /* always 1 */
 | 
			
		||||
} SD_CID;
 | 
			
		||||
 | 
			
		||||
/** 
 | 
			
		||||
  * @brief SD Card information 
 | 
			
		||||
  */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  SD_CSD Csd;
 | 
			
		||||
  SD_CID Cid;
 | 
			
		||||
  uint32_t CardCapacity;              /*!< Card Capacity */
 | 
			
		||||
  uint32_t CardBlockSize;             /*!< Card Block Size */
 | 
			
		||||
  uint32_t LogBlockNbr;               /*!< Specifies the Card logical Capacity in blocks   */
 | 
			
		||||
  uint32_t LogBlockSize;              /*!< Specifies logical block size in bytes           */
 | 
			
		||||
} SD_CardInfo;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
  
 | 
			
		||||
/** @defgroup STM32_ADAFRUIT_SPI_SD_Exported_Constants
 | 
			
		||||
  * @{
 | 
			
		||||
  */ 
 | 
			
		||||
  
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Block Size
 | 
			
		||||
  */
 | 
			
		||||
#define SD_BLOCK_SIZE    0x200
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  SD detection on its memory slot
 | 
			
		||||
  */
 | 
			
		||||
#define SD_PRESENT               ((uint8_t)0x01)
 | 
			
		||||
#define SD_NOT_PRESENT           ((uint8_t)0x00)
 | 
			
		||||
 | 
			
		||||
#define SD_DATATIMEOUT           ((uint32_t)100000000)
 | 
			
		||||
 | 
			
		||||
/** 
 | 
			
		||||
  * @brief SD Card information structure 
 | 
			
		||||
  */   
 | 
			
		||||
#define BSP_SD_CardInfo SD_CardInfo
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
  
 | 
			
		||||
/** @defgroup STM32_ADAFRUIT_SD_Exported_Macro
 | 
			
		||||
  * @{
 | 
			
		||||
  */ 
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */ 
 | 
			
		||||
 | 
			
		||||
/** @defgroup STM32_ADAFRUIT_SD_Exported_Functions
 | 
			
		||||
  * @{
 | 
			
		||||
  */   
 | 
			
		||||
uint8_t BSP_SD_Init(void);
 | 
			
		||||
uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout);
 | 
			
		||||
uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout);
 | 
			
		||||
uint8_t BSP_SD_Erase(uint32_t StartAddr, uint32_t EndAddr);
 | 
			
		||||
uint8_t BSP_SD_GetCardState(void);
 | 
			
		||||
uint8_t BSP_SD_GetCardInfo(SD_CardInfo *pCardInfo);
 | 
			
		||||
   
 | 
			
		||||
/* Link functions for SD Card peripheral*/
 | 
			
		||||
void    SD_SPI_Slow_Init(void);
 | 
			
		||||
void    SD_SPI_Fast_Init(void);
 | 
			
		||||
void    SD_IO_Init(void);
 | 
			
		||||
void    SD_IO_CSState(uint8_t state);
 | 
			
		||||
void    SD_IO_WriteReadData(const uint8_t *DataIn, uint8_t *DataOut, uint16_t DataLength);
 | 
			
		||||
uint8_t SD_IO_WriteByte(uint8_t Data);
 | 
			
		||||
 | 
			
		||||
/* Link function for HAL delay */
 | 
			
		||||
void HAL_Delay(__IO uint32_t Delay);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __STM32_ADAFRUIT_SD_H */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */ 
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */ 
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */ 
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */ 
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										138
									
								
								firmware/targets/f3/Src/fatfs/syscall.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								firmware/targets/f3/Src/fatfs/syscall.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,138 @@
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* Sample code of OS dependent controls for FatFs                         */
 | 
			
		||||
/* (C)ChaN, 2014                                                          */
 | 
			
		||||
/*   Portions COPYRIGHT 2017 STMicroelectronics                           */
 | 
			
		||||
/*   Portions Copyright (C) 2014, ChaN, all right reserved                */
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * Copyright (c) 2017 STMicroelectronics. All rights reserved.
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under BSD 3-Clause license,
 | 
			
		||||
  * the "License"; You may not use this file except in compliance with the
 | 
			
		||||
  * License. You may obtain a copy of the License at:
 | 
			
		||||
  *                       opensource.org/licenses/BSD-3-Clause
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "fatfs/ff.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if _FS_REENTRANT
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* Create a Synchronization Object                                        */
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* This function is called in f_mount() function to create a new
 | 
			
		||||
/  synchronization object, such as semaphore and mutex. When a 0 is returned,
 | 
			
		||||
/  the f_mount() function fails with FR_INT_ERR.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int ff_cre_syncobj (	/* 1:Function succeeded, 0:Could not create the sync object */
 | 
			
		||||
	BYTE vol,			/* Corresponding volume (logical drive number) */
 | 
			
		||||
	_SYNC_t *sobj		/* Pointer to return the created sync object */
 | 
			
		||||
)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    //osSemaphoreDef(SEM);
 | 
			
		||||
    //*sobj = osSemaphoreCreate(osSemaphore(SEM), 1);
 | 
			
		||||
    *sobj = osMutexNew(NULL);
 | 
			
		||||
    ret = (*sobj != NULL);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* Delete a Synchronization Object                                        */
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* This function is called in f_mount() function to delete a synchronization
 | 
			
		||||
/  object that created with ff_cre_syncobj() function. When a 0 is returned,
 | 
			
		||||
/  the f_mount() function fails with FR_INT_ERR.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int ff_del_syncobj (	/* 1:Function succeeded, 0:Could not delete due to any error */
 | 
			
		||||
	_SYNC_t sobj		/* Sync object tied to the logical drive to be deleted */
 | 
			
		||||
)
 | 
			
		||||
{
 | 
			
		||||
    osMutexDelete(sobj);
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* Request Grant to Access the Volume                                     */
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* This function is called on entering file functions to lock the volume.
 | 
			
		||||
/  When a 0 is returned, the file function fails with FR_TIMEOUT.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int ff_req_grant (	/* 1:Got a grant to access the volume, 0:Could not get a grant */
 | 
			
		||||
	_SYNC_t sobj	/* Sync object to wait */
 | 
			
		||||
)
 | 
			
		||||
{
 | 
			
		||||
  int ret = 0;
 | 
			
		||||
 | 
			
		||||
  if(osMutexAcquire(sobj, _FS_TIMEOUT) == osOK) {
 | 
			
		||||
      ret = 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* Release Grant to Access the Volume                                     */
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* This function is called on leaving file functions to unlock the volume.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void ff_rel_grant (
 | 
			
		||||
	_SYNC_t sobj	/* Sync object to be signaled */
 | 
			
		||||
)
 | 
			
		||||
{
 | 
			
		||||
    osMutexRelease(sobj);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if _USE_LFN == 3	/* LFN with a working buffer on the heap */
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* Allocate a memory block                                                */
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* If a NULL is returned, the file function fails with FR_NOT_ENOUGH_CORE.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void* ff_memalloc (	/* Returns pointer to the allocated memory block */
 | 
			
		||||
	UINT msize		/* Number of bytes to allocate */
 | 
			
		||||
)
 | 
			
		||||
{
 | 
			
		||||
	return ff_malloc(msize);	/* Allocate a new memory block with POSIX API */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
/* Free a memory block                                                    */
 | 
			
		||||
/*------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void ff_memfree (
 | 
			
		||||
	void* mblock	/* Pointer to the memory block to free */
 | 
			
		||||
)
 | 
			
		||||
{
 | 
			
		||||
	ff_free(mblock);	/* Discard the memory block with POSIX API */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										219
									
								
								firmware/targets/f3/Src/fatfs/user_diskio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								firmware/targets/f3/Src/fatfs/user_diskio.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,219 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
 ******************************************************************************
 | 
			
		||||
 * @file    user_diskio.c
 | 
			
		||||
 * @brief   This file includes a diskio driver skeleton to be completed by the user.
 | 
			
		||||
 ******************************************************************************
 | 
			
		||||
 * @attention
 | 
			
		||||
 *
 | 
			
		||||
 * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
 * All rights reserved.</center></h2>
 | 
			
		||||
 *
 | 
			
		||||
 * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
 * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
 * the License. You may obtain a copy of the License at:
 | 
			
		||||
 *                             www.st.com/SLA0044
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************
 | 
			
		||||
 */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
#ifdef USE_OBSOLETE_USER_CODE_SECTION_0
 | 
			
		||||
/* 
 | 
			
		||||
 * Warning: the user section 0 is no more in use (starting from CubeMx version 4.16.0)
 | 
			
		||||
 * To be suppressed in the future. 
 | 
			
		||||
 * Kept to ensure backward compatibility with previous CubeMx versions when 
 | 
			
		||||
 * migrating projects. 
 | 
			
		||||
 * User code previously added there should be copied in the new user sections before 
 | 
			
		||||
 * the section contents can be deleted.
 | 
			
		||||
 */
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN DECL */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "user_diskio.h"
 | 
			
		||||
 | 
			
		||||
/* Private typedef -----------------------------------------------------------*/
 | 
			
		||||
/* Private define ------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
/* Disk status */
 | 
			
		||||
static volatile DSTATUS Stat = STA_NOINIT;
 | 
			
		||||
 | 
			
		||||
static DSTATUS User_CheckStatus(BYTE lun) {
 | 
			
		||||
    Stat = STA_NOINIT;
 | 
			
		||||
 | 
			
		||||
    if(BSP_SD_GetCardState() == MSD_OK) {
 | 
			
		||||
        Stat &= ~STA_NOINIT;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return Stat;
 | 
			
		||||
}
 | 
			
		||||
/* USER CODE END DECL */
 | 
			
		||||
 | 
			
		||||
/* Private function prototypes -----------------------------------------------*/
 | 
			
		||||
DSTATUS USER_initialize(BYTE pdrv);
 | 
			
		||||
DSTATUS USER_status(BYTE pdrv);
 | 
			
		||||
DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
 | 
			
		||||
#if _USE_WRITE == 1
 | 
			
		||||
DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
 | 
			
		||||
#endif /* _USE_WRITE == 1 */
 | 
			
		||||
#if _USE_IOCTL == 1
 | 
			
		||||
DRESULT USER_ioctl(BYTE pdrv, BYTE cmd, void* buff);
 | 
			
		||||
#endif /* _USE_IOCTL == 1 */
 | 
			
		||||
 | 
			
		||||
Diskio_drvTypeDef USER_Driver = {
 | 
			
		||||
    USER_initialize,
 | 
			
		||||
    USER_status,
 | 
			
		||||
    USER_read,
 | 
			
		||||
#if _USE_WRITE
 | 
			
		||||
    USER_write,
 | 
			
		||||
#endif /* _USE_WRITE == 1 */
 | 
			
		||||
#if _USE_IOCTL == 1
 | 
			
		||||
    USER_ioctl,
 | 
			
		||||
#endif /* _USE_IOCTL == 1 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Private functions ---------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Initializes a Drive
 | 
			
		||||
  * @param  pdrv: Physical drive number (0..)
 | 
			
		||||
  * @retval DSTATUS: Operation status
 | 
			
		||||
  */
 | 
			
		||||
DSTATUS USER_initialize(BYTE pdrv /* Physical drive nmuber to identify the drive */
 | 
			
		||||
) {
 | 
			
		||||
    /* USER CODE BEGIN INIT */
 | 
			
		||||
    return User_CheckStatus(pdrv);
 | 
			
		||||
    /* USER CODE END INIT */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Gets Disk Status 
 | 
			
		||||
  * @param  pdrv: Physical drive number (0..)
 | 
			
		||||
  * @retval DSTATUS: Operation status
 | 
			
		||||
  */
 | 
			
		||||
DSTATUS USER_status(BYTE pdrv /* Physical drive number to identify the drive */
 | 
			
		||||
) {
 | 
			
		||||
    /* USER CODE BEGIN STATUS */
 | 
			
		||||
    return Stat;
 | 
			
		||||
    /* USER CODE END STATUS */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Reads Sector(s) 
 | 
			
		||||
  * @param  pdrv: Physical drive number (0..)
 | 
			
		||||
  * @param  *buff: Data buffer to store read data
 | 
			
		||||
  * @param  sector: Sector address (LBA)
 | 
			
		||||
  * @param  count: Number of sectors to read (1..128)
 | 
			
		||||
  * @retval DRESULT: Operation result
 | 
			
		||||
  */
 | 
			
		||||
DRESULT USER_read(
 | 
			
		||||
    BYTE pdrv, /* Physical drive nmuber to identify the drive */
 | 
			
		||||
    BYTE* buff, /* Data buffer to store read data */
 | 
			
		||||
    DWORD sector, /* Sector address in LBA */
 | 
			
		||||
    UINT count /* Number of sectors to read */
 | 
			
		||||
) {
 | 
			
		||||
    /* USER CODE BEGIN READ */
 | 
			
		||||
    DRESULT res = RES_ERROR;
 | 
			
		||||
    if(BSP_SD_ReadBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) {
 | 
			
		||||
        /* wait until the read operation is finished */
 | 
			
		||||
        while(BSP_SD_GetCardState() != MSD_OK) {
 | 
			
		||||
        }
 | 
			
		||||
        res = RES_OK;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
    /* USER CODE END READ */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Writes Sector(s)  
 | 
			
		||||
  * @param  pdrv: Physical drive number (0..)
 | 
			
		||||
  * @param  *buff: Data to be written
 | 
			
		||||
  * @param  sector: Sector address (LBA)
 | 
			
		||||
  * @param  count: Number of sectors to write (1..128)
 | 
			
		||||
  * @retval DRESULT: Operation result
 | 
			
		||||
  */
 | 
			
		||||
#if _USE_WRITE == 1
 | 
			
		||||
DRESULT USER_write(
 | 
			
		||||
    BYTE pdrv, /* Physical drive nmuber to identify the drive */
 | 
			
		||||
    const BYTE* buff, /* Data to be written */
 | 
			
		||||
    DWORD sector, /* Sector address in LBA */
 | 
			
		||||
    UINT count /* Number of sectors to write */
 | 
			
		||||
) {
 | 
			
		||||
    /* USER CODE BEGIN WRITE */
 | 
			
		||||
    /* USER CODE HERE */
 | 
			
		||||
    DRESULT res = RES_ERROR;
 | 
			
		||||
 | 
			
		||||
    if(BSP_SD_WriteBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) {
 | 
			
		||||
        /* wait until the Write operation is finished */
 | 
			
		||||
        while(BSP_SD_GetCardState() != MSD_OK) {
 | 
			
		||||
        }
 | 
			
		||||
        res = RES_OK;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
    /* USER CODE END WRITE */
 | 
			
		||||
}
 | 
			
		||||
#endif /* _USE_WRITE == 1 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  I/O control operation  
 | 
			
		||||
  * @param  pdrv: Physical drive number (0..)
 | 
			
		||||
  * @param  cmd: Control code
 | 
			
		||||
  * @param  *buff: Buffer to send/receive control data
 | 
			
		||||
  * @retval DRESULT: Operation result
 | 
			
		||||
  */
 | 
			
		||||
#if _USE_IOCTL == 1
 | 
			
		||||
DRESULT USER_ioctl(
 | 
			
		||||
    BYTE pdrv, /* Physical drive nmuber (0..) */
 | 
			
		||||
    BYTE cmd, /* Control code */
 | 
			
		||||
    void* buff /* Buffer to send/receive control data */
 | 
			
		||||
) {
 | 
			
		||||
    /* USER CODE BEGIN IOCTL */
 | 
			
		||||
    DRESULT res = RES_ERROR;
 | 
			
		||||
    BSP_SD_CardInfo CardInfo;
 | 
			
		||||
 | 
			
		||||
    if(Stat & STA_NOINIT) return RES_NOTRDY;
 | 
			
		||||
 | 
			
		||||
    switch(cmd) {
 | 
			
		||||
    /* Make sure that no pending write process */
 | 
			
		||||
    case CTRL_SYNC:
 | 
			
		||||
        res = RES_OK;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    /* Get number of sectors on the disk (DWORD) */
 | 
			
		||||
    case GET_SECTOR_COUNT:
 | 
			
		||||
        BSP_SD_GetCardInfo(&CardInfo);
 | 
			
		||||
        *(DWORD*)buff = CardInfo.LogBlockNbr;
 | 
			
		||||
        res = RES_OK;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    /* Get R/W sector size (WORD) */
 | 
			
		||||
    case GET_SECTOR_SIZE:
 | 
			
		||||
        BSP_SD_GetCardInfo(&CardInfo);
 | 
			
		||||
        *(WORD*)buff = CardInfo.LogBlockSize;
 | 
			
		||||
        res = RES_OK;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    /* Get erase block size in unit of sector (DWORD) */
 | 
			
		||||
    case GET_BLOCK_SIZE:
 | 
			
		||||
        BSP_SD_GetCardInfo(&CardInfo);
 | 
			
		||||
        *(DWORD*)buff = CardInfo.LogBlockSize;
 | 
			
		||||
        res = RES_OK;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
        res = RES_PARERR;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
    /* USER CODE END IOCTL */
 | 
			
		||||
}
 | 
			
		||||
#endif /* _USE_IOCTL == 1 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										48
									
								
								firmware/targets/f3/Src/fatfs/user_diskio.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								firmware/targets/f3/Src/fatfs/user_diskio.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
 ******************************************************************************
 | 
			
		||||
  * @file    user_diskio.h
 | 
			
		||||
  * @brief   This file contains the common defines and functions prototypes for  
 | 
			
		||||
  *          the user_diskio driver.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
/* Define to prevent recursive inclusion -------------------------------------*/
 | 
			
		||||
#ifndef __USER_DISKIO_H
 | 
			
		||||
#define __USER_DISKIO_H
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "stm32_adafruit_sd.h"
 | 
			
		||||
#include "fatfs/ff_gen_drv.h"
 | 
			
		||||
/* Exported types ------------------------------------------------------------*/
 | 
			
		||||
/* Exported constants --------------------------------------------------------*/
 | 
			
		||||
/* Exported functions ------------------------------------------------------- */
 | 
			
		||||
extern Diskio_drvTypeDef USER_Driver;
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __USER_DISKIO_H */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										21
									
								
								firmware/targets/f3/Src/freertos-openocd.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								firmware/targets/f3/Src/freertos-openocd.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Since at least FreeRTOS V7.5.3 uxTopUsedPriority is no longer
 | 
			
		||||
 * present in the kernel, so it has to be supplied by other means for
 | 
			
		||||
 * OpenOCD's threads awareness.
 | 
			
		||||
 *
 | 
			
		||||
 * Add this file to your project, and, if you're using --gc-sections,
 | 
			
		||||
 * ``--undefined=uxTopUsedPriority'' (or
 | 
			
		||||
 * ``-Wl,--undefined=uxTopUsedPriority'' when using gcc for final
 | 
			
		||||
 * linking) to your LDFLAGS; same with all the other symbols you need.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
#define USED __attribute__((used))
 | 
			
		||||
#else
 | 
			
		||||
#define USED
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
const int USED uxTopUsedPriority = configMAX_PRIORITIES - 1;
 | 
			
		||||
							
								
								
									
										190
									
								
								firmware/targets/f3/Src/gpio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								firmware/targets/f3/Src/gpio.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,190 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : gpio.c
 | 
			
		||||
  * Description        : This file provides code for the configuration
 | 
			
		||||
  *                      of all used GPIO pins.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "gpio.h"
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------*/
 | 
			
		||||
/* Configure GPIO                                                             */
 | 
			
		||||
/*----------------------------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/** Configure pins as
 | 
			
		||||
        * Analog
 | 
			
		||||
        * Input
 | 
			
		||||
        * Output
 | 
			
		||||
        * EVENT_OUT
 | 
			
		||||
        * EXTI
 | 
			
		||||
*/
 | 
			
		||||
void MX_GPIO_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
 | 
			
		||||
  /* GPIO Ports Clock Enable */
 | 
			
		||||
  __HAL_RCC_GPIOC_CLK_ENABLE();
 | 
			
		||||
  __HAL_RCC_GPIOH_CLK_ENABLE();
 | 
			
		||||
  __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
  __HAL_RCC_GPIOA_CLK_ENABLE();
 | 
			
		||||
  __HAL_RCC_GPIOE_CLK_ENABLE();
 | 
			
		||||
  __HAL_RCC_GPIOD_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(GPIOA, LED_RED_Pin|LED_GREEN_Pin|LED_BLUE_Pin, GPIO_PIN_SET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(DISPLAY_RST_GPIO_Port, DISPLAY_RST_Pin, GPIO_PIN_RESET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(NFC_CS_GPIO_Port, NFC_CS_Pin, GPIO_PIN_SET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(DISPLAY_DI_GPIO_Port, DISPLAY_DI_Pin, GPIO_PIN_RESET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(DISPLAY_BACKLIGHT_GPIO_Port, DISPLAY_BACKLIGHT_Pin, GPIO_PIN_RESET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(GPIOC, DISPLAY_CS_Pin|SD_CS_Pin, GPIO_PIN_SET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(CC1101_CS_GPIO_Port, CC1101_CS_Pin, GPIO_PIN_SET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PCPin PCPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = BUTTON_BACK_Pin|BUTTON_OK_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_PULLUP;
 | 
			
		||||
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PtPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = BOOT0_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(BOOT0_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PCPin PCPin PCPin PCPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = PC0_Pin|PC1_Pin|PC3_Pin|PC10_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PAPin PAPin PAPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = LED_RED_Pin|LED_GREEN_Pin|LED_BLUE_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PAPin PAPin PAPin PAPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = PA4_Pin|PA5_Pin|PA6_Pin|PA7_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PtPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = RFID_PULL_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(RFID_PULL_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PtPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = CC1101_G0_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(CC1101_G0_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PBPin PBPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = PB2_Pin|iBTN_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PBPin PBPin PBPin PBPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = BUTTON_UP_Pin|BUTTON_LEFT_Pin|BUTTON_DOWN_Pin|BUTTON_RIGHT_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_PULLUP;
 | 
			
		||||
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PtPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = DISPLAY_RST_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
  HAL_GPIO_Init(DISPLAY_RST_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PtPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = NFC_CS_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | 
			
		||||
  HAL_GPIO_Init(NFC_CS_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PCPin PCPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = DISPLAY_DI_Pin|DISPLAY_CS_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PtPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = DISPLAY_BACKLIGHT_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
  HAL_GPIO_Init(DISPLAY_BACKLIGHT_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PtPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = SD_CS_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | 
			
		||||
  HAL_GPIO_Init(SD_CS_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PtPin */
 | 
			
		||||
  GPIO_InitStruct.Pin = CC1101_CS_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | 
			
		||||
  HAL_GPIO_Init(CC1101_CS_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* EXTI interrupt init*/
 | 
			
		||||
  HAL_NVIC_SetPriority(EXTI1_IRQn, 5, 0);
 | 
			
		||||
  HAL_NVIC_EnableIRQ(EXTI1_IRQn);
 | 
			
		||||
 | 
			
		||||
  HAL_NVIC_SetPriority(EXTI2_IRQn, 5, 0);
 | 
			
		||||
  HAL_NVIC_EnableIRQ(EXTI2_IRQn);
 | 
			
		||||
 | 
			
		||||
  HAL_NVIC_SetPriority(EXTI9_5_IRQn, 5, 0);
 | 
			
		||||
  HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
 | 
			
		||||
 | 
			
		||||
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);
 | 
			
		||||
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 2 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 2 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										120
									
								
								firmware/targets/f3/Src/i2c.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								firmware/targets/f3/Src/i2c.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : I2C.c
 | 
			
		||||
  * Description        : This file provides code for the configuration
 | 
			
		||||
  *                      of the I2C instances.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "i2c.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
I2C_HandleTypeDef hi2c1;
 | 
			
		||||
 | 
			
		||||
/* I2C1 init function */
 | 
			
		||||
void MX_I2C1_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  hi2c1.Instance = I2C1;
 | 
			
		||||
  hi2c1.Init.Timing = 0x10707DBC;
 | 
			
		||||
  hi2c1.Init.OwnAddress1 = 0;
 | 
			
		||||
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
 | 
			
		||||
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
 | 
			
		||||
  hi2c1.Init.OwnAddress2 = 0;
 | 
			
		||||
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
 | 
			
		||||
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
 | 
			
		||||
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
 | 
			
		||||
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /** Configure Analogue filter
 | 
			
		||||
  */
 | 
			
		||||
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /** Configure Digital filter
 | 
			
		||||
  */
 | 
			
		||||
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
  if(i2cHandle->Instance==I2C1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN I2C1_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C1_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOA_CLK_ENABLE();
 | 
			
		||||
    /**I2C1 GPIO Configuration
 | 
			
		||||
    PA9     ------> I2C1_SCL
 | 
			
		||||
    PA10     ------> I2C1_SDA
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = I2C_SCL_Pin|I2C_SDA_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_PULLUP;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
 | 
			
		||||
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
    /* I2C1 clock enable */
 | 
			
		||||
    __HAL_RCC_I2C1_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN I2C1_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C1_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  if(i2cHandle->Instance==I2C1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN I2C1_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C1_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_I2C1_CLK_DISABLE();
 | 
			
		||||
 | 
			
		||||
    /**I2C1 GPIO Configuration
 | 
			
		||||
    PA9     ------> I2C1_SCL
 | 
			
		||||
    PA10     ------> I2C1_SDA
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(I2C_SCL_GPIO_Port, I2C_SCL_Pin);
 | 
			
		||||
 | 
			
		||||
    HAL_GPIO_DeInit(I2C_SDA_GPIO_Port, I2C_SDA_Pin);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN I2C1_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C1_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										272
									
								
								firmware/targets/f3/Src/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								firmware/targets/f3/Src/main.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,272 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file           : main.c
 | 
			
		||||
  * @brief          : Main program body
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "main.h"
 | 
			
		||||
#include "cmsis_os.h"
 | 
			
		||||
#include "adc.h"
 | 
			
		||||
#include "comp.h"
 | 
			
		||||
#include "i2c.h"
 | 
			
		||||
#include "rf.h"
 | 
			
		||||
#include "rtc.h"
 | 
			
		||||
#include "spi.h"
 | 
			
		||||
#include "tim.h"
 | 
			
		||||
#include "usart.h"
 | 
			
		||||
#include "usb_device.h"
 | 
			
		||||
#include "gpio.h"
 | 
			
		||||
 | 
			
		||||
/* Private includes ----------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN Includes */
 | 
			
		||||
#include "fatfs/fatfs.h"
 | 
			
		||||
#include "api-hal.h"
 | 
			
		||||
/* USER CODE END Includes */
 | 
			
		||||
 | 
			
		||||
/* Private typedef -----------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PTD */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PTD */
 | 
			
		||||
 | 
			
		||||
/* Private define ------------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PD */
 | 
			
		||||
/* USER CODE END PD */
 | 
			
		||||
 | 
			
		||||
/* Private macro -------------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PM */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PM */
 | 
			
		||||
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PV */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PV */
 | 
			
		||||
 | 
			
		||||
/* Private function prototypes -----------------------------------------------*/
 | 
			
		||||
void SystemClock_Config(void);
 | 
			
		||||
void MX_FREERTOS_Init(void);
 | 
			
		||||
/* USER CODE BEGIN PFP */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PFP */
 | 
			
		||||
 | 
			
		||||
/* Private user code ---------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  The application entry point.
 | 
			
		||||
  * @retval int
 | 
			
		||||
  */
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
  /* MCU Configuration--------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 | 
			
		||||
  HAL_Init();
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN Init */
 | 
			
		||||
  /* USER CODE END Init */
 | 
			
		||||
 | 
			
		||||
  /* Configure the system clock */
 | 
			
		||||
  SystemClock_Config();
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN SysInit */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SysInit */
 | 
			
		||||
 | 
			
		||||
  /* Initialize all configured peripherals */
 | 
			
		||||
  MX_GPIO_Init();
 | 
			
		||||
  MX_ADC1_Init();
 | 
			
		||||
  MX_I2C1_Init();
 | 
			
		||||
  MX_RTC_Init();
 | 
			
		||||
  MX_SPI1_Init();
 | 
			
		||||
  MX_SPI2_Init();
 | 
			
		||||
  MX_USART1_UART_Init();
 | 
			
		||||
  MX_USB_Device_Init();
 | 
			
		||||
  MX_TIM1_Init();
 | 
			
		||||
  MX_TIM2_Init();
 | 
			
		||||
  MX_TIM16_Init();
 | 
			
		||||
  MX_COMP1_Init();
 | 
			
		||||
  MX_RF_Init();
 | 
			
		||||
  /* USER CODE BEGIN 2 */
 | 
			
		||||
  MX_FATFS_Init();
 | 
			
		||||
  delay_us_init_DWT();
 | 
			
		||||
  /* USER CODE END 2 */
 | 
			
		||||
 | 
			
		||||
  /* Init scheduler */
 | 
			
		||||
  osKernelInitialize();  /* Call init function for freertos objects (in freertos.c) */
 | 
			
		||||
  MX_FREERTOS_Init();
 | 
			
		||||
  /* Start scheduler */
 | 
			
		||||
  osKernelStart();
 | 
			
		||||
 | 
			
		||||
  /* We should never get here as control is now taken by the scheduler */
 | 
			
		||||
  /* Infinite loop */
 | 
			
		||||
  /* USER CODE BEGIN WHILE */
 | 
			
		||||
  while (1)
 | 
			
		||||
  {
 | 
			
		||||
    /* USER CODE END WHILE */
 | 
			
		||||
 | 
			
		||||
    /* USER CODE BEGIN 3 */
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE END 3 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief System Clock Configuration
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void SystemClock_Config(void)
 | 
			
		||||
{
 | 
			
		||||
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 | 
			
		||||
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 | 
			
		||||
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
 | 
			
		||||
 | 
			
		||||
  /** Configure LSE Drive Capability
 | 
			
		||||
  */
 | 
			
		||||
  HAL_PWR_EnableBkUpAccess();
 | 
			
		||||
  __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
 | 
			
		||||
  /** Configure the main internal regulator output voltage
 | 
			
		||||
  */
 | 
			
		||||
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
 | 
			
		||||
  /** Initializes the RCC Oscillators according to the specified parameters
 | 
			
		||||
  * in the RCC_OscInitTypeDef structure.
 | 
			
		||||
  */
 | 
			
		||||
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
 | 
			
		||||
                              |RCC_OSCILLATORTYPE_LSE;
 | 
			
		||||
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 | 
			
		||||
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
 | 
			
		||||
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 | 
			
		||||
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLN = 8;
 | 
			
		||||
  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();
 | 
			
		||||
  }
 | 
			
		||||
  /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
 | 
			
		||||
  */
 | 
			
		||||
  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_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_3) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /** Initializes the peripherals clocks
 | 
			
		||||
  */
 | 
			
		||||
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
 | 
			
		||||
                              |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
 | 
			
		||||
                              |RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_USB
 | 
			
		||||
                              |RCC_PERIPHCLK_ADC;
 | 
			
		||||
  PeriphClkInitStruct.PLLSAI1.PLLN = 6;
 | 
			
		||||
  PeriphClkInitStruct.PLLSAI1.PLLP = RCC_PLLP_DIV2;
 | 
			
		||||
  PeriphClkInitStruct.PLLSAI1.PLLQ = RCC_PLLQ_DIV2;
 | 
			
		||||
  PeriphClkInitStruct.PLLSAI1.PLLR = RCC_PLLR_DIV2;
 | 
			
		||||
  PeriphClkInitStruct.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_USBCLK|RCC_PLLSAI1_ADCCLK;
 | 
			
		||||
  PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
 | 
			
		||||
  PeriphClkInitStruct.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
 | 
			
		||||
  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1;
 | 
			
		||||
  PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1;
 | 
			
		||||
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
 | 
			
		||||
  PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_HSE_DIV1024;
 | 
			
		||||
  PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
 | 
			
		||||
  PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE0;
 | 
			
		||||
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN Smps */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END Smps */
 | 
			
		||||
  /** Enables the Clock Security System
 | 
			
		||||
  */
 | 
			
		||||
  HAL_RCC_EnableCSS();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 4 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 4 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Period elapsed callback in non blocking mode
 | 
			
		||||
  * @note   This function is called  when TIM17 interrupt took place, inside
 | 
			
		||||
  * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
 | 
			
		||||
  * a global variable "uwTick" used as application time base.
 | 
			
		||||
  * @param  htim : TIM handle
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN Callback 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END Callback 0 */
 | 
			
		||||
  if (htim->Instance == TIM17) {
 | 
			
		||||
    HAL_IncTick();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN Callback 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END Callback 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  This function is executed in case of error occurrence.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void Error_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN Error_Handler_Debug */
 | 
			
		||||
  /* User can add his own implementation to report the HAL error return state */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END Error_Handler_Debug */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef  USE_FULL_ASSERT
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Reports the name of the source file and the source line number
 | 
			
		||||
  *         where the assert_param error has occurred.
 | 
			
		||||
  * @param  file: pointer to the source file name
 | 
			
		||||
  * @param  line: assert_param error line source number
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void assert_failed(uint8_t *file, uint32_t line)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN 6 */
 | 
			
		||||
  /* User can add his own implementation to report the file name and line number,
 | 
			
		||||
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
 | 
			
		||||
  /* USER CODE END 6 */
 | 
			
		||||
}
 | 
			
		||||
#endif /* USE_FULL_ASSERT */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										37
									
								
								firmware/targets/f3/Src/rf.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								firmware/targets/f3/Src/rf.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : RF.c
 | 
			
		||||
  * Description        : This file provides code for the configuration
 | 
			
		||||
  *                      of the RF instances.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "rf.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
/* RF init function */
 | 
			
		||||
void MX_RF_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										116
									
								
								firmware/targets/f3/Src/rtc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								firmware/targets/f3/Src/rtc.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : RTC.c
 | 
			
		||||
  * Description        : This file provides code for the configuration
 | 
			
		||||
  *                      of the RTC instances.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "rtc.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
RTC_HandleTypeDef hrtc;
 | 
			
		||||
 | 
			
		||||
/* RTC init function */
 | 
			
		||||
void MX_RTC_Init(void)
 | 
			
		||||
{
 | 
			
		||||
  RTC_TimeTypeDef sTime = {0};
 | 
			
		||||
  RTC_DateTypeDef sDate = {0};
 | 
			
		||||
 | 
			
		||||
  /** Initialize RTC Only
 | 
			
		||||
  */
 | 
			
		||||
  hrtc.Instance = RTC;
 | 
			
		||||
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
 | 
			
		||||
  hrtc.Init.AsynchPrediv = 127;
 | 
			
		||||
  hrtc.Init.SynchPrediv = 255;
 | 
			
		||||
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
 | 
			
		||||
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
 | 
			
		||||
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
 | 
			
		||||
  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
 | 
			
		||||
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN Check_RTC_BKUP */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END Check_RTC_BKUP */
 | 
			
		||||
 | 
			
		||||
  /** Initialize RTC and set the Time and Date
 | 
			
		||||
  */
 | 
			
		||||
  sTime.Hours = 0x0;
 | 
			
		||||
  sTime.Minutes = 0x0;
 | 
			
		||||
  sTime.Seconds = 0x0;
 | 
			
		||||
  sTime.SubSeconds = 0x0;
 | 
			
		||||
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
 | 
			
		||||
  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
 | 
			
		||||
  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sDate.WeekDay = RTC_WEEKDAY_MONDAY;
 | 
			
		||||
  sDate.Month = RTC_MONTH_JANUARY;
 | 
			
		||||
  sDate.Date = 0x1;
 | 
			
		||||
  sDate.Year = 0x0;
 | 
			
		||||
 | 
			
		||||
  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  if(rtcHandle->Instance==RTC)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN RTC_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END RTC_MspInit 0 */
 | 
			
		||||
    /* RTC clock enable */
 | 
			
		||||
    __HAL_RCC_RTC_ENABLE();
 | 
			
		||||
    __HAL_RCC_RTCAPB_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN RTC_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END RTC_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  if(rtcHandle->Instance==RTC)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN RTC_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END RTC_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_RTC_DISABLE();
 | 
			
		||||
    __HAL_RCC_RTCAPB_CLK_DISABLE();
 | 
			
		||||
  /* USER CODE BEGIN RTC_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END RTC_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										290
									
								
								firmware/targets/f3/Src/spi.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										290
									
								
								firmware/targets/f3/Src/spi.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,290 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : SPI.c
 | 
			
		||||
  * Description        : This file provides code for the configuration
 | 
			
		||||
  *                      of the SPI instances.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "spi.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
SPI_HandleTypeDef hspi1;
 | 
			
		||||
SPI_HandleTypeDef hspi2;
 | 
			
		||||
 | 
			
		||||
/* SPI1 init function */
 | 
			
		||||
void MX_SPI1_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  hspi1.Instance = SPI1;
 | 
			
		||||
  hspi1.Init.Mode = SPI_MODE_MASTER;
 | 
			
		||||
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
 | 
			
		||||
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
 | 
			
		||||
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
 | 
			
		||||
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
 | 
			
		||||
  hspi1.Init.NSS = SPI_NSS_SOFT;
 | 
			
		||||
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
 | 
			
		||||
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
 | 
			
		||||
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
 | 
			
		||||
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 | 
			
		||||
  hspi1.Init.CRCPolynomial = 7;
 | 
			
		||||
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
 | 
			
		||||
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
 | 
			
		||||
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/* SPI2 init function */
 | 
			
		||||
void MX_SPI2_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  hspi2.Instance = SPI2;
 | 
			
		||||
  hspi2.Init.Mode = SPI_MODE_MASTER;
 | 
			
		||||
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
 | 
			
		||||
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
 | 
			
		||||
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
 | 
			
		||||
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
 | 
			
		||||
  hspi2.Init.NSS = SPI_NSS_SOFT;
 | 
			
		||||
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
 | 
			
		||||
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
 | 
			
		||||
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
 | 
			
		||||
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 | 
			
		||||
  hspi2.Init.CRCPolynomial = 7;
 | 
			
		||||
  hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
 | 
			
		||||
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
 | 
			
		||||
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
  if(spiHandle->Instance==SPI1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN SPI1_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI1_MspInit 0 */
 | 
			
		||||
    /* SPI1 clock enable */
 | 
			
		||||
    __HAL_RCC_SPI1_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**SPI1 GPIO Configuration
 | 
			
		||||
    PB3     ------> SPI1_SCK
 | 
			
		||||
    PB4     ------> SPI1_MISO
 | 
			
		||||
    PB5     ------> SPI1_MOSI
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = SPI_R_SCK_Pin|SPI_R_MISO_Pin|SPI_R_MOSI_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
 | 
			
		||||
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN SPI1_MspInit 1 */
 | 
			
		||||
  
 | 
			
		||||
  // SD Card need faster spi gpio
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | 
			
		||||
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI1_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(spiHandle->Instance==SPI2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN SPI2_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI2_MspInit 0 */
 | 
			
		||||
    /* SPI2 clock enable */
 | 
			
		||||
    __HAL_RCC_SPI2_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    __HAL_RCC_GPIOD_CLK_ENABLE();
 | 
			
		||||
    /**SPI2 GPIO Configuration
 | 
			
		||||
    PB15     ------> SPI2_MOSI
 | 
			
		||||
    PD1     ------> SPI2_SCK
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = SPI_D_MOSI_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
 | 
			
		||||
    HAL_GPIO_Init(SPI_D_MOSI_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
    GPIO_InitStruct.Pin = SPI_D_SCK_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
 | 
			
		||||
    HAL_GPIO_Init(SPI_D_SCK_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN SPI2_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI2_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  if(spiHandle->Instance==SPI1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN SPI1_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI1_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_SPI1_CLK_DISABLE();
 | 
			
		||||
 | 
			
		||||
    /**SPI1 GPIO Configuration
 | 
			
		||||
    PB3     ------> SPI1_SCK
 | 
			
		||||
    PB4     ------> SPI1_MISO
 | 
			
		||||
    PB5     ------> SPI1_MOSI
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(GPIOB, SPI_R_SCK_Pin|SPI_R_MISO_Pin|SPI_R_MOSI_Pin);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN SPI1_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI1_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(spiHandle->Instance==SPI2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN SPI2_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI2_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_SPI2_CLK_DISABLE();
 | 
			
		||||
 | 
			
		||||
    /**SPI2 GPIO Configuration
 | 
			
		||||
    PB15     ------> SPI2_MOSI
 | 
			
		||||
    PD1     ------> SPI2_SCK
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(SPI_D_MOSI_GPIO_Port, SPI_D_MOSI_Pin);
 | 
			
		||||
 | 
			
		||||
    HAL_GPIO_DeInit(SPI_D_SCK_GPIO_Port, SPI_D_SCK_Pin);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN SPI2_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI2_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
void NFC_SPI_Reconfigure() {
 | 
			
		||||
  if (HAL_SPI_DeInit(&SPI_R) != HAL_OK) {
 | 
			
		||||
      Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  SPI_R.Init.Mode = SPI_MODE_MASTER;
 | 
			
		||||
  SPI_R.Init.Direction = SPI_DIRECTION_2LINES;
 | 
			
		||||
  SPI_R.Init.DataSize = SPI_DATASIZE_8BIT;
 | 
			
		||||
  SPI_R.Init.CLKPolarity = SPI_POLARITY_LOW;
 | 
			
		||||
  SPI_R.Init.CLKPhase = SPI_PHASE_2EDGE;
 | 
			
		||||
  SPI_R.Init.NSS = SPI_NSS_SOFT;
 | 
			
		||||
  SPI_R.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 8mhz, 10mhz is max
 | 
			
		||||
  SPI_R.Init.FirstBit = SPI_FIRSTBIT_MSB;
 | 
			
		||||
  SPI_R.Init.TIMode = SPI_TIMODE_DISABLE;
 | 
			
		||||
  SPI_R.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 | 
			
		||||
  SPI_R.Init.CRCPolynomial = 7;
 | 
			
		||||
  SPI_R.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
 | 
			
		||||
  SPI_R.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
 | 
			
		||||
 | 
			
		||||
  if (HAL_SPI_Init(&SPI_R) != HAL_OK) {
 | 
			
		||||
      Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SD_SPI_Reconfigure_Slow(void) {
 | 
			
		||||
  if (HAL_SPI_DeInit(&SPI_SD_HANDLE) != HAL_OK) {
 | 
			
		||||
      Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER;
 | 
			
		||||
  SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES;
 | 
			
		||||
  SPI_SD_HANDLE.Init.DataSize = SPI_DATASIZE_8BIT;
 | 
			
		||||
  SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW;
 | 
			
		||||
  SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE;
 | 
			
		||||
  SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT;
 | 
			
		||||
  SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
 | 
			
		||||
  SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB;
 | 
			
		||||
  SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE;
 | 
			
		||||
  SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 | 
			
		||||
  SPI_SD_HANDLE.Init.CRCPolynomial = 7;
 | 
			
		||||
  SPI_SD_HANDLE.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
 | 
			
		||||
  SPI_SD_HANDLE.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
 | 
			
		||||
 | 
			
		||||
  if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) {
 | 
			
		||||
      Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SD_SPI_Reconfigure_Fast(void) {
 | 
			
		||||
  if(HAL_SPI_DeInit(&SPI_SD_HANDLE) != HAL_OK) {
 | 
			
		||||
        Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER;
 | 
			
		||||
  SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES;
 | 
			
		||||
  SPI_SD_HANDLE.Init.DataSize = SPI_DATASIZE_8BIT;
 | 
			
		||||
  SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW;
 | 
			
		||||
  SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE;
 | 
			
		||||
  SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT;
 | 
			
		||||
  SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
 | 
			
		||||
  SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB;
 | 
			
		||||
  SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE;
 | 
			
		||||
  SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 | 
			
		||||
  SPI_SD_HANDLE.Init.CRCPolynomial = 7;
 | 
			
		||||
  SPI_SD_HANDLE.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
 | 
			
		||||
  SPI_SD_HANDLE.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
 | 
			
		||||
 | 
			
		||||
  if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) {
 | 
			
		||||
      Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CC1101_SPI_Reconfigure(void) {
 | 
			
		||||
  if(HAL_SPI_DeInit(&SPI_R) != HAL_OK) {
 | 
			
		||||
      Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  SPI_R.Init.Mode = SPI_MODE_MASTER;
 | 
			
		||||
  SPI_R.Init.Direction = SPI_DIRECTION_2LINES;
 | 
			
		||||
  SPI_R.Init.DataSize = SPI_DATASIZE_8BIT;
 | 
			
		||||
  SPI_R.Init.CLKPolarity = SPI_POLARITY_LOW;
 | 
			
		||||
  SPI_R.Init.CLKPhase = SPI_PHASE_1EDGE;
 | 
			
		||||
  SPI_R.Init.NSS = SPI_NSS_SOFT;
 | 
			
		||||
  SPI_R.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
 | 
			
		||||
  SPI_R.Init.FirstBit = SPI_FIRSTBIT_MSB;
 | 
			
		||||
  SPI_R.Init.TIMode = SPI_TIMODE_DISABLE;
 | 
			
		||||
  SPI_R.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 | 
			
		||||
  SPI_R.Init.CRCPolynomial = 7;
 | 
			
		||||
  SPI_R.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
 | 
			
		||||
  SPI_R.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
 | 
			
		||||
 | 
			
		||||
  if(HAL_SPI_Init(&SPI_R) != HAL_OK) {
 | 
			
		||||
      Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										88
									
								
								firmware/targets/f3/Src/stm32wbxx_hal_msp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								firmware/targets/f3/Src/stm32wbxx_hal_msp.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : stm32wbxx_hal_msp.c
 | 
			
		||||
  * Description        : This file provides code for the MSP Initialization
 | 
			
		||||
  *                      and de-Initialization codes.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "main.h"
 | 
			
		||||
/* USER CODE BEGIN Includes */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Includes */
 | 
			
		||||
 | 
			
		||||
/* Private typedef -----------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN TD */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END TD */
 | 
			
		||||
 | 
			
		||||
/* Private define ------------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN Define */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Define */
 | 
			
		||||
 | 
			
		||||
/* Private macro -------------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN Macro */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Macro */
 | 
			
		||||
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PV */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PV */
 | 
			
		||||
 | 
			
		||||
/* Private function prototypes -----------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PFP */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PFP */
 | 
			
		||||
 | 
			
		||||
/* External functions --------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN ExternalFunctions */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END ExternalFunctions */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
/**
 | 
			
		||||
  * Initializes the Global MSP.
 | 
			
		||||
  */
 | 
			
		||||
void HAL_MspInit(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  __HAL_RCC_HSEM_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
  /* System interrupt init*/
 | 
			
		||||
 | 
			
		||||
  /* Peripheral interrupt init */
 | 
			
		||||
  /* HSEM_IRQn interrupt configuration */
 | 
			
		||||
  HAL_NVIC_SetPriority(HSEM_IRQn, 5, 0);
 | 
			
		||||
  HAL_NVIC_EnableIRQ(HSEM_IRQn);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END MspInit 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										112
									
								
								firmware/targets/f3/Src/stm32wbxx_hal_timebase_tim.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								firmware/targets/f3/Src/stm32wbxx_hal_timebase_tim.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,112 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file    stm32wbxx_hal_timebase_TIM.c
 | 
			
		||||
  * @brief   HAL time base based on the hardware TIM.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "stm32wbxx_hal.h"
 | 
			
		||||
#include "stm32wbxx_hal_tim.h"
 | 
			
		||||
 | 
			
		||||
/* Private typedef -----------------------------------------------------------*/
 | 
			
		||||
/* Private define ------------------------------------------------------------*/
 | 
			
		||||
/* Private macro -------------------------------------------------------------*/
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
TIM_HandleTypeDef        htim17;
 | 
			
		||||
/* Private function prototypes -----------------------------------------------*/
 | 
			
		||||
/* Private functions ---------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  This function configures the TIM17 as a time base source.
 | 
			
		||||
  *         The time source is configured  to have 1ms time base with a dedicated
 | 
			
		||||
  *         Tick interrupt priority.
 | 
			
		||||
  * @note   This function is called  automatically at the beginning of program after
 | 
			
		||||
  *         reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
 | 
			
		||||
  * @param  TickPriority: Tick interrupt priority.
 | 
			
		||||
  * @retval HAL status
 | 
			
		||||
  */
 | 
			
		||||
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
 | 
			
		||||
{
 | 
			
		||||
  RCC_ClkInitTypeDef    clkconfig;
 | 
			
		||||
  uint32_t              uwTimclock = 0;
 | 
			
		||||
  uint32_t              uwPrescalerValue = 0;
 | 
			
		||||
  uint32_t              pFLatency;
 | 
			
		||||
  /*Configure the TIM17 IRQ priority */
 | 
			
		||||
  HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, TickPriority ,0);
 | 
			
		||||
 | 
			
		||||
  /* Enable the TIM17 global Interrupt */
 | 
			
		||||
  HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM17_IRQn);
 | 
			
		||||
  /* Enable TIM17 clock */
 | 
			
		||||
  __HAL_RCC_TIM17_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
  /* Get clock configuration */
 | 
			
		||||
  HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
 | 
			
		||||
 | 
			
		||||
  /* Compute TIM17 clock */
 | 
			
		||||
  uwTimclock = HAL_RCC_GetPCLK2Freq();
 | 
			
		||||
 | 
			
		||||
  /* Compute the prescaler value to have TIM17 counter clock equal to 1MHz */
 | 
			
		||||
  uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1);
 | 
			
		||||
 | 
			
		||||
  /* Initialize TIM17 */
 | 
			
		||||
  htim17.Instance = TIM17;
 | 
			
		||||
 | 
			
		||||
  /* Initialize TIMx peripheral as follow:
 | 
			
		||||
  + Period = [(TIM17CLK/1000) - 1]. to have a (1/1000) s time base.
 | 
			
		||||
  + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
 | 
			
		||||
  + ClockDivision = 0
 | 
			
		||||
  + Counter direction = Up
 | 
			
		||||
  */
 | 
			
		||||
  htim17.Init.Period = (1000000 / 1000) - 1;
 | 
			
		||||
  htim17.Init.Prescaler = uwPrescalerValue;
 | 
			
		||||
  htim17.Init.ClockDivision = 0;
 | 
			
		||||
  htim17.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  if(HAL_TIM_Base_Init(&htim17) == HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    /* Start the TIM time Base generation in interrupt mode */
 | 
			
		||||
    return HAL_TIM_Base_Start_IT(&htim17);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Return function status */
 | 
			
		||||
  return HAL_ERROR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Suspend Tick increment.
 | 
			
		||||
  * @note   Disable the tick increment by disabling TIM17 update interrupt.
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void HAL_SuspendTick(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Disable TIM17 update Interrupt */
 | 
			
		||||
  __HAL_TIM_DISABLE_IT(&htim17, TIM_IT_UPDATE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Resume Tick increment.
 | 
			
		||||
  * @note   Enable the tick increment by Enabling TIM17 update interrupt.
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void HAL_ResumeTick(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Enable TIM17 Update interrupt */
 | 
			
		||||
  __HAL_TIM_ENABLE_IT(&htim17, TIM_IT_UPDATE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										286
									
								
								firmware/targets/f3/Src/stm32wbxx_it.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										286
									
								
								firmware/targets/f3/Src/stm32wbxx_it.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,286 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file    stm32wbxx_it.c
 | 
			
		||||
  * @brief   Interrupt Service Routines.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "main.h"
 | 
			
		||||
#include "stm32wbxx_it.h"
 | 
			
		||||
/* Private includes ----------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN Includes */
 | 
			
		||||
/* USER CODE END Includes */
 | 
			
		||||
 | 
			
		||||
/* Private typedef -----------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN TD */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END TD */
 | 
			
		||||
 | 
			
		||||
/* Private define ------------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PD */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PD */
 | 
			
		||||
 | 
			
		||||
/* Private macro -------------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PM */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PM */
 | 
			
		||||
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PV */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PV */
 | 
			
		||||
 | 
			
		||||
/* Private function prototypes -----------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PFP */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PFP */
 | 
			
		||||
 | 
			
		||||
/* Private user code ---------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
/* External variables --------------------------------------------------------*/
 | 
			
		||||
extern PCD_HandleTypeDef hpcd_USB_FS;
 | 
			
		||||
extern TIM_HandleTypeDef htim1;
 | 
			
		||||
extern TIM_HandleTypeDef htim2;
 | 
			
		||||
extern TIM_HandleTypeDef htim17;
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN EV */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END EV */
 | 
			
		||||
 | 
			
		||||
/******************************************************************************/
 | 
			
		||||
/*           Cortex Processor Interruption and Exception Handlers          */
 | 
			
		||||
/******************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles Non maskable interrupt.
 | 
			
		||||
  */
 | 
			
		||||
void NMI_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END NonMaskableInt_IRQn 0 */
 | 
			
		||||
  HAL_RCC_NMI_IRQHandler();
 | 
			
		||||
  /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END NonMaskableInt_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles Hard fault interrupt.
 | 
			
		||||
  */
 | 
			
		||||
void HardFault_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HardFault_IRQn 0 */
 | 
			
		||||
  if ((*(volatile uint32_t *)CoreDebug_BASE) & (1 << 0)) {
 | 
			
		||||
    __asm("bkpt 1");
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE END HardFault_IRQn 0 */
 | 
			
		||||
  while (1)
 | 
			
		||||
  {
 | 
			
		||||
    /* USER CODE BEGIN W1_HardFault_IRQn 0 */
 | 
			
		||||
    /* USER CODE END W1_HardFault_IRQn 0 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles Memory management fault.
 | 
			
		||||
  */
 | 
			
		||||
void MemManage_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN MemoryManagement_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END MemoryManagement_IRQn 0 */
 | 
			
		||||
  while (1)
 | 
			
		||||
  {
 | 
			
		||||
    /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
 | 
			
		||||
    /* USER CODE END W1_MemoryManagement_IRQn 0 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles Prefetch fault, memory access fault.
 | 
			
		||||
  */
 | 
			
		||||
void BusFault_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN BusFault_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END BusFault_IRQn 0 */
 | 
			
		||||
  while (1)
 | 
			
		||||
  {
 | 
			
		||||
    /* USER CODE BEGIN W1_BusFault_IRQn 0 */
 | 
			
		||||
    /* USER CODE END W1_BusFault_IRQn 0 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles Undefined instruction or illegal state.
 | 
			
		||||
  */
 | 
			
		||||
void UsageFault_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN UsageFault_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END UsageFault_IRQn 0 */
 | 
			
		||||
  while (1)
 | 
			
		||||
  {
 | 
			
		||||
    /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
 | 
			
		||||
    /* USER CODE END W1_UsageFault_IRQn 0 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles Debug monitor.
 | 
			
		||||
  */
 | 
			
		||||
void DebugMon_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN DebugMonitor_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END DebugMonitor_IRQn 0 */
 | 
			
		||||
  /* USER CODE BEGIN DebugMonitor_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END DebugMonitor_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/******************************************************************************/
 | 
			
		||||
/* STM32WBxx Peripheral Interrupt Handlers                                    */
 | 
			
		||||
/* Add here the Interrupt Handlers for the used peripherals.                  */
 | 
			
		||||
/* For the available peripheral interrupt handler names,                      */
 | 
			
		||||
/* please refer to the startup file (startup_stm32wbxx.s).                    */
 | 
			
		||||
/******************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles EXTI line1 interrupt.
 | 
			
		||||
  */
 | 
			
		||||
void EXTI1_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN EXTI1_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END EXTI1_IRQn 0 */
 | 
			
		||||
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
 | 
			
		||||
  /* USER CODE BEGIN EXTI1_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END EXTI1_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles EXTI line2 interrupt.
 | 
			
		||||
  */
 | 
			
		||||
void EXTI2_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN EXTI2_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END EXTI2_IRQn 0 */
 | 
			
		||||
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
 | 
			
		||||
  /* USER CODE BEGIN EXTI2_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END EXTI2_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles USB low priority interrupt, USB wake-up interrupt through EXTI line 28.
 | 
			
		||||
  */
 | 
			
		||||
void USB_LP_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN USB_LP_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USB_LP_IRQn 0 */
 | 
			
		||||
  HAL_PCD_IRQHandler(&hpcd_USB_FS);
 | 
			
		||||
  /* USER CODE BEGIN USB_LP_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USB_LP_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles EXTI line[9:5] interrupts.
 | 
			
		||||
  */
 | 
			
		||||
void EXTI9_5_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN EXTI9_5_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END EXTI9_5_IRQn 0 */
 | 
			
		||||
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
 | 
			
		||||
  /* USER CODE BEGIN EXTI9_5_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END EXTI9_5_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles TIM1 trigger and commutation interrupts and TIM17 global interrupt.
 | 
			
		||||
  */
 | 
			
		||||
void TIM1_TRG_COM_TIM17_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_TRG_COM_TIM17_IRQn 0 */
 | 
			
		||||
  HAL_TIM_IRQHandler(&htim1);
 | 
			
		||||
  HAL_TIM_IRQHandler(&htim17);
 | 
			
		||||
  /* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_TRG_COM_TIM17_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles TIM2 global interrupt.
 | 
			
		||||
  */
 | 
			
		||||
void TIM2_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN TIM2_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM2_IRQn 0 */
 | 
			
		||||
  HAL_TIM_IRQHandler(&htim2);
 | 
			
		||||
  /* USER CODE BEGIN TIM2_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM2_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles EXTI line[15:10] interrupts.
 | 
			
		||||
  */
 | 
			
		||||
void EXTI15_10_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END EXTI15_10_IRQn 0 */
 | 
			
		||||
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
 | 
			
		||||
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
 | 
			
		||||
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
 | 
			
		||||
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
 | 
			
		||||
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END EXTI15_10_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief This function handles HSEM global interrupt.
 | 
			
		||||
  */
 | 
			
		||||
void HSEM_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HSEM_IRQn 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HSEM_IRQn 0 */
 | 
			
		||||
  HAL_HSEM_IRQHandler();
 | 
			
		||||
  /* USER CODE BEGIN HSEM_IRQn 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HSEM_IRQn 1 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										357
									
								
								firmware/targets/f3/Src/system_stm32wbxx.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										357
									
								
								firmware/targets/f3/Src/system_stm32wbxx.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,357 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file    system_stm32wbxx.c
 | 
			
		||||
  * @author  MCD Application Team
 | 
			
		||||
  * @brief   CMSIS Cortex Device Peripheral Access Layer System Source File
 | 
			
		||||
  *
 | 
			
		||||
  *   This file provides two functions and one global variable to be called from
 | 
			
		||||
  *   user application:
 | 
			
		||||
  *      - SystemInit(): This function is called at startup just after reset and
 | 
			
		||||
  *                      before branch to main program. This call is made inside
 | 
			
		||||
  *                      the "startup_stm32wbxx.s" file.
 | 
			
		||||
  *
 | 
			
		||||
  *      - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
 | 
			
		||||
  *                                  by the user application to setup the SysTick
 | 
			
		||||
  *                                  timer or configure other parameters.
 | 
			
		||||
  *
 | 
			
		||||
  *      - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
 | 
			
		||||
  *                                 be called whenever the core clock is changed
 | 
			
		||||
  *                                 during program execution.
 | 
			
		||||
  *
 | 
			
		||||
  *   After each device reset the MSI (4 MHz) is used as system clock source.
 | 
			
		||||
  *   Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
 | 
			
		||||
  *   configure the system clock before to branch to main program.
 | 
			
		||||
  *
 | 
			
		||||
  *   This file configures the system clock as follows:
 | 
			
		||||
  *=============================================================================
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        System Clock source                    | MSI
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        SYSCLK(Hz)                             | 4000000
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        HCLK(Hz)                               | 4000000
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        AHB Prescaler                          | 1
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        APB1 Prescaler                         | 1
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        APB2 Prescaler                         | 1
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        PLL_M                                  | 1
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        PLL_N                                  | 8
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        PLL_P                                  | 7
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        PLL_Q                                  | 2
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        PLL_R                                  | 2
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        PLLSAI1_P                              | NA
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        PLLSAI1_Q                              | NA
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        PLLSAI1_R                              | NA
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *        Require 48MHz for USB OTG FS,          | Disabled
 | 
			
		||||
  *        SDIO and RNG clock                     |
 | 
			
		||||
  *-----------------------------------------------------------------------------
 | 
			
		||||
  *=============================================================================
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2019 STMicroelectronics. 
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under BSD 3-Clause license,
 | 
			
		||||
  * the "License"; You may not use this file except in compliance with the 
 | 
			
		||||
  * License. You may obtain a copy of the License at:
 | 
			
		||||
  *                        opensource.org/licenses/BSD-3-Clause
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup CMSIS
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup stm32WBxx_system
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup stm32WBxx_System_Private_Includes
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
#include "stm32wbxx.h"
 | 
			
		||||
 | 
			
		||||
#if !defined  (HSE_VALUE)
 | 
			
		||||
  #define HSE_VALUE    (32000000UL) /*!< Value of the External oscillator in Hz */
 | 
			
		||||
#endif /* HSE_VALUE */
 | 
			
		||||
 | 
			
		||||
#if !defined  (MSI_VALUE)
 | 
			
		||||
   #define MSI_VALUE    (4000000UL) /*!< Value of the Internal oscillator in Hz*/
 | 
			
		||||
#endif /* MSI_VALUE */
 | 
			
		||||
 | 
			
		||||
#if !defined  (HSI_VALUE)
 | 
			
		||||
  #define HSI_VALUE    (16000000UL) /*!< Value of the Internal oscillator in Hz*/
 | 
			
		||||
#endif /* HSI_VALUE */
 | 
			
		||||
 | 
			
		||||
#if !defined  (LSI_VALUE) 
 | 
			
		||||
 #define LSI_VALUE  (32000UL)       /*!< Value of LSI in Hz*/
 | 
			
		||||
#endif /* LSI_VALUE */ 
 | 
			
		||||
 | 
			
		||||
#if !defined  (LSE_VALUE)
 | 
			
		||||
  #define LSE_VALUE    (32768UL)    /*!< Value of LSE in Hz*/
 | 
			
		||||
#endif /* LSE_VALUE */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32WBxx_System_Private_Defines
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/*!< Uncomment the following line if you need to relocate your vector Table in
 | 
			
		||||
     Internal SRAM. */
 | 
			
		||||
/* #define VECT_TAB_SRAM */
 | 
			
		||||
#define VECT_TAB_OFFSET         OS_OFFSET            /*!< Vector Table base offset field.
 | 
			
		||||
                                                     This value must be a multiple of 0x200. */
 | 
			
		||||
 | 
			
		||||
#define VECT_TAB_BASE_ADDRESS   SRAM1_BASE       /*!< Vector Table base offset field.
 | 
			
		||||
                                                     This value must be a multiple of 0x200. */
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32WBxx_System_Private_Macros
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32WBxx_System_Private_Variables
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
  /* The SystemCoreClock variable is updated in three ways:
 | 
			
		||||
      1) by calling CMSIS function SystemCoreClockUpdate()
 | 
			
		||||
      2) by calling HAL API function HAL_RCC_GetHCLKFreq()
 | 
			
		||||
      3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
 | 
			
		||||
         Note: If you use this function to configure the system clock; then there
 | 
			
		||||
               is no need to call the 2 first functions listed above, since SystemCoreClock
 | 
			
		||||
               variable is updated automatically.
 | 
			
		||||
  */
 | 
			
		||||
  uint32_t SystemCoreClock  = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
 | 
			
		||||
 | 
			
		||||
  const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
 | 
			
		||||
 | 
			
		||||
  const uint32_t APBPrescTable[8UL]  = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
 | 
			
		||||
 | 
			
		||||
  const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
 | 
			
		||||
                                      4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
 | 
			
		||||
 | 
			
		||||
#if defined(STM32WB55xx) || defined(STM32WB5Mxx) || defined(STM32WB35xx)
 | 
			
		||||
  const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
 | 
			
		||||
                                        {2UL,6UL,4UL,3UL,2UL,4UL}, \
 | 
			
		||||
                                        {4UL,12UL,8UL,6UL,4UL,8UL}, \
 | 
			
		||||
                                        {4UL,12UL,8UL,6UL,4UL,8UL}};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32WBxx_System_Private_Functions
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Setup the microcontroller system.
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void SystemInit(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Configure the Vector Table location add offset address ------------------*/
 | 
			
		||||
#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)  
 | 
			
		||||
  /* program in SRAMx */
 | 
			
		||||
  SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET;  /* Vector Table Relocation in Internal SRAMx for CPU1 */
 | 
			
		||||
#else    /* program in FLASH */
 | 
			
		||||
  SCB->VTOR = VECT_TAB_OFFSET;              /* Vector Table Relocation in Internal FLASH */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* FPU settings ------------------------------------------------------------*/
 | 
			
		||||
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
 | 
			
		||||
    SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL)));  /* set CP10 and CP11 Full Access */
 | 
			
		||||
  #endif
 | 
			
		||||
  
 | 
			
		||||
  /* Reset the RCC clock configuration to the default reset state ------------*/
 | 
			
		||||
  /* Set MSION bit */
 | 
			
		||||
  RCC->CR |= RCC_CR_MSION;
 | 
			
		||||
 | 
			
		||||
  /* Reset CFGR register */
 | 
			
		||||
  RCC->CFGR = 0x00070000U;
 | 
			
		||||
 | 
			
		||||
  /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
 | 
			
		||||
  RCC->CR &= (uint32_t)0xFAF6FEFBU;
 | 
			
		||||
 | 
			
		||||
  /*!< Reset LSI1 and LSI2 bits */
 | 
			
		||||
  RCC->CSR &= (uint32_t)0xFFFFFFFAU;
 | 
			
		||||
  
 | 
			
		||||
  /*!< Reset HSI48ON  bit */
 | 
			
		||||
  RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
 | 
			
		||||
    
 | 
			
		||||
  /* Reset PLLCFGR register */
 | 
			
		||||
  RCC->PLLCFGR = 0x22041000U;
 | 
			
		||||
 | 
			
		||||
#if defined(STM32WB55xx) || defined(STM32WB5Mxx)
 | 
			
		||||
  /* Reset PLLSAI1CFGR register */
 | 
			
		||||
  RCC->PLLSAI1CFGR = 0x22041000U;
 | 
			
		||||
#endif
 | 
			
		||||
  
 | 
			
		||||
  /* Reset HSEBYP bit */
 | 
			
		||||
  RCC->CR &= 0xFFFBFFFFU;
 | 
			
		||||
 | 
			
		||||
  /* Disable all interrupts */
 | 
			
		||||
  RCC->CIER = 0x00000000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Update SystemCoreClock variable according to Clock Register Values.
 | 
			
		||||
  *         The SystemCoreClock variable contains the core clock (HCLK), it can
 | 
			
		||||
  *         be used by the user application to setup the SysTick timer or configure
 | 
			
		||||
  *         other parameters.
 | 
			
		||||
  *
 | 
			
		||||
  * @note   Each time the core clock (HCLK) changes, this function must be called
 | 
			
		||||
  *         to update SystemCoreClock variable value. Otherwise, any configuration
 | 
			
		||||
  *         based on this variable will be incorrect.
 | 
			
		||||
  *
 | 
			
		||||
  * @note   - The system frequency computed by this function is not the real
 | 
			
		||||
  *           frequency in the chip. It is calculated based on the predefined
 | 
			
		||||
  *           constant and the selected clock source:
 | 
			
		||||
  *
 | 
			
		||||
  *           - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
 | 
			
		||||
  *
 | 
			
		||||
  *           - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
 | 
			
		||||
  *
 | 
			
		||||
  *           - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
 | 
			
		||||
  *
 | 
			
		||||
  *           - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
 | 
			
		||||
  *             or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
 | 
			
		||||
  *
 | 
			
		||||
  *         (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
 | 
			
		||||
  *             4 MHz) but the real value may vary depending on the variations
 | 
			
		||||
  *             in voltage and temperature.
 | 
			
		||||
  *
 | 
			
		||||
  *         (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
 | 
			
		||||
  *              16 MHz) but the real value may vary depending on the variations
 | 
			
		||||
  *              in voltage and temperature.
 | 
			
		||||
  *
 | 
			
		||||
  *         (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
 | 
			
		||||
  *              32 MHz), user has to ensure that HSE_VALUE is same as the real
 | 
			
		||||
  *              frequency of the crystal used. Otherwise, this function may
 | 
			
		||||
  *              have wrong result.
 | 
			
		||||
  *
 | 
			
		||||
  *         - The result of this function could be not correct when using fractional
 | 
			
		||||
  *           value for HSE crystal.
 | 
			
		||||
  *
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void SystemCoreClockUpdate(void)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
 | 
			
		||||
 | 
			
		||||
  /* Get MSI Range frequency--------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
  /*MSI frequency range in Hz*/
 | 
			
		||||
  msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
 | 
			
		||||
 | 
			
		||||
  /* Get SYSCLK source -------------------------------------------------------*/
 | 
			
		||||
  switch (RCC->CFGR & RCC_CFGR_SWS)
 | 
			
		||||
  {
 | 
			
		||||
    case 0x00:   /* MSI used as system clock source */
 | 
			
		||||
      SystemCoreClock = msirange;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case 0x04:  /* HSI used as system clock source */
 | 
			
		||||
      /* HSI used as system clock source */
 | 
			
		||||
        SystemCoreClock = HSI_VALUE;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case 0x08:  /* HSE used as system clock source */
 | 
			
		||||
      SystemCoreClock = HSE_VALUE;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case 0x0C: /* PLL used as system clock  source */
 | 
			
		||||
      /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
 | 
			
		||||
         SYSCLK = PLL_VCO / PLLR
 | 
			
		||||
         */
 | 
			
		||||
      pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
 | 
			
		||||
      pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
 | 
			
		||||
 | 
			
		||||
      if(pllsource == 0x02UL) /* HSI used as PLL clock source */
 | 
			
		||||
      {
 | 
			
		||||
        pllvco = (HSI_VALUE / pllm);
 | 
			
		||||
      }
 | 
			
		||||
      else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
 | 
			
		||||
      {
 | 
			
		||||
        pllvco = (HSE_VALUE / pllm);
 | 
			
		||||
      }
 | 
			
		||||
      else /* MSI used as PLL clock source */
 | 
			
		||||
      {
 | 
			
		||||
        pllvco = (msirange / pllm);
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
      pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
 | 
			
		||||
      pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
 | 
			
		||||
      
 | 
			
		||||
      SystemCoreClock = pllvco/pllr;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      SystemCoreClock = msirange;
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  /* Compute HCLK clock frequency --------------------------------------------*/
 | 
			
		||||
  /* Get HCLK1 prescaler */
 | 
			
		||||
  tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
 | 
			
		||||
  /* HCLK clock frequency */
 | 
			
		||||
  SystemCoreClock = SystemCoreClock / tmp;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										361
									
								
								firmware/targets/f3/Src/tim.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										361
									
								
								firmware/targets/f3/Src/tim.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,361 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : TIM.c
 | 
			
		||||
  * Description        : This file provides code for the configuration
 | 
			
		||||
  *                      of the TIM instances.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "tim.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
TIM_HandleTypeDef htim1;
 | 
			
		||||
TIM_HandleTypeDef htim2;
 | 
			
		||||
TIM_HandleTypeDef htim16;
 | 
			
		||||
 | 
			
		||||
/* TIM1 init function */
 | 
			
		||||
void MX_TIM1_Init(void)
 | 
			
		||||
{
 | 
			
		||||
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
 | 
			
		||||
  TIM_MasterConfigTypeDef sMasterConfig = {0};
 | 
			
		||||
  TIM_OC_InitTypeDef sConfigOC = {0};
 | 
			
		||||
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
 | 
			
		||||
 | 
			
		||||
  htim1.Instance = TIM1;
 | 
			
		||||
  htim1.Init.Prescaler = 0;
 | 
			
		||||
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim1.Init.Period = 65535;
 | 
			
		||||
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim1.Init.RepetitionCounter = 0;
 | 
			
		||||
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
 | 
			
		||||
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 | 
			
		||||
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
 | 
			
		||||
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sConfigOC.OCMode = TIM_OCMODE_TIMING;
 | 
			
		||||
  sConfigOC.Pulse = 0;
 | 
			
		||||
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 | 
			
		||||
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
 | 
			
		||||
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
 | 
			
		||||
  if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
 | 
			
		||||
  sBreakDeadTimeConfig.DeadTime = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakFilter = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;
 | 
			
		||||
  sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
 | 
			
		||||
  sBreakDeadTimeConfig.Break2Filter = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;
 | 
			
		||||
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  HAL_TIM_MspPostInit(&htim1);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/* TIM2 init function */
 | 
			
		||||
void MX_TIM2_Init(void)
 | 
			
		||||
{
 | 
			
		||||
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
 | 
			
		||||
  TIM_MasterConfigTypeDef sMasterConfig = {0};
 | 
			
		||||
  TIM_IC_InitTypeDef sConfigIC = {0};
 | 
			
		||||
 | 
			
		||||
  htim2.Instance = TIM2;
 | 
			
		||||
  htim2.Init.Prescaler = 64-1;
 | 
			
		||||
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim2.Init.Period = 4294967295;
 | 
			
		||||
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
 | 
			
		||||
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
 | 
			
		||||
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_TIM_IC_Init(&htim2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 | 
			
		||||
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
 | 
			
		||||
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
 | 
			
		||||
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
 | 
			
		||||
  sConfigIC.ICFilter = 0;
 | 
			
		||||
  if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
 | 
			
		||||
  sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
 | 
			
		||||
  if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/* TIM16 init function */
 | 
			
		||||
void MX_TIM16_Init(void)
 | 
			
		||||
{
 | 
			
		||||
  TIM_OC_InitTypeDef sConfigOC = {0};
 | 
			
		||||
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
 | 
			
		||||
 | 
			
		||||
  htim16.Instance = TIM16;
 | 
			
		||||
  htim16.Init.Prescaler = 500 - 1;
 | 
			
		||||
  htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim16.Init.Period = 291;
 | 
			
		||||
  htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim16.Init.RepetitionCounter = 0;
 | 
			
		||||
  htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_Base_Init(&htim16) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_TIM_PWM_Init(&htim16) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
 | 
			
		||||
  sConfigOC.Pulse = 145;
 | 
			
		||||
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 | 
			
		||||
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
 | 
			
		||||
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim16, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
 | 
			
		||||
  sBreakDeadTimeConfig.DeadTime = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakFilter = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim16, &sBreakDeadTimeConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  HAL_TIM_MspPostInit(&htim16);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
  if(tim_baseHandle->Instance==TIM1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspInit 0 */
 | 
			
		||||
    /* TIM1 clock enable */
 | 
			
		||||
    __HAL_RCC_TIM1_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
    /* TIM1 interrupt Init */
 | 
			
		||||
    HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, 0, 0);
 | 
			
		||||
    HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM17_IRQn);
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(tim_baseHandle->Instance==TIM2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM2_MspInit 0 */
 | 
			
		||||
    /* TIM2 clock enable */
 | 
			
		||||
    __HAL_RCC_TIM2_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOA_CLK_ENABLE();
 | 
			
		||||
    /**TIM2 GPIO Configuration
 | 
			
		||||
    PA0     ------> TIM2_CH1
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = IR_RX_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
 | 
			
		||||
    HAL_GPIO_Init(IR_RX_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
    /* TIM2 interrupt Init */
 | 
			
		||||
    HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
 | 
			
		||||
    HAL_NVIC_EnableIRQ(TIM2_IRQn);
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM2_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(tim_baseHandle->Instance==TIM16)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM16_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM16_MspInit 0 */
 | 
			
		||||
    /* TIM16 clock enable */
 | 
			
		||||
    __HAL_RCC_TIM16_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM16_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM16_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
  if(timHandle->Instance==TIM1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspPostInit 0 */
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**TIM1 GPIO Configuration
 | 
			
		||||
    PB9     ------> TIM1_CH3N
 | 
			
		||||
    PB13     ------> TIM1_CH1N
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = IR_TX_Pin|RFID_OUT_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
 | 
			
		||||
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspPostInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspPostInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(timHandle->Instance==TIM16)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM16_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM16_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**TIM16 GPIO Configuration
 | 
			
		||||
    PB8     ------> TIM16_CH1
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = SPEAKER_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF14_TIM16;
 | 
			
		||||
    HAL_GPIO_Init(SPEAKER_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM16_MspPostInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM16_MspPostInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  if(tim_baseHandle->Instance==TIM1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_TIM1_CLK_DISABLE();
 | 
			
		||||
 | 
			
		||||
    /* TIM1 interrupt Deinit */
 | 
			
		||||
    HAL_NVIC_DisableIRQ(TIM1_TRG_COM_TIM17_IRQn);
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(tim_baseHandle->Instance==TIM2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM2_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_TIM2_CLK_DISABLE();
 | 
			
		||||
 | 
			
		||||
    /**TIM2 GPIO Configuration
 | 
			
		||||
    PA0     ------> TIM2_CH1
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(IR_RX_GPIO_Port, IR_RX_Pin);
 | 
			
		||||
 | 
			
		||||
    /* TIM2 interrupt Deinit */
 | 
			
		||||
    HAL_NVIC_DisableIRQ(TIM2_IRQn);
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM2_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(tim_baseHandle->Instance==TIM16)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM16_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM16_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_TIM16_CLK_DISABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM16_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM16_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										121
									
								
								firmware/targets/f3/Src/usart.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								firmware/targets/f3/Src/usart.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,121 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * File Name          : USART.c
 | 
			
		||||
  * Description        : This file provides code for the configuration
 | 
			
		||||
  *                      of the USART instances.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "usart.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
UART_HandleTypeDef huart1;
 | 
			
		||||
 | 
			
		||||
/* USART1 init function */
 | 
			
		||||
 | 
			
		||||
void MX_USART1_UART_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  huart1.Instance = USART1;
 | 
			
		||||
  huart1.Init.BaudRate = 115200;
 | 
			
		||||
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
 | 
			
		||||
  huart1.Init.StopBits = UART_STOPBITS_1;
 | 
			
		||||
  huart1.Init.Parity = UART_PARITY_NONE;
 | 
			
		||||
  huart1.Init.Mode = UART_MODE_TX_RX;
 | 
			
		||||
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 | 
			
		||||
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
 | 
			
		||||
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
 | 
			
		||||
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
 | 
			
		||||
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
 | 
			
		||||
  if (HAL_UART_Init(&huart1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
  if(uartHandle->Instance==USART1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN USART1_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_MspInit 0 */
 | 
			
		||||
    /* USART1 clock enable */
 | 
			
		||||
    __HAL_RCC_USART1_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**USART1 GPIO Configuration
 | 
			
		||||
    PB6     ------> USART1_TX
 | 
			
		||||
    PB7     ------> USART1_RX
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
 | 
			
		||||
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN USART1_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  if(uartHandle->Instance==USART1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN USART1_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_USART1_CLK_DISABLE();
 | 
			
		||||
 | 
			
		||||
    /**USART1 GPIO Configuration
 | 
			
		||||
    PB6     ------> USART1_TX
 | 
			
		||||
    PB7     ------> USART1_RX
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN USART1_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										99
									
								
								firmware/targets/f3/Src/usb_device.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								firmware/targets/f3/Src/usb_device.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file           : usb_device.c
 | 
			
		||||
  * @version        : v3.0_Cube
 | 
			
		||||
  * @brief          : This file implements the USB Device
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "usb_device.h"
 | 
			
		||||
#include "usbd_core.h"
 | 
			
		||||
#include "usbd_desc.h"
 | 
			
		||||
#include "usbd_cdc.h"
 | 
			
		||||
#include "usbd_cdc_if.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN Includes */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Includes */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PV */
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PV */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PFP */
 | 
			
		||||
/* Private function prototypes -----------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PFP */
 | 
			
		||||
 | 
			
		||||
extern void Error_Handler(void);
 | 
			
		||||
/* USB Device Core handle declaration. */
 | 
			
		||||
USBD_HandleTypeDef hUsbDeviceFS;
 | 
			
		||||
extern USBD_DescriptorsTypeDef CDC_Desc;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * -- Insert your variables declaration here --
 | 
			
		||||
 */
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * -- Insert your external function declaration here --
 | 
			
		||||
 */
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * Init USB device Library, add supported class and start the library
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void MX_USB_Device_Init(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN USB_Device_Init_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USB_Device_Init_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* Init Device Library, add supported class and start the library. */
 | 
			
		||||
  if (USBD_Init(&hUsbDeviceFS, &CDC_Desc, DEVICE_FS) != USBD_OK) {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC) != USBD_OK) {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS) != USBD_OK) {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (USBD_Start(&hUsbDeviceFS) != USBD_OK) {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN USB_Device_Init_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USB_Device_Init_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										331
									
								
								firmware/targets/f3/Src/usbd_cdc_if.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										331
									
								
								firmware/targets/f3/Src/usbd_cdc_if.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,331 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file           : usbd_cdc_if.c
 | 
			
		||||
  * @version        : v3.0_Cube
 | 
			
		||||
  * @brief          : Usb device for Virtual Com Port.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "usbd_cdc_if.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN INCLUDE */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END INCLUDE */
 | 
			
		||||
 | 
			
		||||
/* Private typedef -----------------------------------------------------------*/
 | 
			
		||||
/* Private define ------------------------------------------------------------*/
 | 
			
		||||
/* Private macro -------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PV */
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PV */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
 | 
			
		||||
  * @brief Usb device library.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup USBD_CDC_IF
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
 | 
			
		||||
  * @brief Private types.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PRIVATE_TYPES */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PRIVATE_TYPES */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
 | 
			
		||||
  * @brief Private defines.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PRIVATE_DEFINES */
 | 
			
		||||
/* USER CODE END PRIVATE_DEFINES */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
 | 
			
		||||
  * @brief Private macros.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PRIVATE_MACRO */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PRIVATE_MACRO */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
 | 
			
		||||
  * @brief Private variables.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
/* Create buffer for reception and transmission           */
 | 
			
		||||
/* It's up to user to redefine and/or remove those define */
 | 
			
		||||
/** Received data over USB are stored in this buffer      */
 | 
			
		||||
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
 | 
			
		||||
 | 
			
		||||
/** Data to send over USB CDC are stored in this buffer   */
 | 
			
		||||
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PRIVATE_VARIABLES */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PRIVATE_VARIABLES */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
 | 
			
		||||
  * @brief Public variables.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
extern USBD_HandleTypeDef hUsbDeviceFS;
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN EXPORTED_VARIABLES */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END EXPORTED_VARIABLES */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
 | 
			
		||||
  * @brief Private functions declaration.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
static int8_t CDC_Init_FS(void);
 | 
			
		||||
static int8_t CDC_DeInit_FS(void);
 | 
			
		||||
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
 | 
			
		||||
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 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
 | 
			
		||||
{
 | 
			
		||||
  CDC_Init_FS,
 | 
			
		||||
  CDC_DeInit_FS,
 | 
			
		||||
  CDC_Control_FS,
 | 
			
		||||
  CDC_Receive_FS,
 | 
			
		||||
  CDC_TransmitCplt_FS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Private functions ---------------------------------------------------------*/
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Initializes the CDC media low layer over the FS USB IP
 | 
			
		||||
  * @retval USBD_OK if all operations are OK else USBD_FAIL
 | 
			
		||||
  */
 | 
			
		||||
static int8_t CDC_Init_FS(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN 3 */
 | 
			
		||||
  /* Set Application Buffers */
 | 
			
		||||
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
 | 
			
		||||
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
 | 
			
		||||
  return (USBD_OK);
 | 
			
		||||
  /* USER CODE END 3 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  DeInitializes the CDC media low layer
 | 
			
		||||
  * @retval USBD_OK if all operations are OK else USBD_FAIL
 | 
			
		||||
  */
 | 
			
		||||
static int8_t CDC_DeInit_FS(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN 4 */
 | 
			
		||||
  return (USBD_OK);
 | 
			
		||||
  /* USER CODE END 4 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Manage the CDC class requests
 | 
			
		||||
  * @param  cmd: Command code
 | 
			
		||||
  * @param  pbuf: Buffer containing command data (request parameters)
 | 
			
		||||
  * @param  length: Number of data to be sent (in bytes)
 | 
			
		||||
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
 | 
			
		||||
  */
 | 
			
		||||
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN 5 */
 | 
			
		||||
  switch(cmd)
 | 
			
		||||
  {
 | 
			
		||||
    case CDC_SEND_ENCAPSULATED_COMMAND:
 | 
			
		||||
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
    case CDC_GET_ENCAPSULATED_RESPONSE:
 | 
			
		||||
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
    case CDC_SET_COMM_FEATURE:
 | 
			
		||||
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
    case CDC_GET_COMM_FEATURE:
 | 
			
		||||
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
    case CDC_CLEAR_COMM_FEATURE:
 | 
			
		||||
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  /*******************************************************************************/
 | 
			
		||||
  /* Line Coding Structure                                                       */
 | 
			
		||||
  /*-----------------------------------------------------------------------------*/
 | 
			
		||||
  /* Offset | Field       | Size | Value  | Description                          */
 | 
			
		||||
  /* 0      | dwDTERate   |   4  | Number |Data terminal rate, in bits per second*/
 | 
			
		||||
  /* 4      | bCharFormat |   1  | Number | Stop bits                            */
 | 
			
		||||
  /*                                        0 - 1 Stop bit                       */
 | 
			
		||||
  /*                                        1 - 1.5 Stop bits                    */
 | 
			
		||||
  /*                                        2 - 2 Stop bits                      */
 | 
			
		||||
  /* 5      | bParityType |  1   | Number | Parity                               */
 | 
			
		||||
  /*                                        0 - None                             */
 | 
			
		||||
  /*                                        1 - Odd                              */
 | 
			
		||||
  /*                                        2 - Even                             */
 | 
			
		||||
  /*                                        3 - Mark                             */
 | 
			
		||||
  /*                                        4 - Space                            */
 | 
			
		||||
  /* 6      | bDataBits  |   1   | Number Data bits (5, 6, 7, 8 or 16).          */
 | 
			
		||||
  /*******************************************************************************/
 | 
			
		||||
    case CDC_SET_LINE_CODING:
 | 
			
		||||
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
    case CDC_GET_LINE_CODING:
 | 
			
		||||
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
    case CDC_SET_CONTROL_LINE_STATE:
 | 
			
		||||
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
    case CDC_SEND_BREAK:
 | 
			
		||||
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  default:
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return (USBD_OK);
 | 
			
		||||
  /* USER CODE END 5 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Data received over USB OUT endpoint are sent over CDC interface
 | 
			
		||||
  *         through this function.
 | 
			
		||||
  *
 | 
			
		||||
  *         @note
 | 
			
		||||
  *         This function will issue a NAK packet on any OUT packet received on
 | 
			
		||||
  *         USB endpoint until exiting this function. If you exit this function
 | 
			
		||||
  *         before transfer is complete on CDC interface (ie. using DMA controller)
 | 
			
		||||
  *         it will result in receiving more data while previous ones are still
 | 
			
		||||
  *         not sent.
 | 
			
		||||
  *
 | 
			
		||||
  * @param  Buf: Buffer of data to be received
 | 
			
		||||
  * @param  Len: Number of data received (in bytes)
 | 
			
		||||
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
 | 
			
		||||
  */
 | 
			
		||||
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);
 | 
			
		||||
  return (USBD_OK);
 | 
			
		||||
  /* USER CODE END 6 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  CDC_Transmit_FS
 | 
			
		||||
  *         Data to send over USB IN endpoint are sent over CDC interface
 | 
			
		||||
  *         through this function.
 | 
			
		||||
  *         @note
 | 
			
		||||
  *
 | 
			
		||||
  *
 | 
			
		||||
  * @param  Buf: Buffer of data to be sent
 | 
			
		||||
  * @param  Len: Number of data to be sent (in bytes)
 | 
			
		||||
  * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
 | 
			
		||||
  */
 | 
			
		||||
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t result = USBD_OK;
 | 
			
		||||
  /* USER CODE BEGIN 7 */
 | 
			
		||||
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
 | 
			
		||||
  if (hcdc->TxState != 0){
 | 
			
		||||
    return USBD_BUSY;
 | 
			
		||||
  }
 | 
			
		||||
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
 | 
			
		||||
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
 | 
			
		||||
  /* USER CODE END 7 */
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  CDC_TransmitCplt_FS
 | 
			
		||||
  *         Data transmited callback
 | 
			
		||||
  *
 | 
			
		||||
  *         @note
 | 
			
		||||
  *         This function is IN transfer complete callback used to inform user that
 | 
			
		||||
  *         the submitted Data is successfully sent over USB.
 | 
			
		||||
  *
 | 
			
		||||
  * @param  Buf: Buffer of data to be received
 | 
			
		||||
  * @param  Len: Number of data received (in bytes)
 | 
			
		||||
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
 | 
			
		||||
  */
 | 
			
		||||
static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t result = USBD_OK;
 | 
			
		||||
  /* USER CODE BEGIN 13 */
 | 
			
		||||
  UNUSED(Buf);
 | 
			
		||||
  UNUSED(Len);
 | 
			
		||||
  UNUSED(epnum);
 | 
			
		||||
  /* USER CODE END 13 */
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										810
									
								
								firmware/targets/f3/Src/usbd_conf.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										810
									
								
								firmware/targets/f3/Src/usbd_conf.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,810 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file           : usbd_conf.c
 | 
			
		||||
  * @version        : v3.0_Cube
 | 
			
		||||
  * @brief          : This file implements the board support package for the USB device library
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "stm32wbxx.h"
 | 
			
		||||
#include "stm32wbxx_hal.h"
 | 
			
		||||
#include "usbd_def.h"
 | 
			
		||||
#include "usbd_core.h"
 | 
			
		||||
 | 
			
		||||
#include "usbd_cdc.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN Includes */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Includes */
 | 
			
		||||
 | 
			
		||||
/* Private typedef -----------------------------------------------------------*/
 | 
			
		||||
/* Private define ------------------------------------------------------------*/
 | 
			
		||||
/* Private macro -------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PV */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PV */
 | 
			
		||||
 | 
			
		||||
PCD_HandleTypeDef hpcd_USB_FS;
 | 
			
		||||
void Error_Handler(void);
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
/* Exported function prototypes ----------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PFP */
 | 
			
		||||
/* Private function prototypes -----------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PFP */
 | 
			
		||||
 | 
			
		||||
/* Private functions ---------------------------------------------------------*/
 | 
			
		||||
static USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status);
 | 
			
		||||
/* USER CODE BEGIN 1 */
 | 
			
		||||
static void SystemClockConfig_Resume(void);
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 1 */
 | 
			
		||||
extern void SystemClock_Config(void);
 | 
			
		||||
 | 
			
		||||
/*******************************************************************************
 | 
			
		||||
                       LL Driver Callbacks (PCD -> USB Device Library)
 | 
			
		||||
*******************************************************************************/
 | 
			
		||||
/* MSP Init */
 | 
			
		||||
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACK == 1U)
 | 
			
		||||
static void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACK */
 | 
			
		||||
{
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
  if(pcdHandle->Instance==USB)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN USB_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USB_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOA_CLK_ENABLE();
 | 
			
		||||
    /**USB GPIO Configuration
 | 
			
		||||
    PA11     ------> USB_DM
 | 
			
		||||
    PA12     ------> USB_DP
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF10_USB;
 | 
			
		||||
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
    /* Peripheral clock enable */
 | 
			
		||||
    __HAL_RCC_USB_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
    /* Peripheral interrupt init */
 | 
			
		||||
    HAL_NVIC_SetPriority(USB_LP_IRQn, 5, 0);
 | 
			
		||||
    HAL_NVIC_EnableIRQ(USB_LP_IRQn);
 | 
			
		||||
  /* USER CODE BEGIN USB_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USB_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACK == 1U)
 | 
			
		||||
static void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACK */
 | 
			
		||||
{
 | 
			
		||||
  if(pcdHandle->Instance==USB)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN USB_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USB_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_USB_CLK_DISABLE();
 | 
			
		||||
 | 
			
		||||
    /**USB GPIO Configuration
 | 
			
		||||
    PA11     ------> USB_DM
 | 
			
		||||
    PA12     ------> USB_DP
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);
 | 
			
		||||
 | 
			
		||||
    /* Peripheral interrupt Deinit*/
 | 
			
		||||
    HAL_NVIC_DisableIRQ(USB_LP_IRQn);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN USB_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USB_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Setup stage callback
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_SetupStageCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END  HAL_PCD_SetupStageCallback_PreTreatment */
 | 
			
		||||
  USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup);
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_SetupStageCallback_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END  HAL_PCD_SetupStageCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Data Out stage callback.
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @param  epnum: Endpoint number
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_DataOutStageCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_DataOutStageCallback_PreTreatment */
 | 
			
		||||
  USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff);
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_DataOutStageCallback_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_DataOutStageCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Data In stage callback.
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @param  epnum: Endpoint number
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_DataInStageCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_DataInStageCallback_PreTreatment */
 | 
			
		||||
  USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff);
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_DataInStageCallback_PostTreatment  */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_DataInStageCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  SOF callback.
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_SOFCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_SOFCallback_PreTreatment */
 | 
			
		||||
  USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData);
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_SOFCallback_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_SOFCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Reset callback.
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_ResetCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_ResetCallback_PreTreatment */
 | 
			
		||||
  USBD_SpeedTypeDef speed = USBD_SPEED_FULL;
 | 
			
		||||
 | 
			
		||||
  if ( hpcd->Init.speed != PCD_SPEED_FULL)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
    /* Set Speed. */
 | 
			
		||||
  USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed);
 | 
			
		||||
 | 
			
		||||
  /* Reset Device. */
 | 
			
		||||
  USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData);
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_ResetCallback_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_ResetCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Suspend callback.
 | 
			
		||||
  * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it)
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_SuspendCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_SuspendCallback_PreTreatment */
 | 
			
		||||
  /* Inform USB library that core enters in suspend Mode. */
 | 
			
		||||
  USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData);
 | 
			
		||||
  /* Enter in STOP mode. */
 | 
			
		||||
  /* USER CODE BEGIN 2 */
 | 
			
		||||
  if (hpcd->Init.low_power_enable)
 | 
			
		||||
  {
 | 
			
		||||
    /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */
 | 
			
		||||
    SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE END 2 */
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_SuspendCallback_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_SuspendCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Resume callback.
 | 
			
		||||
  * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it)
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_ResumeCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_ResumeCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN 3 */
 | 
			
		||||
  if (hpcd->Init.low_power_enable)
 | 
			
		||||
  {
 | 
			
		||||
    /* Reset SLEEPDEEP bit of Cortex System Control Register. */
 | 
			
		||||
    SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
 | 
			
		||||
    SystemClockConfig_Resume();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE END 3 */
 | 
			
		||||
 | 
			
		||||
  USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData);
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_ResumeCallback_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_ResumeCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  ISOOUTIncomplete callback.
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @param  epnum: Endpoint number
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_ISOOUTIncompleteCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_ISOOUTIncompleteCallback_PreTreatment */
 | 
			
		||||
  USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum);
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_ISOOUTIncompleteCallback_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_ISOOUTIncompleteCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  ISOINIncomplete callback.
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @param  epnum: Endpoint number
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_ISOINIncompleteCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_ISOINIncompleteCallback_PreTreatment */
 | 
			
		||||
  USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum);
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_ISOINIncompleteCallback_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_ISOINIncompleteCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Connect callback.
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_ConnectCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_ConnectCallback_PreTreatment */
 | 
			
		||||
  USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData);
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_ConnectCallback_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_ConnectCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Disconnect callback.
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_DisconnectCallback_PreTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_DisconnectCallback_PreTreatment */
 | 
			
		||||
  USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData);
 | 
			
		||||
  /* USER CODE BEGIN HAL_PCD_DisconnectCallback_PostTreatment */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END HAL_PCD_DisconnectCallback_PostTreatment */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN LowLevelInterface */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END LowLevelInterface */
 | 
			
		||||
 | 
			
		||||
/*******************************************************************************
 | 
			
		||||
                       LL Driver Interface (USB Device Library --> PCD)
 | 
			
		||||
*******************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Initializes the low level portion of the device driver.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
 | 
			
		||||
{
 | 
			
		||||
  /* Init USB Ip. */
 | 
			
		||||
  hpcd_USB_FS.pData = pdev;
 | 
			
		||||
  /* Link the driver to the stack. */
 | 
			
		||||
  pdev->pData = &hpcd_USB_FS;
 | 
			
		||||
/* Enable USB power on Pwrctrl CR2 register. */
 | 
			
		||||
  HAL_PWREx_EnableVddUSB();
 | 
			
		||||
 | 
			
		||||
  hpcd_USB_FS.Instance = USB;
 | 
			
		||||
  hpcd_USB_FS.Init.dev_endpoints = 8;
 | 
			
		||||
  hpcd_USB_FS.Init.speed = PCD_SPEED_FULL;
 | 
			
		||||
  hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
 | 
			
		||||
  hpcd_USB_FS.Init.Sof_enable = DISABLE;
 | 
			
		||||
  hpcd_USB_FS.Init.low_power_enable = DISABLE;
 | 
			
		||||
  hpcd_USB_FS.Init.lpm_enable = DISABLE;
 | 
			
		||||
  hpcd_USB_FS.Init.battery_charging_enable = DISABLE;
 | 
			
		||||
 | 
			
		||||
  #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
  /* register Msp Callbacks (before the Init) */
 | 
			
		||||
  HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_MSPINIT_CB_ID, PCD_MspInit);
 | 
			
		||||
  HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_MSPDEINIT_CB_ID, PCD_MspDeInit);
 | 
			
		||||
  #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
 | 
			
		||||
  if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler( );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
  /* Register USB PCD CallBacks */
 | 
			
		||||
  HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback);
 | 
			
		||||
  HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback);
 | 
			
		||||
  HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback);
 | 
			
		||||
  HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback);
 | 
			
		||||
  HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback);
 | 
			
		||||
  HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback);
 | 
			
		||||
  HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback);
 | 
			
		||||
  /* USER CODE BEGIN RegisterCallBackFirstPart */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END RegisterCallBackFirstPart */
 | 
			
		||||
  HAL_PCD_RegisterLpmCallback(&hpcd_USB_FS, PCDEx_LPM_Callback);
 | 
			
		||||
  HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_FS, PCD_DataOutStageCallback);
 | 
			
		||||
  HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_FS, PCD_DataInStageCallback);
 | 
			
		||||
  HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_FS, PCD_ISOOUTIncompleteCallback);
 | 
			
		||||
  HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_FS, PCD_ISOINIncompleteCallback);
 | 
			
		||||
  /* USER CODE BEGIN RegisterCallBackSecondPart */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END RegisterCallBackSecondPart */
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
  /* USER CODE BEGIN EndPoint_Configuration */
 | 
			
		||||
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18);
 | 
			
		||||
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58);
 | 
			
		||||
  /* USER CODE END EndPoint_Configuration */
 | 
			
		||||
  /* USER CODE BEGIN EndPoint_Configuration_CDC */
 | 
			
		||||
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0xC0);
 | 
			
		||||
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x01 , PCD_SNG_BUF, 0x110);
 | 
			
		||||
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82 , PCD_SNG_BUF, 0x100);
 | 
			
		||||
  /* USER CODE END EndPoint_Configuration_CDC */
 | 
			
		||||
  return USBD_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  De-Initializes the low level portion of the device driver.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_DeInit(pdev->pData);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Starts the low level portion of the device driver.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_Start(pdev->pData);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Stops the low level portion of the device driver.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_Stop(pdev->pData);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Opens an endpoint of the low level driver.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @param  ep_addr: Endpoint number
 | 
			
		||||
  * @param  ep_type: Endpoint type
 | 
			
		||||
  * @param  ep_mps: Endpoint max packet size
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Closes an endpoint of the low level driver.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @param  ep_addr: Endpoint number
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Flushes an endpoint of the Low Level Driver.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @param  ep_addr: Endpoint number
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Sets a Stall condition on an endpoint of the Low Level Driver.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @param  ep_addr: Endpoint number
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Clears a Stall condition on an endpoint of the Low Level Driver.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @param  ep_addr: Endpoint number
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Returns Stall condition.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @param  ep_addr: Endpoint number
 | 
			
		||||
  * @retval Stall (1: Yes, 0: No)
 | 
			
		||||
  */
 | 
			
		||||
uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
 | 
			
		||||
{
 | 
			
		||||
  PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*) pdev->pData;
 | 
			
		||||
 | 
			
		||||
  if((ep_addr & 0x80) == 0x80)
 | 
			
		||||
  {
 | 
			
		||||
    return hpcd->IN_ep[ep_addr & 0x7F].is_stall;
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    return hpcd->OUT_ep[ep_addr & 0x7F].is_stall;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Assigns a USB address to the device.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @param  dev_addr: Device address
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Transmits data over an endpoint.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @param  ep_addr: Endpoint number
 | 
			
		||||
  * @param  pbuf: Pointer to data to be sent
 | 
			
		||||
  * @param  size: Data size
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Prepares an endpoint for reception.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @param  ep_addr: Endpoint number
 | 
			
		||||
  * @param  pbuf: Pointer to data to be received
 | 
			
		||||
  * @param  size: Data size
 | 
			
		||||
  * @retval USBD status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
  HAL_StatusTypeDef hal_status = HAL_OK;
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size);
 | 
			
		||||
 | 
			
		||||
  usb_status =  USBD_Get_USB_Status(hal_status);
 | 
			
		||||
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Returns the last transfered packet size.
 | 
			
		||||
  * @param  pdev: Device handle
 | 
			
		||||
  * @param  ep_addr: Endpoint number
 | 
			
		||||
  * @retval Recived Data Size
 | 
			
		||||
  */
 | 
			
		||||
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
 | 
			
		||||
{
 | 
			
		||||
  return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Send LPM message to user layer
 | 
			
		||||
  * @param  hpcd: PCD handle
 | 
			
		||||
  * @param  msg: LPM message
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
static void PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
 | 
			
		||||
#else
 | 
			
		||||
void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
 | 
			
		||||
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN LPM_Callback */
 | 
			
		||||
  switch (msg)
 | 
			
		||||
  {
 | 
			
		||||
  case PCD_LPM_L0_ACTIVE:
 | 
			
		||||
    if (hpcd->Init.low_power_enable)
 | 
			
		||||
    {
 | 
			
		||||
      SystemClockConfig_Resume();
 | 
			
		||||
 | 
			
		||||
      /* Reset SLEEPDEEP bit of Cortex System Control Register. */
 | 
			
		||||
      SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
 | 
			
		||||
    }
 | 
			
		||||
    USBD_LL_Resume(hpcd->pData);
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case PCD_LPM_L1_ACTIVE:
 | 
			
		||||
    USBD_LL_Suspend(hpcd->pData);
 | 
			
		||||
 | 
			
		||||
    /* Enter in STOP mode. */
 | 
			
		||||
    if (hpcd->Init.low_power_enable)
 | 
			
		||||
    {
 | 
			
		||||
      /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */
 | 
			
		||||
      SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE END LPM_Callback */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Delays routine for the USB Device Library.
 | 
			
		||||
  * @param  Delay: Delay in ms
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void USBD_LL_Delay(uint32_t Delay)
 | 
			
		||||
{
 | 
			
		||||
  HAL_Delay(Delay);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Static single allocation.
 | 
			
		||||
  * @param  size: Size of allocated memory
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void *USBD_static_malloc(uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
  static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];/* On 32-bit boundary */
 | 
			
		||||
  return mem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Dummy memory free
 | 
			
		||||
  * @param  p: Pointer to allocated  memory address
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void USBD_static_free(void *p)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 5 */
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Configures system clock after wake-up from USB resume callBack:
 | 
			
		||||
  *         enable HSI, PLL and select PLL as system clock source.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
static void SystemClockConfig_Resume(void)
 | 
			
		||||
{
 | 
			
		||||
  SystemClock_Config();
 | 
			
		||||
}
 | 
			
		||||
/* USER CODE END 5 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Retuns the USB status depending on the HAL status:
 | 
			
		||||
  * @param  hal_status: HAL status
 | 
			
		||||
  * @retval USB status
 | 
			
		||||
  */
 | 
			
		||||
USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status)
 | 
			
		||||
{
 | 
			
		||||
  USBD_StatusTypeDef usb_status = USBD_OK;
 | 
			
		||||
 | 
			
		||||
  switch (hal_status)
 | 
			
		||||
  {
 | 
			
		||||
    case HAL_OK :
 | 
			
		||||
      usb_status = USBD_OK;
 | 
			
		||||
    break;
 | 
			
		||||
    case HAL_ERROR :
 | 
			
		||||
      usb_status = USBD_FAIL;
 | 
			
		||||
    break;
 | 
			
		||||
    case HAL_BUSY :
 | 
			
		||||
      usb_status = USBD_BUSY;
 | 
			
		||||
    break;
 | 
			
		||||
    case HAL_TIMEOUT :
 | 
			
		||||
      usb_status = USBD_FAIL;
 | 
			
		||||
    break;
 | 
			
		||||
    default :
 | 
			
		||||
      usb_status = USBD_FAIL;
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  return usb_status;
 | 
			
		||||
}
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
							
								
								
									
										396
									
								
								firmware/targets/f3/Src/usbd_desc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										396
									
								
								firmware/targets/f3/Src/usbd_desc.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,396 @@
 | 
			
		||||
/* USER CODE BEGIN Header */
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file           : usbd_desc.c
 | 
			
		||||
  * @version        : v3.0_Cube
 | 
			
		||||
  * @brief          : This file implements the USB device descriptors.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© Copyright (c) 2020 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * This software component is licensed by ST under Ultimate Liberty license
 | 
			
		||||
  * SLA0044, the "License"; You may not use this file except in compliance with
 | 
			
		||||
  * the License. You may obtain a copy of the License at:
 | 
			
		||||
  *                             www.st.com/SLA0044
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
/* USER CODE END Header */
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "usbd_core.h"
 | 
			
		||||
#include "usbd_desc.h"
 | 
			
		||||
#include "usbd_conf.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN INCLUDE */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END INCLUDE */
 | 
			
		||||
 | 
			
		||||
/* Private typedef -----------------------------------------------------------*/
 | 
			
		||||
/* Private define ------------------------------------------------------------*/
 | 
			
		||||
/* Private macro -------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PV */
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PV */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup USBD_DESC
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_DESC_Private_TypesDefinitions USBD_DESC_Private_TypesDefinitions
 | 
			
		||||
  * @brief Private types.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PRIVATE_TYPES */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PRIVATE_TYPES */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines
 | 
			
		||||
  * @brief Private defines.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
#define USBD_VID     1155
 | 
			
		||||
#define USBD_LANGID_STRING     1033
 | 
			
		||||
#define USBD_MANUFACTURER_STRING     "Flipper"
 | 
			
		||||
#define USBD_PID     22336
 | 
			
		||||
#define USBD_PRODUCT_STRING     "Flipper Control Virtual ComPort"
 | 
			
		||||
#define USBD_CONFIGURATION_STRING     "CDC Config"
 | 
			
		||||
#define USBD_INTERFACE_STRING     "CDC Interface"
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PRIVATE_DEFINES */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PRIVATE_DEFINES */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_DESC_Private_Macros USBD_DESC_Private_Macros
 | 
			
		||||
  * @brief Private macros.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PRIVATE_MACRO */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PRIVATE_MACRO */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes
 | 
			
		||||
  * @brief Private functions declaration.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
static void Get_SerialNum(void);
 | 
			
		||||
static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes
 | 
			
		||||
  * @brief Private functions declaration.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
uint8_t * USBD_CDC_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | 
			
		||||
uint8_t * USBD_CDC_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | 
			
		||||
uint8_t * USBD_CDC_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | 
			
		||||
uint8_t * USBD_CDC_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | 
			
		||||
uint8_t * USBD_CDC_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | 
			
		||||
uint8_t * USBD_CDC_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | 
			
		||||
uint8_t * USBD_CDC_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables
 | 
			
		||||
  * @brief Private variables.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
USBD_DescriptorsTypeDef CDC_Desc =
 | 
			
		||||
{
 | 
			
		||||
  USBD_CDC_DeviceDescriptor,
 | 
			
		||||
  USBD_CDC_LangIDStrDescriptor,
 | 
			
		||||
  USBD_CDC_ManufacturerStrDescriptor,
 | 
			
		||||
  USBD_CDC_ProductStrDescriptor,
 | 
			
		||||
  USBD_CDC_SerialStrDescriptor,
 | 
			
		||||
  USBD_CDC_ConfigStrDescriptor,
 | 
			
		||||
  USBD_CDC_InterfaceStrDescriptor
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined ( __ICCARM__ ) /* IAR Compiler */
 | 
			
		||||
  #pragma data_alignment=4
 | 
			
		||||
#endif /* defined ( __ICCARM__ ) */
 | 
			
		||||
/** USB standard device descriptor. */
 | 
			
		||||
__ALIGN_BEGIN uint8_t USBD_CDC_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
 | 
			
		||||
{
 | 
			
		||||
  0x12,                       /*bLength */
 | 
			
		||||
  USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/
 | 
			
		||||
  0x00,                       /*bcdUSB */
 | 
			
		||||
  0x02,
 | 
			
		||||
  0x02,                       /*bDeviceClass*/
 | 
			
		||||
  0x02,                       /*bDeviceSubClass*/
 | 
			
		||||
  0x00,                       /*bDeviceProtocol*/
 | 
			
		||||
  USB_MAX_EP0_SIZE,           /*bMaxPacketSize*/
 | 
			
		||||
  LOBYTE(USBD_VID),           /*idVendor*/
 | 
			
		||||
  HIBYTE(USBD_VID),           /*idVendor*/
 | 
			
		||||
  LOBYTE(USBD_PID),           /*idProduct*/
 | 
			
		||||
  HIBYTE(USBD_PID),           /*idProduct*/
 | 
			
		||||
  0x00,                       /*bcdDevice rel. 2.00*/
 | 
			
		||||
  0x02,
 | 
			
		||||
  USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/
 | 
			
		||||
  USBD_IDX_PRODUCT_STR,       /*Index of product string*/
 | 
			
		||||
  USBD_IDX_SERIAL_STR,        /*Index of serial number string*/
 | 
			
		||||
  USBD_MAX_NUM_CONFIGURATION  /*bNumConfigurations*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* USB_DeviceDescriptor */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables
 | 
			
		||||
  * @brief Private variables.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
#if defined ( __ICCARM__ ) /* IAR Compiler */
 | 
			
		||||
  #pragma data_alignment=4
 | 
			
		||||
#endif /* defined ( __ICCARM__ ) */
 | 
			
		||||
 | 
			
		||||
/** USB lang indentifier descriptor. */
 | 
			
		||||
__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END =
 | 
			
		||||
{
 | 
			
		||||
     USB_LEN_LANGID_STR_DESC,
 | 
			
		||||
     USB_DESC_TYPE_STRING,
 | 
			
		||||
     LOBYTE(USBD_LANGID_STRING),
 | 
			
		||||
     HIBYTE(USBD_LANGID_STRING)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined ( __ICCARM__ ) /* IAR Compiler */
 | 
			
		||||
  #pragma data_alignment=4
 | 
			
		||||
#endif /* defined ( __ICCARM__ ) */
 | 
			
		||||
/* Internal string descriptor. */
 | 
			
		||||
__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
 | 
			
		||||
 | 
			
		||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
 | 
			
		||||
  #pragma data_alignment=4
 | 
			
		||||
#endif
 | 
			
		||||
__ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = {
 | 
			
		||||
  USB_SIZ_STRING_SERIAL,
 | 
			
		||||
  USB_DESC_TYPE_STRING,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup USBD_DESC_Private_Functions USBD_DESC_Private_Functions
 | 
			
		||||
  * @brief Private functions.
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Return the device descriptor
 | 
			
		||||
  * @param  speed : Current device speed
 | 
			
		||||
  * @param  length : Pointer to data length variable
 | 
			
		||||
  * @retval Pointer to descriptor buffer
 | 
			
		||||
  */
 | 
			
		||||
uint8_t * USBD_CDC_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | 
			
		||||
{
 | 
			
		||||
  UNUSED(speed);
 | 
			
		||||
  *length = sizeof(USBD_CDC_DeviceDesc);
 | 
			
		||||
  return USBD_CDC_DeviceDesc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Return the LangID string descriptor
 | 
			
		||||
  * @param  speed : Current device speed
 | 
			
		||||
  * @param  length : Pointer to data length variable
 | 
			
		||||
  * @retval Pointer to descriptor buffer
 | 
			
		||||
  */
 | 
			
		||||
uint8_t * USBD_CDC_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | 
			
		||||
{
 | 
			
		||||
  UNUSED(speed);
 | 
			
		||||
  *length = sizeof(USBD_LangIDDesc);
 | 
			
		||||
  return USBD_LangIDDesc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Return the product string descriptor
 | 
			
		||||
  * @param  speed : Current device speed
 | 
			
		||||
  * @param  length : Pointer to data length variable
 | 
			
		||||
  * @retval Pointer to descriptor buffer
 | 
			
		||||
  */
 | 
			
		||||
uint8_t * USBD_CDC_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | 
			
		||||
{
 | 
			
		||||
  if(speed == 0)
 | 
			
		||||
  {
 | 
			
		||||
    USBD_GetString((uint8_t *)USBD_PRODUCT_STRING, USBD_StrDesc, length);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    USBD_GetString((uint8_t *)USBD_PRODUCT_STRING, USBD_StrDesc, length);
 | 
			
		||||
  }
 | 
			
		||||
  return USBD_StrDesc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Return the manufacturer string descriptor
 | 
			
		||||
  * @param  speed : Current device speed
 | 
			
		||||
  * @param  length : Pointer to data length variable
 | 
			
		||||
  * @retval Pointer to descriptor buffer
 | 
			
		||||
  */
 | 
			
		||||
uint8_t * USBD_CDC_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | 
			
		||||
{
 | 
			
		||||
  UNUSED(speed);
 | 
			
		||||
  USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
 | 
			
		||||
  return USBD_StrDesc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Return the serial number string descriptor
 | 
			
		||||
  * @param  speed : Current device speed
 | 
			
		||||
  * @param  length : Pointer to data length variable
 | 
			
		||||
  * @retval Pointer to descriptor buffer
 | 
			
		||||
  */
 | 
			
		||||
uint8_t * USBD_CDC_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | 
			
		||||
{
 | 
			
		||||
  UNUSED(speed);
 | 
			
		||||
  *length = USB_SIZ_STRING_SERIAL;
 | 
			
		||||
 | 
			
		||||
  /* Update the serial number string descriptor with the data from the unique
 | 
			
		||||
   * ID */
 | 
			
		||||
  Get_SerialNum();
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN USBD_CDC_SerialStrDescriptor */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USBD_CDC_SerialStrDescriptor */
 | 
			
		||||
 | 
			
		||||
  return (uint8_t *) USBD_StringSerial;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Return the configuration string descriptor
 | 
			
		||||
  * @param  speed : Current device speed
 | 
			
		||||
  * @param  length : Pointer to data length variable
 | 
			
		||||
  * @retval Pointer to descriptor buffer
 | 
			
		||||
  */
 | 
			
		||||
uint8_t * USBD_CDC_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | 
			
		||||
{
 | 
			
		||||
  if(speed == USBD_SPEED_HIGH)
 | 
			
		||||
  {
 | 
			
		||||
    USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING, USBD_StrDesc, length);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING, USBD_StrDesc, length);
 | 
			
		||||
  }
 | 
			
		||||
  return USBD_StrDesc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Return the interface string descriptor
 | 
			
		||||
  * @param  speed : Current device speed
 | 
			
		||||
  * @param  length : Pointer to data length variable
 | 
			
		||||
  * @retval Pointer to descriptor buffer
 | 
			
		||||
  */
 | 
			
		||||
uint8_t * USBD_CDC_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | 
			
		||||
{
 | 
			
		||||
  if(speed == 0)
 | 
			
		||||
  {
 | 
			
		||||
    USBD_GetString((uint8_t *)USBD_INTERFACE_STRING, USBD_StrDesc, length);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    USBD_GetString((uint8_t *)USBD_INTERFACE_STRING, USBD_StrDesc, length);
 | 
			
		||||
  }
 | 
			
		||||
  return USBD_StrDesc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Create the serial number string descriptor
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
static void Get_SerialNum(void)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t deviceserial0, deviceserial1, deviceserial2;
 | 
			
		||||
 | 
			
		||||
  deviceserial0 = *(uint32_t *) DEVICE_ID1;
 | 
			
		||||
  deviceserial1 = *(uint32_t *) DEVICE_ID2;
 | 
			
		||||
  deviceserial2 = *(uint32_t *) DEVICE_ID3;
 | 
			
		||||
 | 
			
		||||
  deviceserial0 += deviceserial2;
 | 
			
		||||
 | 
			
		||||
  if (deviceserial0 != 0)
 | 
			
		||||
  {
 | 
			
		||||
    IntToUnicode(deviceserial0, &USBD_StringSerial[2], 8);
 | 
			
		||||
    IntToUnicode(deviceserial1, &USBD_StringSerial[18], 4);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Convert Hex 32Bits value into char
 | 
			
		||||
  * @param  value: value to convert
 | 
			
		||||
  * @param  pbuf: pointer to the buffer
 | 
			
		||||
  * @param  len: buffer length
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t idx = 0;
 | 
			
		||||
 | 
			
		||||
  for (idx = 0; idx < len; idx++)
 | 
			
		||||
  {
 | 
			
		||||
    if (((value >> 28)) < 0xA)
 | 
			
		||||
    {
 | 
			
		||||
      pbuf[2 * idx] = (value >> 28) + '0';
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      pbuf[2 * idx] = (value >> 28) + 'A' - 10;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    value = value << 4;
 | 
			
		||||
 | 
			
		||||
    pbuf[2 * idx + 1] = 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
		Reference in New Issue
	
	Block a user