【问题标题】:STM32 using CubeMX and STMStudio: 'int main()' doesn't workSTM32 使用 CubeMX 和 STMStudio:'int main()' 不起作用
【发布时间】:2019-11-25 12:45:27
【问题描述】:

我正在学习在 STM32F429ZI Nucleo 板上编写代码,我一直在尝试使用 STMStudio 从 ADC1 温度传感器读取温度。

我在其中一个教程中找到的代码不起作用,所以我尝试在代码的各个部分检查“check”变量的值,然后我注意到,不仅“check”变量的值没有更改主函数内的任何位置,但 STMStudio 也看不到主函数内声明的任何变量。

知道这是为什么吗?

我尝试了不同的代码,它使用按钮点亮 LED 来检查电路板是否正常并且工作正常。

    /* 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);

      }
  }

}

【问题讨论】:

  • 最后好像少了两个花括号,能否请您检查一下您的代码 sn-p 是否完整?谢谢
  • 括号没问题,我复制代码的时候肯定漏掉了。现在已编辑。

标签: c debugging stm32 adc


【解决方案1】:

编译器一定已经注意到check 变量只被写入而从不被读取,并且优化掉了没有目的的写入。出于调试目的,您可以将其声明为 volatile 以强制所有写入进入内存。

程序中的const 值同样是优化的受害者,编译器直接在代码中使用了这些值,可能会预先计算部分表达式。​​

【讨论】:

  • 在将其设为volatile 后,check 变量仍显示为 0.0。 SenseADC 变量显示恒定值 15474。ADC 分辨率设置为 12 位,因此它的值不应大于 4096,当然也不应该是恒定的。
  • 那么您的编译器或调试器设置存在根本问题。
  • 好的,我设法找到了解决方案,由于某种原因,如果以前的程序具有相同的文件名,它不会将新版本的程序上传到微控制器。用外部软件上传,然后用STMstudio检查值,结果很好。
猜你喜欢
  • 2019-06-03
  • 2017-04-07
  • 2016-03-07
  • 2019-05-28
  • 2016-10-03
  • 2018-06-06
  • 2017-11-07
  • 2021-12-31
  • 2018-12-25
相关资源
最近更新 更多