mirror of
				https://github.com/aprochazka/ProfilometerProbe.git
				synced 2025-11-03 22:24:40 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			646 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			646 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* USER CODE BEGIN Header */
 | 
						|
/**
 | 
						|
 ******************************************************************************
 | 
						|
 * @file           : main.c
 | 
						|
 * @brief          : Main program body
 | 
						|
 ******************************************************************************
 | 
						|
 * @attention
 | 
						|
 *
 | 
						|
 * Copyright (c) 2023 STMicroelectronics.
 | 
						|
 * All rights reserved.
 | 
						|
 *
 | 
						|
 * This software is licensed under terms that can be found in the LICENSE file
 | 
						|
 * in the root directory of this software component.
 | 
						|
 * If no LICENSE file comes with this software, it is provided AS-IS.
 | 
						|
 *
 | 
						|
 ******************************************************************************
 | 
						|
 */
 | 
						|
/* USER CODE END Header */
 | 
						|
/* Includes ------------------------------------------------------------------*/
 | 
						|
#include "main.h"
 | 
						|
#include "images.h"
 | 
						|
/* Private includes ----------------------------------------------------------*/
 | 
						|
/* USER CODE BEGIN Includes */
 | 
						|
#include "tusb.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 ---------------------------------------------------------*/
 | 
						|
I2C_HandleTypeDef hi2c1;
 | 
						|
 | 
						|
SPI_HandleTypeDef hspi1;
 | 
						|
DMA_HandleTypeDef hdma_spi1_rx;
 | 
						|
DMA_HandleTypeDef hdma_spi1_tx;
 | 
						|
 | 
						|
UART_HandleTypeDef huart2;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
PCD_HandleTypeDef hpcd_USB_FS;
 | 
						|
 | 
						|
/* USER CODE BEGIN PV */
 | 
						|
//DAC_HandleTypeDef hdac1;
 | 
						|
 | 
						|
//TIM_HandleTypeDef htim15;
 | 
						|
 | 
						|
int SPI_Rx_Done_Flag = 0;
 | 
						|
/* USER CODE END PV */
 | 
						|
 | 
						|
/* Private function prototypes -----------------------------------------------*/
 | 
						|
void SystemClock_Config(void);
 | 
						|
static void MX_GPIO_Init(void);
 | 
						|
 | 
						|
static void MX_DMA_Init(void);
 | 
						|
static void MX_USART2_UART_Init(void);
 | 
						|
static void MX_SPI1_Init(void);
 | 
						|
static void MX_I2C1_Init(void);
 | 
						|
static void MX_USB_PCD_Init(void);
 | 
						|
/* USER CODE BEGIN PFP */
 | 
						|
 | 
						|
//static void MX_DAC1_Init(void);
 | 
						|
//static void MX_TIM15_Init(void);
 | 
						|
/* USER CODE END PFP */
 | 
						|
 | 
						|
/* Private user code ---------------------------------------------------------*/
 | 
						|
/* USER CODE BEGIN 0 */
 | 
						|
/*
 | 
						|
static unsigned frame_num = 0;
 | 
						|
static unsigned tx_busy = 0;
 | 
						|
static unsigned interval_ms = 1000 / FRAME_RATE;
 | 
						|
 | 
						|
static struct {
 | 
						|
  uint32_t       size;
 | 
						|
  uint8_t const *buffer;
 | 
						|
} const frames[] = {
 | 
						|
  {color_bar_0_jpg_len, color_bar_0_jpg},
 | 
						|
  {color_bar_1_jpg_len, color_bar_1_jpg},
 | 
						|
  {color_bar_2_jpg_len, color_bar_2_jpg},
 | 
						|
  {color_bar_3_jpg_len, color_bar_3_jpg},
 | 
						|
  {color_bar_4_jpg_len, color_bar_4_jpg},
 | 
						|
  {color_bar_5_jpg_len, color_bar_5_jpg},
 | 
						|
  {color_bar_6_jpg_len, color_bar_6_jpg},
 | 
						|
  {color_bar_7_jpg_len, color_bar_7_jpg},
 | 
						|
};
 | 
						|
 | 
						|
*/
 | 
						|
