2025-12-10 3:41 AM - last edited on 2025-12-10 3:43 AM by Andrew Neil
Good morning.
Could anyone tell me about this error and how to resolve it.
C:/ST/STM32CubeIDE_1.19.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.13.3 .rel1.win32_1.0.0.202411081344/tools/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/bin/ld.exe: Oscillo_STM32G431CBU.elf section `.bss' will not fit in region `RAM'
C:/ST/STM32CubeIDE_1.19.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.13.3 .rel1.win32_1.0.0.202411081344/tools/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/bin/ld.exe: region `RAM' overflowed by 54928 bytes
I'm using IDE 1.19 to compile the code for a G431CBU
Grateful
Valter Matos
Solved! Go to Solution.
2025-12-10 7:02 AM
A possibility overlooked so far: your linker script is incorrect - the definition of the 'RAM' region is too small.
So also post your linker script (the .ld file).
See the directions here.
2025-12-10 7:03 AM - edited 2025-12-10 7:04 AM
> I've attached the compressed file.
Most people don't like 1) downloading 2) unzipping 3) ... stuff.
As Andrew said, please post relevant source code:
- variable declarations
- DMA calls
Edit: maybe also your linker file, maybe there's a wrong RAM size setting.
2025-12-10 7:50 AM
2025-12-10 7:55 AM - edited 2025-12-10 7:56 AM
As stated previously there is an issue with the attachements these days:
We cannot download any of your attachments, so better to post your code using </> button.
Read How to insert source code
You need to share your linker file + the code.
2025-12-10 8:15 AM
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2025 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"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "oscilloscope.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define DAC_VREF 3.3
#define DAC_RESOLUTION 4096
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
ADC_HandleTypeDef hadc2;
DMA_HandleTypeDef hdma_adc1;
DMA_HandleTypeDef hdma_adc2;
COMP_HandleTypeDef hcomp1;
DAC_HandleTypeDef hdac1;
SPI_HandleTypeDef hspi1;
SPI_HandleTypeDef hspi2;
DMA_HandleTypeDef hdma_spi1_tx;
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim4;
UART_HandleTypeDef huart2;
/* USER CODE BEGIN PV */
volatile uint8_t SPI1_TX_completed_flag = 1;
static int conv_done = 0;
int ready_to_draw = 0;
volatile int done_drawing = 1;
volatile uint8_t comparatorTriggeredFlag;
Oscilloscope oscilloscope;
/* 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_ADC1_Init(void);
static void MX_ADC2_Init(void);
static void MX_SPI1_Init(void);
static void MX_COMP1_Init(void);
static void MX_DAC1_Init(void);
static void MX_SPI2_Init(void);
//static void MX_TIM1_Init(void);
void MX_TIM1_Init(void);
//static void MX_TIM3_Init(void);
void MX_TIM3_Init(void);
//static void MX_TIM4_Init(void);
void MX_TIM4_Init(void);
static void MX_USART2_UART_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi){
SPI1_TX_completed_flag = 1;
}
void HAL_COMP_TriggerCallback(COMP_HandleTypeDef *hcomp){
comparatorTriggeredFlag = 1;
if(conv_done & done_drawing){
conv_done = 0;
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) oscilloscope.ch1.waveform_raw_adc , MEMORY_DEPTH);
HAL_ADC_Start_DMA(&hadc2, (uint32_t*) oscilloscope.ch2.waveform_raw_adc , MEMORY_DEPTH);
ready_to_draw = 1;
done_drawing = 0;
}
//HAL_COMP_Stop(&hcomp1);
}
/**
* @brief function for printing using UART
*/
int _write(int file, char* ptr, int len){
HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, HAL_MAX_DELAY);
return len;
}
/**
* @brief convert voltage to DAC value
*/
int conv_voltage_to_DAC(float voltage){
int dac = voltage*DAC_RESOLUTION/DAC_VREF;
if(dac > DAC_RESOLUTION){
dac = DAC_RESOLUTION;
}
return (int) dac;
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim == &htim4){
if(!comparatorTriggeredFlag && !oscilloscope.stop){
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) oscilloscope.ch1.waveform_raw_adc , MEMORY_DEPTH);
HAL_ADC_Start_DMA(&hadc2, (uint32_t*) oscilloscope.ch2.waveform_raw_adc , MEMORY_DEPTH);
done_drawing = 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_DMA_Init();
MX_ADC1_Init();
MX_ADC2_Init();
MX_SPI1_Init();
MX_COMP1_Init();
MX_DAC1_Init();
MX_SPI2_Init();
MX_TIM1_Init();
MX_TIM3_Init();
MX_TIM4_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim4);
HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);
HAL_COMP_Start(&hcomp1);
//HAL_COMP_Stop(&hcomp1);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) oscilloscope.ch1.waveform_raw_adc , MEMORY_DEPTH);
HAL_ADC_Start_DMA(&hadc2, (uint32_t*) oscilloscope.ch2.waveform_raw_adc , MEMORY_DEPTH);
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, LCD_BRIGHTNESS); // 0-1000
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 200); // 0-1000
ILI9488_Init();
setRotation(1);
ILI9341_Fill_Screen(ILI9488_BLACK);
oscilloscopeInit(&oscilloscope);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
clearScreen();
drawGrid();
//__HAL_DMA_GET_COUNTER()
displayTimeBase(&oscilloscope);
drawMainMenuButton();
displayHorizontallOffset(&oscilloscope);
switch (oscilloscope.timeBase_us){
case 10:
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
break;
case 20:
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
break;
case 40:
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
break;
case 80:
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV8;
break;
case 160:
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV16;
break;
case 320:
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV32;
break;
case 640:
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV64;
break;
case 1280:
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV128;
break;
case 2560:
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV256;
break;
}
// Initialize the ADC with the configured settings
if (HAL_ADC_Init(&hadc1) != HAL_OK){
// Initialization Error
Error_Handler();
}
if(oscilloscope.stop){
HAL_COMP_Stop(&hcomp1);
}else{
HAL_COMP_Start(&hcomp1);
}
drawChannels0Vmarkers(&oscilloscope.ch1);
drawChannels0Vmarkers(&oscilloscope.ch2);
if(ready_to_draw){
if(oscilloscope.ch1.isOn)
draw_waveform(& oscilloscope.ch1, oscilloscope.timeBase_us, oscilloscope.x_offset, oscilloscope.stop);
if(oscilloscope.ch2.isOn)
draw_waveform(& oscilloscope.ch2, oscilloscope.timeBase_us, oscilloscope.x_offset, oscilloscope.stop);
ready_to_draw = 0;
done_drawing = 1;
comparatorTriggeredFlag = 0;
}
else if(oscilloscope.stop || !comparatorTriggeredFlag){
if(oscilloscope.ch1.isOn)
draw_waveform(& oscilloscope.ch1, oscilloscope.timeBase_us, oscilloscope.x_offset, oscilloscope.stop);
if(oscilloscope.ch2.isOn)
draw_waveform(& oscilloscope.ch2, oscilloscope.timeBase_us, oscilloscope.x_offset, oscilloscope.stop);
}
serveTouchScreen(&oscilloscope);
serveEncoder(&oscilloscope);
drawChanellVperDev(0, & oscilloscope.ch1);
drawChanellVperDev(110, & oscilloscope.ch2);
uint32_t sampling_frequency = 4210526/(oscilloscope.timeBase_us/10);
if(oscilloscope.ch1.isOn){
calculateFFT(&oscilloscope.ch1, sampling_frequency);
}
if(oscilloscope.ch2.isOn){
calculateFFT(&oscilloscope.ch2, sampling_frequency);
}
drawMeasurements(&oscilloscope);
drawRunStop(&oscilloscope);
drawTriggerIcon(&oscilloscope);
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, conv_voltage_to_DAC(oscilloscope.triggerLevel_mV/1000.0));
imageRender();
/*
//ILI9341_Fill_Screen(ILI9488_BLACK);
//drawImage(image, 10, 10, 200, 1);
if(conv_done){
conv_done = 0;
draw_waveform(& CH1);
//HAL_Delay(500);
sprintf(buf1,"Vpp=%d", calculate_peak_to_peak(CH1.waveform_display));
fillRect(39, 1, 35, 18, RED);
LCD_Font(5, 15, buf1, _Open_Sans_Bold_12 , 1, WHITE);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) CH1.waveform, MEMORY_DEPTH);
//HAL_Delay(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};
/** Configure the main internal regulator output voltage
*/
HAL_PWREx_ControlVoltageScaling(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_OscInitStruct.HSIState = RCC_HSI_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 = RCC_PLLM_DIV1;
RCC_OscInitStruct.PLL.PLLN = 10;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
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_2) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief ADC1 Initialization Function
* @PAram None
* @retval None
*/
static void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */
ADC_MultiModeTypeDef multimode = {0};
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.GainCompensation = 0;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure the ADC multi-mode
*/
multimode.Mode = ADC_MODE_INDEPENDENT;
if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_14;
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();
}
/* USER CODE BEGIN ADC1_Init 2 */
/* USER CODE END ADC1_Init 2 */
}
/**
* @brief ADC2 Initialization Function
* @PAram None
* @retval None
*/
static void MX_ADC2_Init(void)
{
/* USER CODE BEGIN ADC2_Init 0 */
/* USER CODE END ADC2_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC2_Init 1 */
/* USER CODE END ADC2_Init 1 */
/** Common config
*/
hadc2.Instance = ADC2;
hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
hadc2.Init.Resolution = ADC_RESOLUTION_12B;
hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc2.Init.GainCompensation = 0;
hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc2.Init.LowPowerAutoWait = DISABLE;
hadc2.Init.ContinuousConvMode = ENABLE;
hadc2.Init.NbrOfConversion = 1;
hadc2.Init.DiscontinuousConvMode = DISABLE;
hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc2.Init.DMAContinuousRequests = ENABLE;
hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc2.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc2) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_15;
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(&hadc2, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC2_Init 2 */
/* USER CODE END ADC2_Init 2 */
}
/**
* @brief COMP1 Initialization Function
* @PAram None
* @retval None
*/
static void MX_COMP1_Init(void)
{
/* USER CODE BEGIN COMP1_Init 0 */
/* USER CODE END COMP1_Init 0 */
/* USER CODE BEGIN COMP1_Init 1 */
/* USER CODE END COMP1_Init 1 */
hcomp1.Instance = COMP1;
hcomp1.Init.InputPlus = COMP_INPUT_PLUS_IO1;
hcomp1.Init.InputMinus = COMP_INPUT_MINUS_DAC1_CH1;
hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
hcomp1.Init.Hysteresis = COMP_HYSTERESIS_LOW;
hcomp1.Init.BlankingSrce = COMP_BLANKINGSRC_NONE;
hcomp1.Init.TriggerMode = COMP_TRIGGERMODE_IT_RISING;
if (HAL_COMP_Init(&hcomp1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN COMP1_Init 2 */
/* USER CODE END COMP1_Init 2 */
}
/**
* @brief DAC1 Initialization Function
* @PAram None
* @retval None
*/
static void MX_DAC1_Init(void)
{
/* USER CODE BEGIN DAC1_Init 0 */
/* USER CODE END DAC1_Init 0 */
DAC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN DAC1_Init 1 */
/* USER CODE END DAC1_Init 1 */
/** DAC Initialization
*/
hdac1.Instance = DAC1;
if (HAL_DAC_Init(&hdac1) != HAL_OK)
{
Error_Handler();
}
/** DAC channel OUT1 config
*/
sConfig.DAC_HighFrequency = DAC_HIGH_FREQUENCY_INTERFACE_MODE_AUTOMATIC;
sConfig.DAC_DMADoubleDataMode = DISABLE;
sConfig.DAC_SignedFormat = DISABLE;
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
sConfig.DAC_Trigger2 = DAC_TRIGGER_NONE;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_INTERNAL;
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN DAC1_Init 2 */
/* USER CODE END DAC1_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_2;
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_ENABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
/**
* @brief SPI2 Initialization Function
* @PAram None
* @retval None
*/
static void MX_SPI2_Init(void)
{
/* USER CODE BEGIN SPI2_Init 0 */
/* USER CODE END SPI2_Init 0 */
/* USER CODE BEGIN SPI2_Init 1 */
/* USER CODE END SPI2_Init 1 */
/* SPI2 parameter configuration*/
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_8;
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();
}
/* USER CODE BEGIN SPI2_Init 2 */
/* USER CODE END SPI2_Init 2 */
}
/**
* @brief TIM1 Initialization Function
* @PAram None
* @retval None
*/
void MX_TIM1_Init(void)
{
/* USER CODE BEGIN TIM1_Init 0 */
/* USER CODE END TIM1_Init 0 */
TIM_Encoder_InitTypeDef sConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
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;
sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sConfig.IC1Filter = 0;
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
sConfig.IC2Filter = 0;
if (HAL_TIM_Encoder_Init(&htim1, &sConfig) != 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();
}
/* USER CODE BEGIN TIM1_Init 2 */
/* USER CODE END TIM1_Init 2 */
}
/**
* @brief TIM3 Initialization Function
* @PAram None
* @retval None
*/
void MX_TIM3_Init(void)
{
/* USER CODE BEGIN TIM3_Init 0 */
/* USER CODE END TIM3_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM3_Init 1 */
/* USER CODE END TIM3_Init 1 */
htim3.Instance = TIM3;
htim3.Init.Prescaler = 79;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM3_Init 2 */
HAL_TIM_MspPostInit(&htim3);
}
/**
* @brief TIM4 Initialization Function
* @PAram None
* @retval None
*/
void MX_TIM4_Init(void)
{
/* USER CODE BEGIN TIM4_Init 0 */
/* USER CODE END TIM4_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM4_Init 1 */
/* USER CODE END TIM4_Init 1 */
htim4.Instance = TIM4;
htim4.Init.Prescaler = 7999;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 9999;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_OC_Init(&htim4) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_TIMING;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_OC_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM4_Init 2 */
/* USER CODE END TIM4_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.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
/* USER CODE END USART2_Init 2 */
}
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMAMUX1_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
/* 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};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, LD2_Pin|TFT_RST_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, TFT_DC_Pin|TFT_CS_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(TS_CS_GPIO_Port, TS_CS_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : B1_Pin */
GPIO_InitStruct.Pin = B1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : LD2_Pin */
GPIO_InitStruct.Pin = LD2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : TFT_DC_Pin TFT_CS_Pin */
GPIO_InitStruct.Pin = TFT_DC_Pin|TFT_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(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : TS_CS_Pin */
GPIO_InitStruct.Pin = TS_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(TS_CS_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : ENC_BTN_Pin */
GPIO_InitStruct.Pin = ENC_BTN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(ENC_BTN_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : TFT_RST_Pin */
GPIO_InitStruct.Pin = TFT_RST_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(TFT_RST_GPIO_Port, &GPIO_InitStruct);
/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}
/* USER CODE BEGIN 4 */
/* 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 */
2025-12-10 8:19 AM
//*STM32G431CBUX_FLASH.ld
******************************************************************************
**
** @file : LinkerScript.ld
**
** @author : Auto-generated by STM32CubeIDE
**
** @brief : Linker script for STM32G431CBUx Device from STM32G4 series
** 128KBytes FLASH
** 32KBytes RAM
**
** Set heap size, stack size and stack location according
** to application requirements.
**
** Set memory bank area and size if external memory is used
**
** Target : STMicroelectronics STM32
**
** Distribution: The file is distributed as is, without any warranty
** of any kind.
**
******************************************************************************
** @attention
**
** Copyright (c) 2025 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.
**
******************************************************************************
*/
/* Entry Point */
ENTRY(Reset_Handler)
/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */
_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */
/* Memories definition */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K
}
/* Sections */
SECTIONS
{
/* The startup code into "FLASH" Rom type memory */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH
/* The program code and other data into "FLASH" Rom type memory */
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
*(.eh_frame)
KEEP (*(.init))
KEEP (*(.fini))
. = ALIGN(4);
_etext = .; /* define a global symbols at end of code */
} >FLASH
/* Constant data into "FLASH" Rom type memory */
.rodata :
{
. = ALIGN(4);
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
. = ALIGN(4);
} >FLASH
.ARM.extab (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
{
. = ALIGN(4);
*(.ARM.extab* .gnu.linkonce.armextab.*)
. = ALIGN(4);
} >FLASH
.ARM (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
{
. = ALIGN(4);
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
. = ALIGN(4);
} >FLASH
.preinit_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
{
. = ALIGN(4);
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array*))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
} >FLASH
.init_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
{
. = ALIGN(4);
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array*))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
} >FLASH
.fini_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
{
. = ALIGN(4);
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(SORT(.fini_array.*)))
KEEP (*(.fini_array*))
PROVIDE_HIDDEN (__fini_array_end = .);
. = ALIGN(4);
} >FLASH
/* Used by the startup to initialize data */
_sidata = LOADADDR(.data);
/* Initialized data sections into "RAM" Ram type memory */
.data :
{
. = ALIGN(4);
_sdata = .; /* create a global symbol at data start */
*(.data) /* .data sections */
*(.data*) /* .data* sections */
*(.RamFunc) /* .RamFunc sections */
*(.RamFunc*) /* .RamFunc* sections */
. = ALIGN(4);
_edata = .; /* define a global symbol at data end */
} >RAM AT> FLASH
/* Uninitialized data section into "RAM" Ram type memory */
. = ALIGN(4);
.bss :
{
/* This is used by the startup in order to initialize the .bss section */
_sbss = .; /* define a global symbol at bss start */
__bss_start__ = _sbss;
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(4);
_ebss = .; /* define a global symbol at bss end */
__bss_end__ = _ebss;
} >RAM
/* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */
._user_heap_stack :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >RAM
/* Remove information from the compiler libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
.ARM.attributes 0 : { *(.ARM.attributes) }
}
2025-12-10 8:20 AM
#MicroXplorer Configuration settings - do not modify
ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_14
ADC1.ClockPrescaler=ADC_CLOCK_ASYNC_DIV4
ADC1.CommonPathInternal=null|null|null|null
ADC1.ContinuousConvMode=ENABLE
ADC1.DMAContinuousRequests=ENABLE
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,master,ClockPrescaler,ContinuousConvMode,DMAContinuousRequests,CommonPathInternal
ADC1.NbrOfConversionFlag=1
ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE
ADC1.Rank-0\#ChannelRegularConversion=1
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5
ADC1.master=1
ADC2.Channel-2\#ChannelRegularConversion=ADC_CHANNEL_15
ADC2.ClockPrescaler=ADC_CLOCK_ASYNC_DIV4
ADC2.CommonPathInternal=null|null|null|null
ADC2.ContinuousConvMode=ENABLE
ADC2.DMAContinuousRequests=ENABLE
ADC2.IPParameters=Rank-2\#ChannelRegularConversion,ClockPrescaler,Channel-2\#ChannelRegularConversion,SamplingTime-2\#ChannelRegularConversion,OffsetNumber-2\#ChannelRegularConversion,NbrOfConversionFlag,ContinuousConvMode,DMAContinuousRequests,CommonPathInternal
ADC2.NbrOfConversionFlag=1
ADC2.OffsetNumber-2\#ChannelRegularConversion=ADC_OFFSET_NONE
ADC2.Rank-2\#ChannelRegularConversion=1
ADC2.SamplingTime-2\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5
CAD.formats=
CAD.pinconfig=
CAD.provider=
COMP1.Hysteresis=COMP_HYSTERESIS_LOW
COMP1.IPParameters=TriggerMode,Hysteresis
COMP1.TriggerMode=COMP_TRIGGERMODE_IT_RISING
Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.ADC1.0.EventEnable=DISABLE
Dma.ADC1.0.Instance=DMA1_Channel1
Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.ADC1.0.MemInc=DMA_MINC_ENABLE
Dma.ADC1.0.Mode=DMA_NORMAL
Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE
Dma.ADC1.0.Polarity=HAL_DMAMUX_REQ_GEN_RISING
Dma.ADC1.0.Priority=DMA_PRIORITY_LOW
Dma.ADC1.0.RequestNumber=1
Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber
Dma.ADC1.0.SignalID=NONE
Dma.ADC1.0.SyncEnable=DISABLE
Dma.ADC1.0.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT
Dma.ADC1.0.SyncRequestNumber=1
Dma.ADC1.0.SyncSignalID=NONE
Dma.ADC2.1.Direction=DMA_PERIPH_TO_MEMORY
Dma.ADC2.1.EventEnable=DISABLE
Dma.ADC2.1.Instance=DMA1_Channel2
Dma.ADC2.1.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.ADC2.1.MemInc=DMA_MINC_ENABLE
Dma.ADC2.1.Mode=DMA_NORMAL
Dma.ADC2.1.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.ADC2.1.PeriphInc=DMA_PINC_DISABLE
Dma.ADC2.1.Polarity=HAL_DMAMUX_REQ_GEN_RISING
Dma.ADC2.1.Priority=DMA_PRIORITY_LOW
Dma.ADC2.1.RequestNumber=1
Dma.ADC2.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber
Dma.ADC2.1.SignalID=NONE
Dma.ADC2.1.SyncEnable=DISABLE
Dma.ADC2.1.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT
Dma.ADC2.1.SyncRequestNumber=1
Dma.ADC2.1.SyncSignalID=NONE
Dma.Request0=ADC1
Dma.Request1=ADC2
Dma.Request2=SPI1_TX
Dma.RequestsNb=3
Dma.SPI1_TX.2.Direction=DMA_MEMORY_TO_PERIPH
Dma.SPI1_TX.2.EventEnable=DISABLE
Dma.SPI1_TX.2.Instance=DMA1_Channel3
Dma.SPI1_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.SPI1_TX.2.MemInc=DMA_MINC_ENABLE
Dma.SPI1_TX.2.Mode=DMA_NORMAL
Dma.SPI1_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.SPI1_TX.2.PeriphInc=DMA_PINC_DISABLE
Dma.SPI1_TX.2.Polarity=HAL_DMAMUX_REQ_GEN_RISING
Dma.SPI1_TX.2.Priority=DMA_PRIORITY_LOW
Dma.SPI1_TX.2.RequestNumber=1
Dma.SPI1_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber
Dma.SPI1_TX.2.SignalID=NONE
Dma.SPI1_TX.2.SyncEnable=DISABLE
Dma.SPI1_TX.2.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT
Dma.SPI1_TX.2.SyncRequestNumber=1
Dma.SPI1_TX.2.SyncSignalID=NONE
File.Version=6
GPIO.groupedBy=Expand Peripherals
KeepUserPlacement=false
Mcu.CPN=STM32G431CBU6
Mcu.Family=STM32G4
Mcu.IP0=ADC1
Mcu.IP1=ADC2
Mcu.IP10=TIM1
Mcu.IP11=TIM3
Mcu.IP12=TIM4
Mcu.IP13=USART2
Mcu.IP2=COMP1
Mcu.IP3=DAC1
Mcu.IP4=DMA
Mcu.IP5=NVIC
Mcu.IP6=RCC
Mcu.IP7=SPI1
Mcu.IP8=SPI2
Mcu.IP9=SYS
Mcu.IPNb=14
Mcu.Name=STM32G431C(6-8-B)Ux
Mcu.Package=UFQFPN48
Mcu.Pin0=PC13
Mcu.Pin1=PF1-OSC_OUT
Mcu.Pin10=PB1
Mcu.Pin11=PB11
Mcu.Pin12=PB12
Mcu.Pin13=PB14
Mcu.Pin14=PB15
Mcu.Pin15=PC6
Mcu.Pin16=PA8
Mcu.Pin17=PA9
Mcu.Pin18=PA10
Mcu.Pin19=PA11
Mcu.Pin2=PA1
Mcu.Pin20=PC10
Mcu.Pin21=PB3
Mcu.Pin22=VP_COMP1_VS_DAC1OUT1
Mcu.Pin23=VP_DAC1_VS_DACI1
Mcu.Pin24=VP_SYS_VS_Systick
Mcu.Pin25=VP_SYS_VS_DBSignals
Mcu.Pin26=VP_TIM4_VS_no_output1
Mcu.Pin3=PA2
Mcu.Pin4=PA3
Mcu.Pin5=PA5
Mcu.Pin6=PA6
Mcu.Pin7=PA7
Mcu.Pin8=PC4
Mcu.Pin9=PB0
Mcu.PinsNb=27
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32G431CBUx
MxCube.Version=6.15.0
MxDb.Version=DB.6.0.150
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.COMP1_2_3_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
NVIC.DMA1_Channel1_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
NVIC.DMA1_Channel2_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
NVIC.DMA1_Channel3_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SPI1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
PA1.Mode=INP
PA1.Signal=COMP1_INP
PA10.GPIOParameters=GPIO_Speed,GPIO_Label
PA10.GPIO_Label=TFT_RST
PA10.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA10.Locked=true
PA10.Signal=GPIO_Output
PA11.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
PA11.GPIO_Label=TS_MOSI
PA11.GPIO_Mode=GPIO_MODE_AF_PP
PA11.GPIO_PuPd=GPIO_NOPULL
PA11.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA11.Mode=Full_Duplex_Master
PA11.Signal=SPI2_MOSI
PA2.GPIOParameters=GPIO_Speed,GPIO_Label
PA2.GPIO_Label=USART2_TX
PA2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA2.Mode=Asynchronous
PA2.Signal=USART2_TX
PA3.GPIOParameters=GPIO_Speed,GPIO_Label
PA3.GPIO_Label=USART2_RX
PA3.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA3.Mode=Asynchronous
PA3.Signal=USART2_RX
PA5.GPIOParameters=GPIO_Label
PA5.GPIO_Label=LD2[Green Led]
PA5.Locked=true
PA5.Signal=GPIO_Output
PA6.GPIOParameters=GPIO_Speed,GPIO_Label
PA6.GPIO_Label=TFT_MISO
PA6.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA6.Mode=Full_Duplex_Master
PA6.Signal=SPI1_MISO
PA7.GPIOParameters=GPIO_Speed,GPIO_Label
PA7.GPIO_Label=TFT_MOSI
PA7.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA7.Mode=Full_Duplex_Master
PA7.Signal=SPI1_MOSI
PA8.GPIOParameters=GPIO_PuPd,GPIO_Label
PA8.GPIO_Label=ENC_A
PA8.GPIO_PuPd=GPIO_PULLUP
PA8.Signal=S_TIM1_CH1
PA9.GPIOParameters=GPIO_PuPd,GPIO_Label
PA9.GPIO_Label=ENC_B
PA9.GPIO_PuPd=GPIO_PULLUP
PA9.Signal=S_TIM1_CH2
PB0.GPIOParameters=GPIO_Label
PB0.GPIO_Label=GEN_OUT
PB0.Signal=S_TIM3_CH3
PB1.GPIOParameters=GPIO_Label
PB1.GPIO_Label=TFT_LED
PB1.Signal=S_TIM3_CH4
PB11.GPIOParameters=GPIO_Label
PB11.GPIO_Label=ADC1_IN14
PB11.Mode=IN14-Single-Ended
PB11.Signal=ADC1_IN14
PB12.GPIOParameters=GPIO_Speed,GPIO_Label
PB12.GPIO_Label=TS_CS
PB12.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PB12.Locked=true
PB12.Signal=GPIO_Output
PB14.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
PB14.GPIO_Label=TS_MISO
PB14.GPIO_Mode=GPIO_MODE_AF_PP
PB14.GPIO_PuPd=GPIO_NOPULL
PB14.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PB14.Mode=Full_Duplex_Master
PB14.Signal=SPI2_MISO
PB15.Mode=IN15-Single-Ended
PB15.Signal=ADC2_IN15
PB3.GPIOParameters=GPIO_Speed,GPIO_Label
PB3.GPIO_Label=TFT_SCK
PB3.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PB3.Mode=Full_Duplex_Master
PB3.Signal=SPI1_SCK
PC10.GPIOParameters=GPIO_Speed,GPIO_Label
PC10.GPIO_Label=TFT_CS
PC10.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PC10.Locked=true
PC10.Signal=GPIO_Output
PC13.GPIOParameters=GPIO_Label
PC13.GPIO_Label=B1[Blue PushButton]
PC13.Locked=true
PC13.Signal=GPXTI13
PC4.GPIOParameters=GPIO_Speed,GPIO_Label
PC4.GPIO_Label=TFT_DC
PC4.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PC4.Locked=true
PC4.Signal=GPIO_Output
PC6.GPIOParameters=GPIO_PuPd,GPIO_Label
PC6.GPIO_Label=ENC_BTN
PC6.GPIO_PuPd=GPIO_PULLUP
PC6.Locked=true
PC6.Signal=GPIO_Input
PF1-OSC_OUT.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode
PF1-OSC_OUT.GPIO_Label=TS_SCk
PF1-OSC_OUT.GPIO_Mode=GPIO_MODE_AF_PP
PF1-OSC_OUT.GPIO_PuPd=GPIO_NOPULL
PF1-OSC_OUT.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PF1-OSC_OUT.Mode=Full_Duplex_Master
PF1-OSC_OUT.Signal=SPI2_SCK
PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false
ProjectManager.CompilerLinker=GCC
ProjectManager.CompilerOptimize=6
ProjectManager.ComputerToolchain=false
ProjectManager.CoupleFile=false
ProjectManager.CustomerFirmwarePackage=
ProjectManager.DefaultFWLocation=true
ProjectManager.DeletePrevious=true
ProjectManager.DeviceId=STM32G431CBUx
ProjectManager.FirmwarePackage=STM32Cube FW_G4 V1.6.1
ProjectManager.FreePins=false
ProjectManager.HalAssertFull=false
ProjectManager.HeapSize=0x200
ProjectManager.KeepUserCode=true
ProjectManager.LastFirmware=true
ProjectManager.LibraryCopy=1
ProjectManager.MainLocation=Core/Src
ProjectManager.NoMain=false
ProjectManager.PreviousToolchain=STM32CubeIDE
ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=Oscillo_STM32G431CBU.ioc
ProjectManager.ProjectName=Oscillo_STM32G431CBU
ProjectManager.ProjectStructure=
ProjectManager.RegisterCallBack=
ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=STM32CubeIDE
ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_ADC2_Init-ADC2-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_COMP1_Init-COMP1-false-HAL-true,8-MX_DAC1_Init-DAC1-false-HAL-true,9-MX_SPI2_Init-SPI2-false-HAL-true,10-MX_TIM1_Init-TIM1-false-HAL-true,11-MX_TIM3_Init-TIM3-false-HAL-true,12-MX_TIM4_Init-TIM4-false-HAL-true,13-MX_USART2_UART_Init-USART2-false-HAL-true
RCC.ADC12Freq_Value=80000000
RCC.AHBFreq_Value=80000000
RCC.APB1Freq_Value=80000000
RCC.APB1TimFreq_Value=80000000
RCC.APB2Freq_Value=80000000
RCC.APB2TimFreq_Value=80000000
RCC.CRSFreq_Value=48000000
RCC.CortexFreq_Value=80000000
RCC.EXTERNAL_CLOCK_VALUE=12288000
RCC.FCLKCortexFreq_Value=80000000
RCC.FDCANFreq_Value=80000000
RCC.FamilyName=M
RCC.HCLKFreq_Value=80000000
RCC.HSE_VALUE=8000000
RCC.HSI48_VALUE=48000000
RCC.HSI_VALUE=16000000
RCC.I2C1Freq_Value=80000000
RCC.I2C2Freq_Value=80000000
RCC.I2C3Freq_Value=80000000
RCC.I2SFreq_Value=80000000
RCC.IPParameters=ADC12Freq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CRSFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2SFreq_Value,LPTIM1Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value
RCC.LPTIM1Freq_Value=80000000
RCC.LPUART1Freq_Value=80000000
RCC.LSCOPinFreq_Value=32000
RCC.LSE_VALUE=32768
RCC.LSI_VALUE=32000
RCC.MCO1PinFreq_Value=16000000
RCC.PLLN=10
RCC.PLLPoutputFreq_Value=80000000
RCC.PLLQoutputFreq_Value=80000000
RCC.PLLRCLKFreq_Value=80000000
RCC.PWRFreq_Value=80000000
RCC.RNGFreq_Value=80000000
RCC.SAI1Freq_Value=80000000
RCC.SYSCLKFreq_VALUE=80000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
RCC.UART4Freq_Value=80000000
RCC.USART1Freq_Value=80000000
RCC.USART2Freq_Value=80000000
RCC.USART3Freq_Value=80000000
RCC.USBFreq_Value=80000000
RCC.VCOInputFreq_Value=16000000
RCC.VCOOutputFreq_Value=160000000
SH.GPXTI13.0=GPIO_EXTI13
SH.GPXTI13.ConfNb=1
SH.S_TIM1_CH1.0=TIM1_CH1,Encoder_Interface
SH.S_TIM1_CH1.ConfNb=1
SH.S_TIM1_CH2.0=TIM1_CH2,Encoder_Interface
SH.S_TIM1_CH2.ConfNb=1
SH.S_TIM3_CH3.0=TIM3_CH3,PWM Generation3 CH3
SH.S_TIM3_CH3.ConfNb=1
SH.S_TIM3_CH4.0=TIM3_CH4,PWM Generation4 CH4
SH.S_TIM3_CH4.ConfNb=1
SPI1.CalculateBaudRate=40.0 MBits/s
SPI1.DataSize=SPI_DATASIZE_8BIT
SPI1.Direction=SPI_DIRECTION_2LINES
SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize
SPI1.Mode=SPI_MODE_MASTER
SPI1.VirtualType=VM_MASTER
SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_8
SPI2.CalculateBaudRate=10.0 MBits/s
SPI2.DataSize=SPI_DATASIZE_8BIT
SPI2.Direction=SPI_DIRECTION_2LINES
SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler
SPI2.Mode=SPI_MODE_MASTER
SPI2.VirtualType=VM_MASTER
TIM3.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM3.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM3.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,Prescaler,PeriodNoDither,AutoReloadPreload
TIM3.PeriodNoDither=999
TIM3.Prescaler=79
TIM4.Channel-Output\ Compare1\ No\ Output=TIM_CHANNEL_1
TIM4.IPParameters=Channel-Output Compare1 No Output,Prescaler,PeriodNoDither,TIM_MasterOutputTrigger
TIM4.PeriodNoDither=9999
TIM4.Prescaler=7999
TIM4.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
USART2.IPParameters=VirtualMode-Asynchronous
USART2.VirtualMode-Asynchronous=VM_ASYNC
VP_COMP1_VS_DAC1OUT1.Mode=INM_DAC1OUT1
VP_COMP1_VS_DAC1OUT1.Signal=COMP1_VS_DAC1OUT1
VP_DAC1_VS_DACI1.Mode=DAC_OUT1_Int
VP_DAC1_VS_DACI1.Signal=DAC1_VS_DACI1
VP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals
VP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals
VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_TIM4_VS_no_output1.Mode=Output Compare1 No Output
VP_TIM4_VS_no_output1.Signal=TIM4_VS_no_output1
board=custom
isbadioc=false
2025-12-10 8:21 AM
Attached are the .ld, .ioc, and main.c files.
2025-12-10 8:23 AM
Show oscilloscope.h content.
We need to see the definition of the Oscilloscope structure:
Oscilloscope oscilloscope;
I suspect a large buffer declared as a member of that structure
2025-12-10 8:27 AM
/*
* oscilloscope.h
*
* Created on: Apr 6, 2024
* Author: Dominik
*/
#ifndef INC_OSCILLOSCOPE_H_
#define INC_OSCILLOSCOPE_H_
#include "main.h"
#include "tim.h"
#include "inttypes.h"
#include "ili9488.h"
#include "ts.h"
#include "stm32_adafruit_ts.h"
#include "cursors.h"
extern TS_DrvTypeDef *ts_drv;
#define ts_calib()
#define LCD_WIDTH 480
#define LCD_HEIGHT 320
#define LCD_BRIGHTNESS 1000 // 0-1000
#define MEMORY_DEPTH 512//512
#define FFT_SIZE 128
#define CANVA_MIDDLE_V 158
#define CANVA_WIDTH 420
#define CHANNEL_OFFSET
#define ADC_RESOLUTION 4096
#define ADC_VREF 3.3
enum ChangedParameter{
VerticalOffset,
VerticalScale
};
enum ChangedCursor{
CH1_TimeCursor_1,
CH1_TimeCursor_2,
CH1_VoltageCursor_1,
CH1_VoltageCursor_2,
CH2_TimeCursor_1,
CH2_TimeCursor_2,
CH2_VoltageCursor_1,
CH2_VoltageCursor_2
};
enum Selection{
SelectionCH1,
SelectionCH2,
SelectionTIME_BASE,
SelectionMOVE_WAVEFORMS_HORIZONTALLY,
SelectionTRIGGER,
SelectionMAIN_MENU,
SelectionCURSORS,
SelectionCURSORS_CHANGE_CHANNEL,
SelectionCURSORS_TIME,
SelectionCURSORS_VOLTAGE,
SelectionFFT,
SelectionFFT_CHANGE_CHANNEL,
SelectedRUN_STOP,
Idle
};
enum ActiveCursorChannel{
CursorChannel_1,
CursorChannel_2
};
enum ClickedItem{
ClickedCH1,
ClickedCH2,
ClickedMOVE_WAVEFORMS_HORIZONTALLY,
ClickedTIME_BASE,
ClickedTRIGGER,
ClickedMAIN_MENU,
ClickedCURSORS,
ClickedFFT,
ClickedRUN_STOP,
Nothing
};
enum FFT_ActiveChannel{
FFT_Channel_1,
FFT_Channel_2
};
typedef struct {
double real;
double imag;
} Complex;
typedef struct osc_ch{
uint16_t waveform_raw_adc[MEMORY_DEPTH]; // all samples
int16_t y_offset; // vertical offset (offset = 0 => 0V = middle of the display)
uint16_t y_scale_mV; // vertical scale [mV/div]
uint32_t y_scale_mVArray[10];
int8_t y_scale_mVIndex;
uint32_t waveform_display[LCD_WIDTH]; // section of waveform currently displayed [mV]
uint8_t color;
uint8_t isOn;
uint8_t number; // number of channel for identification
enum ChangedParameter changedParameter;
Channel_cursors cursors;
uint32_t channel_frequency;
double fft_amplitude[FFT_SIZE/2];
int32_t fft_frequency[FFT_SIZE/2];
uint32_t frequency_per_stripe;
}Oscilloscope_channel;
typedef struct osc{
Oscilloscope_channel ch1;
Oscilloscope_channel ch2;
int16_t x_offset; // horizontal offset
uint64_t timeBase_us;
TS_StateTypeDef touchScreen;
enum Selection selection;
enum ClickedItem clickedItem;
uint32_t timeBaseArray[9];
int8_t timeBaseIndex;
int16_t triggerLevel_mV;
uint8_t stop;
enum ActiveCursorChannel active_cursor_channel;
enum ChangedCursor changedCursor;
enum FFT_ActiveChannel fft_active_channel;
uint8_t is_fft_on;
}Oscilloscope;
void oscilloscopeInit(Oscilloscope* osc);
void oscilloscope_channel_init(Oscilloscope_channel* ch, uint8_t color);
void oscilloscope_channel_toggle_on_off(Oscilloscope_channel* ch);
uint32_t calculate_peak_to_peak(uint32_t *waveform);
uint32_t calculate_RMS(uint32_t *waveform);
void draw_waveform(Oscilloscope_channel* ch, uint64_t timeBase_us, int offset, int stop);
void drawGrid();
void drawChanellVperDev(uint16_t x, Oscilloscope_channel* ch);
void displayTimeBase(Oscilloscope* osc);
void displayHorizontallOffset(Oscilloscope* osc);
void serveTouchScreen(Oscilloscope* osc);
void change_parameter(Oscilloscope_channel* ch);
void serveEncoder(Oscilloscope* osc);
void change_cursors(Oscilloscope * osc);
void drawCursorsMenu(Oscilloscope* osc);
void changeActiveCursorChannel(enum ActiveCursorChannel active_cursor_channel);
void setActiveCursorType(enum ActiveCursorType cursor_type_to_set, enum ActiveCursorType * osc_active_cursor_type);
void drawMenu(Oscilloscope_channel* ch);
void drawMainMenuButton();
void drawMainMenu(uint8_t color);
void drawFFTMenu(Oscilloscope* osc);
void calculateFFT(Oscilloscope_channel * ch, uint32_t sampling_frequency);
void fft(Complex *X, int N);
void drawFFTgraph(Oscilloscope_channel * ch);
void drawTriggerMenu(Oscilloscope* osc);
void drawMeasurements(Oscilloscope* osc);
void drawRunStop(Oscilloscope* osc);
void drawTriggerIcon(Oscilloscope* osc);
void drawChannels0Vmarkers(Oscilloscope_channel* ch);
float convertAdcToVoltage(uint16_t adcValue);
#endif