STM32 с использованием CubeMX и STMStudio: 'int main()' не работает

Я учусь программировать на плате STM32F429ZI Nucleo и пытаюсь считать температуру с датчика температуры ADC1 с помощью STMStudio.

Код, который я нашел в одном из руководств, не работал, поэтому я попытался проверить значение переменной «check» в различных частях кода, и затем я заметил, что не только значение переменной «check» нигде не меняется внутри основной функции, но и STMStudio не видит никаких переменных, объявленных внутри основной функции.

Любая идея, почему это?

Я пробовал другой код, который использует кнопку для включения светодиода, чтобы проверить, в порядке ли плата, и она работала нормально.

    /* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;

/* USER CODE BEGIN PV */
uint16_t SenseADC;
float check = 0;
float Temperature;
float Vsense;

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_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();
  /* USER CODE BEGIN 2 */
  HAL_ADC_Start(&hadc1);

  check = 2;
  const float V25 = 0.76; // [V]
  const float Vsupply = 3.0; // [V]
  const float ADCResolution = 4095;
  const float avg_slope = 0.0025; // [V/deg. C]
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

      if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK){
          check = 3;
          SenseADC = HAL_ADC_GetValue(&hadc1);
          Vsense=(SenseADC*Vsupply)/ADCResolution;
          Temperature = (Vsense - V25)/avg_slope + 25;

          HAL_ADC_Start(&hadc1);

      }
  }

}


person Michał Suchonos    schedule 16.07.2019    source источник
comment
Похоже, что в конце отсутствуют как минимум две фигурные скобки. Не могли бы вы проверить фрагмент кода на полноту? Спасибо   -  person CuriouslyRecurringThoughts    schedule 16.07.2019
comment
Со скобками все в порядке, я, должно быть, пропустил их при копировании кода. Сейчас отредактировано.   -  person Michał Suchonos    schedule 18.07.2019


Ответы (1)


Компилятор, должно быть, заметил, что переменная check только записывается и никогда не читается, и оптимизировал запись как бесцельную. В целях отладки вы можете объявить его как volatile, чтобы все операции записи проходили в память.

Значения const в программе также являются жертвами оптимизации, компилятор использовал значения непосредственно в коде, возможность предварительного вычисления частей выражений.

person followed Monica to Codidact    schedule 16.07.2019
comment
после создания volatile переменная check по-прежнему отображается как 0,0. Переменная SenseADC показывает постоянное значение 15474. Разрешение АЦП установлено на 12 бит, поэтому оно не должно иметь значение больше 4096 и уж точно не должно быть постоянным. - person Michał Suchonos; 18.07.2019
comment
Тогда что-то принципиально не так с настройкой вашего компилятора или отладчика. - person followed Monica to Codidact; 18.07.2019
comment
Хорошо, мне удалось найти решение, почему-то он не загружал новую версию программы в микроконтроллер, если предыдущая имела такое же имя файла. После загрузки его с помощью внешнего программного обеспечения и последующей проверки значения с помощью STMstudio он показал хорошие результаты. - person Michał Suchonos; 19.07.2019