/*
 | 
						|
void cdc_task(void)
 | 
						|
{
 | 
						|
  // connected() check for DTR bit
 | 
						|
  // Most but not all terminal client set this when making connection
 | 
						|
  // if ( tud_cdc_connected() )
 | 
						|
  {
 | 
						|
 | 
						|
    // connected and there are data available
 | 
						|
    if (tud_cdc_available())
 | 
						|
    {
 | 
						|
 | 
						|
      // read data
 | 
						|
      char buf[64];
 | 
						|
      uint32_t count = tud_cdc_read(buf, sizeof(buf));
 | 
						|
      (void)count;
 | 
						|
 | 
						|
      //char buf_2[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
 | 
						|
      //uint32_t count_2 = 10;
 | 
						|
      // Echo back
 | 
						|
      // Note: Skip echo by commenting out write() and write_flush()
 | 
						|
      // for throughput test e.g
 | 
						|
      //    $ dd if=/dev/zero of=/dev/ttyACM0 count=10000
 | 
						|
      tud_cdc_write(buf, count);
 | 
						|
      //tud_cdc_n_write(10, buf_2, count_2);
 | 
						|
      tud_cdc_write_flush();
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
*/
 | 
						|
 | 
						|
uint8_t sendT[600] = {
 | 
						|
  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 | 
						|
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 | 
						|
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 | 
						|
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 | 
						|
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,
 | 
						|
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 | 
						|
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 | 
						|
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 | 
						|
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,
 | 
						|
  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,
 | 
						|
  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x92, 0x8a, 0x00,
 | 
						|
  0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,
 | 
						|
  0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,
 | 
						|
  0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,
 | 
						|
  0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,
 | 
						|
  0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,
 | 
						|
  0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,
 | 
						|
  0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00,
 | 
						|
  0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,
 | 
						|
  0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,
 | 
						|
  0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,
 | 
						|
  0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,
 | 
						|
  0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,
 | 
						|
  0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,
 | 
						|
  0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00,
 | 
						|
  0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,
 | 
						|
  0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,
 | 
						|
  0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,
 | 
						|
  0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,
 | 
						|
  0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,
 | 
						|
  0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,
 | 
						|
  0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0xff, 0xd9, 0x00,
 | 
						|
 | 
						|
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 | 
						|
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 | 
						|
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 | 
						|
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 | 
						|
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 | 
						|
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
 | 
						|
};
 | 
						|
/*
 | 
						|
 | 
						|
int currentIdx = 0;
 | 
						|
int currentImg = 0;
 | 
						|
 | 
						|
int send_CDC_Bulk(){
 | 
						|
  if(currentIdx + 10 > 530){
 | 
						|
    currentIdx = 0;
 | 
						|
    currentImg++;
 | 
						|
    currentImg %=8;
 | 
						|
  }
 | 
						|
 | 
						|
  switch(currentImg){
 | 
						|
    case 0:
 | 
						|
      tud_cdc_write(&color_bar_0_jpg[currentIdx], 10);
 | 
						|
      break;
 | 
						|
    case 1:
 | 
						|
      tud_cdc_write(&color_bar_1_jpg[currentIdx], 10);
 | 
						|
      break;
 | 
						|
    case 2:
 | 
						|
      tud_cdc_write(&color_bar_2_jpg[currentIdx], 10);
 | 
						|
      break;
 | 
						|
    case 3:
 | 
						|
      tud_cdc_write(&color_bar_3_jpg[currentIdx], 10);
 | 
						|
      break;
 | 
						|
    case 4:
 | 
						|
      tud_cdc_write(&color_bar_4_jpg[currentIdx], 10);
 | 
						|
      break;
 | 
						|
    case 5:
 | 
						|
      tud_cdc_write(&color_bar_5_jpg[currentIdx], 10);
 | 
						|
      break;
 | 
						|
    case 6:
 | 
						|
      tud_cdc_write(&color_bar_6_jpg[currentIdx], 10);
 | 
						|
      break;
 | 
						|
    case 7:
 | 
						|
      tud_cdc_write(&color_bar_7_jpg[currentIdx], 10);
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      break;
 | 
						|
  }
 | 
						|
  //tud_cdc_write(&sendT[currentIdx], 10);
 | 
						|
  tud_cdc_write_flush();
 | 
						|
  currentIdx = currentIdx + 10;
 | 
						|
  return 1;
 | 
						|
}
 | 
						|
*/
 | 
						|
 | 
						|
/* USER CODE END 0 */
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief  The application entry point.
 | 
						|
 * @retval int
 | 
						|
 */
 | 
						|
