STM32 使用 CubeMX 和 STMStudio:'int main()' 不工作
STM32 using CubeMX and STMStudio: 'int main()' doesn't work
我正在学习在 STM32F429ZI Nucleo 板上编码,我一直在尝试使用 STMStudio 从 ADC1 温度传感器读取温度。
我在一个教程中找到的代码不起作用,所以我尝试检查代码各个部分的 "check" 变量的值,然后我注意到,不仅 [=22] 的值=] 变量在主函数内的任何地方都没有改变,而且 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);
}
}
}
编译器一定注意到了 check
变量只写不读,优化掉了没有目的的写。出于调试目的,您可以将其声明为 volatile
以强制所有写入都通过内存。
程序中的const
值同样是优化的牺牲品,编译器直接在代码中使用了这些值,可能会预先计算部分表达式。
我正在学习在 STM32F429ZI Nucleo 板上编码,我一直在尝试使用 STMStudio 从 ADC1 温度传感器读取温度。
我在一个教程中找到的代码不起作用,所以我尝试检查代码各个部分的 "check" 变量的值,然后我注意到,不仅 [=22] 的值=] 变量在主函数内的任何地方都没有改变,而且 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);
}
}
}
编译器一定注意到了 check
变量只写不读,优化掉了没有目的的写。出于调试目的,您可以将其声明为 volatile
以强制所有写入都通过内存。
程序中的const
值同样是优化的牺牲品,编译器直接在代码中使用了这些值,可能会预先计算部分表达式。