int main(void)
 | 
						|
{
 | 
						|
  /* USER CODE BEGIN 1 */
 | 
						|
  LED_On();
 | 
						|
  /* 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_DMA_Init();
 | 
						|
  MX_USART2_UART_Init();
 | 
						|
  MX_SPI1_Init();
 | 
						|
  MX_I2C1_Init();
 | 
						|
  MX_USB_PCD_Init();
 | 
						|
  /* USER CODE BEGIN 2 */
 | 
						|
  //MX_DAC1_Init();
 | 
						|
  //MX_TIM15_Init();
 | 
						|
  HAL_PWREx_EnableVddUSB();
 | 
						|
  HAL_Delay(1);
 | 
						|
  tud_init(BOARD_DEVICE_RHPORT_NUM);
 | 
						|
 | 
						|
  HAL_Delay(10);
 | 
						|
  SPI_Init(&hspi1);
 | 
						|
 | 
						|
  // Wait for power stabilization
 | 
						|
  //HAL_Delay(1000);
 | 
						|
 | 
						|
  Cam_Init(&hi2c1, &hspi1);
 | 
						|
 | 
						|
  int currentSendingIndex = 0;
 | 
						|
 | 
						|
 | 
						|
  Cam_Capture(&hspi1);
 | 
						|
 | 
						|
  uint16_t image_size = Cam_FIFO_length(&hspi1);
 | 
						|
 | 
						|
  uint8_t image_data[10000];
 | 
						|
  //memset(image_data, 0x00, image_size);
 | 
						|
 | 
						|
  Cam_Start_Burst_Read(&hspi1);
 | 
						|
 | 
						|
  HAL_SPI_Receive_DMA(&hspi1, image_data, image_size);
 | 
						|
  //HAL_SPI_Receive(&hspi1, image_data, image_size, HAL_MAX_DELAY);
 | 
						|
 | 
						|
  while (SPI_Rx_Done_Flag == 0)
 | 
						|
  {
 | 
						|
    // Wait for SPI transfer to finish
 | 
						|
  }
 | 
						|
  LED_On();
 | 
						|
 | 
						|
  CS_Off();
 | 
						|
  SPI_Rx_Done_Flag = 0;
 | 
						|
  /* USER CODE END 2 */
 | 
						|
 | 
						|
  /* Infinite loop */
 | 
						|
  /* USER CODE BEGIN WHILE */
 | 
						|
  while (1)
 | 
						|
  {
 | 
						|
    
 | 
						|
    tud_task();
 | 
						|
 | 
						|
    if(currentSendingIndex >= 9989){
 | 
						|
    //if(false){
 | 
						|
      currentSendingIndex = 0;
 | 
						|
      //free(image_data);
 | 
						|
      Cam_Capture(&hspi1);
 | 
						|
 | 
						|
 | 
						|
      image_size = Cam_FIFO_length(&hspi1);
 | 
						|
 | 
						|
      //image_data = malloc((image_size + (image_size%10)) * sizeof(uint8_t));
 | 
						|
      //memset(image_data, 0x00, image_size + (image_size%10));
 | 
						|
 | 
						|
      Cam_Start_Burst_Read(&hspi1);
 | 
						|
 | 
						|
      HAL_SPI_Receive_DMA(&hspi1, image_data, 10000);
 | 
						|
      //Debug_LED_On();
 | 
						|
 | 
						|
      while (SPI_Rx_Done_Flag == 0)
 | 
						|
      {
 | 
						|
        // Wait for SPI transfer to finish
 | 
						|
        tud_task();
 | 
						|
      }
 | 
						|
      CS_Off();
 | 
						|
      SPI_Rx_Done_Flag = 0;
 | 
						|
      if(image_size < 1){
 | 
						|
              currentSendingIndex = 10000;
 | 
						|
      } 
 | 
						|
    
 | 
						|
    }
 | 
						|
    else {
 | 
						|
      LED_On();
 | 
						|
      //tud_cdc_write("11111111\r\n", 10);
 | 
						|
      //tud_cdc_write_flush();
 | 
						|
      //tud_cdc_write(&sendT[currentSendingIndex], 10);
 | 
						|
      tud_cdc_write(&image_data[currentSendingIndex], 10);
 | 
						|
      tud_cdc_write_flush();
 | 
						|
      currentSendingIndex = currentSendingIndex + 10;
 | 
						|
      HAL_Delay(5);
 | 
						|
    }
 | 
						|
 | 
						|
    /* 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};
 | 
						|
 | 
						|
  /** Configure the main internal regulator output voltage
 | 
						|
   */
 | 
						|
  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
 | 
						|
  {
 | 
						|
    Error_Handler();
 | 
						|
  }
 | 
						|
 | 
						|
  /** Initializes the RCC Oscillators according to the specified parameters
 | 
						|
   * in the RCC_OscInitTypeDef structure.
 | 
						|
   */
 | 
						|
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSI;
 | 
						|
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 | 
						|
  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
 | 
						|
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 | 
						|
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 | 
						|
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
 | 
						|
  RCC_OscInitStruct.PLL.PLLM = 1;
 | 
						|
  RCC_OscInitStruct.PLL.PLLN = 10;
 | 
						|
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
 | 
						|
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
 | 
						|
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
 | 
						|
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 | 
						|
  {
 | 
						|
    Error_Handler();
 | 
						|
  }
 | 
						|
 | 
						|
  /** Initializes the CPU, AHB and APB buses clocks
 | 
						|
   */
 | 
						|
  RCC_ClkInitStruct.ClockType = 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;
 | 
						|
 | 
						|
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
 | 
						|
  {
 | 
						|
    Error_Handler();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief I2C1 Initialization Function
 | 
						|
 * @param None
 | 
						|
 * @retval None
 | 
						|
 */
 | 
						|
static void MX_I2C1_Init(void)
 | 
						|
{
 | 
						|
 | 
						|
  /* USER CODE BEGIN I2C1_Init 0 */
 | 
						|
 | 
						|
  /* USER CODE END I2C1_Init 0 */
 | 
						|
 | 
						|
  /* USER CODE BEGIN I2C1_Init 1 */
 | 
						|
 | 
						|
  /* USER CODE END I2C1_Init 1 */
 | 
						|
  hi2c1.Instance = I2C1;
 | 
						|
  hi2c1.Init.Timing = 0x10909CEC;
 | 
						|
  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();
 | 
						|
  }
 | 
						|
  /* USER CODE BEGIN I2C1_Init 2 */
 | 
						|
 | 
						|
  /* USER CODE END I2C1_Init 2 */
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief SPI1 Initialization Function
 | 
						|
 * @param None
 | 
						|
 * @retval None
 | 
						|
 */
 | 
						|
static void MX_SPI1_Init(void)
 | 
						|
{
 | 
						|
 | 
						|
  /* USER CODE BEGIN SPI1_Init 0 */
 | 
						|
 | 
						|
  /* USER CODE END SPI1_Init 0 */
 | 
						|
 | 
						|
  /* USER CODE BEGIN SPI1_Init 1 */
 | 
						|
 | 
						|
  /* USER CODE END SPI1_Init 1 */
 | 
						|
  /* SPI1 parameter configuration*/
 | 
						|
  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_1EDGE;
 | 
						|
  hspi1.Init.NSS = SPI_NSS_SOFT;
 | 
						|
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
 | 
						|
  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();
 | 
						|
  }
 | 
						|
  /* USER CODE BEGIN SPI1_Init 2 */
 | 
						|
 | 
						|
  /* USER CODE END SPI1_Init 2 */
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief USART2 Initialization Function
 | 
						|
 * @param None
 | 
						|
 * @retval None
 | 
						|
 */
 | 
						|
static void MX_USART2_UART_Init(void)
 | 
						|
{
 | 
						|
 | 
						|
  /* USER CODE BEGIN USART2_Init 0 */
 | 
						|
 | 
						|
  /* USER CODE END USART2_Init 0 */
 | 
						|
 | 
						|
  /* USER CODE BEGIN USART2_Init 1 */
 | 
						|
 | 
						|
  /* USER CODE END USART2_Init 1 */
 | 
						|
  huart2.Instance = USART2;
 | 
						|
  huart2.Init.BaudRate = 115200;
 | 
						|
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
 | 
						|
  huart2.Init.StopBits = UART_STOPBITS_1;
 | 
						|
  huart2.Init.Parity = UART_PARITY_NONE;
 | 
						|
  huart2.Init.Mode = UART_MODE_TX_RX;
 | 
						|
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 | 
						|
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
 | 
						|
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
 | 
						|
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
 | 
						|
  if (HAL_UART_Init(&huart2) != HAL_OK)
 | 
						|
  {
 | 
						|
    Error_Handler();
 | 
						|
  }
 | 
						|
  /* USER CODE BEGIN USART2_Init 2 */
 | 
						|
 | 
						|
  /* USER CODE END USART2_Init 2 */
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief USB Initialization Function
 | 
						|
 * @param None
 | 
						|
 * @retval None
 | 
						|
 */
 | 
						|
static void MX_USB_PCD_Init(void)
 | 
						|
{
 | 
						|
 | 
						|
  /* USER CODE BEGIN USB_Init 0 */
 | 
						|
 | 
						|
  /* USER CODE END USB_Init 0 */
 | 
						|
 | 
						|
  /* USER CODE BEGIN USB_Init 1 */
 | 
						|
 | 
						|
  /* USER CODE END USB_Init 1 */
 | 
						|
  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 (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK)
 | 
						|
  {
 | 
						|
    Error_Handler();
 | 
						|
  }
 | 
						|
  /* USER CODE BEGIN USB_Init 2 */
 | 
						|
 | 
						|
  /* USER CODE END USB_Init 2 */
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Enable DMA controller clock
 | 
						|
 */
 | 
						|
static void MX_DMA_Init(void)
 | 
						|
{
 | 
						|
 | 
						|
  /* DMA controller clock enable */
 | 
						|
  __HAL_RCC_DMA1_CLK_ENABLE();
 | 
						|
 | 
						|
  /* DMA interrupt init */
 | 
						|
  /* DMA1_Channel2_IRQn interrupt configuration */
 | 
						|
  HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
 | 
						|
  HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
 | 
						|
  /* DMA1_Channel3_IRQn interrupt configuration */
 | 
						|
  HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);
 | 
						|
  HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief GPIO Initialization Function
 | 
						|
 * @param None
 | 
						|
 * @retval None
 | 
						|
 */
 | 
						|
static void MX_GPIO_Init(void)
 | 
						|
{
 | 
						|
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
						|
 | 
						|
  /* GPIO Ports Clock Enable */
 | 
						|
  __HAL_RCC_GPIOC_CLK_ENABLE();
 | 
						|
  __HAL_RCC_GPIOA_CLK_ENABLE();
 | 
						|
  __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
						|
 | 
						|
  /*Configure GPIO pin Output Level */
 | 
						|
  HAL_GPIO_WritePin(DEBUG_LED_GPIO_Port, DEBUG_LED_Pin, GPIO_PIN_RESET);
 | 
						|
 | 
						|
  /*Configure GPIO pin Output Level */
 | 
						|
  HAL_GPIO_WritePin(GPIOB, CHIP_SELECT_Pin | LD3_Pin, GPIO_PIN_RESET);
 | 
						|
 | 
						|
  /*Configure GPIO pin : DEBUG_LED_Pin */
 | 
						|
  GPIO_InitStruct.Pin = DEBUG_LED_Pin;
 | 
						|
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
						|
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
						|
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
						|
  HAL_GPIO_Init(DEBUG_LED_GPIO_Port, &GPIO_InitStruct);
 | 
						|
 | 
						|
  /*Configure GPIO pins : CHIP_SELECT_Pin LD3_Pin */
 | 
						|
  GPIO_InitStruct.Pin = CHIP_SELECT_Pin | LD3_Pin;
 | 
						|
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
						|
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
						|
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
						|
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
						|
}
 | 
						|
 | 
						|
/* USER CODE BEGIN 4 */
 | 
						|
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
 | 
						|
{
 | 
						|
  SPI_Rx_Done_Flag = 1;
 | 
						|
}
 | 
						|
 | 
						|
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
 | 
						|
{
 | 
						|
  // do nothing here
 | 
						|
}
 | 
						|
 | 
						|
/* USER CODE END 4 */
 | 
						|
 | 
						|
/**
 | 
						|
 * @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 */
 | 
						|
  __disable_irq();
 | 
						|
  while (1)
 | 
						|
  {
 | 
						|
  }
 | 
						|
  /* 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,
 | 
						|
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
 | 
						|
  /* USER CODE END 6 */
 | 
						|
}
 | 
						|
#endif /* USE_FULL_ASSERT */
 |