sprintf 阻止 stm32 程序

问题描述 投票:0回答:1

我正在对 STM32 微控制器进行编程。在代码中,我只是按照之前的方式调用 sprintf,当时它可以工作,但现在它只是冻结了整个程序。这里有什么问题吗?

char str[100]; 
sprintf(str, "TEMP_ADC: %d\n", 50);

我已经包含了 stdlib.h、stdio.h、math.h 和 string.h。 100 个字符的限制已经足够了。

我尝试点亮

sprintf()
调用上方和下方的 LED,很明显程序卡在
sprintf()
上。我尝试切换到
snprintf()
但结果是相同的行为。

编辑:

我注意到,当我在启动 DMA 之前使用

sprintf()
时,它会起作用。如果我之后使用它,程序就会冻结。它可能与将 uint16_t 数组转换为 uint32_t 有关吗?

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

  uint16_t values[4];

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

/* Configure the peripherals common clocks */
  PeriphCommonClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_TIM2_Init();
  MX_TIM16_Init();
  MX_MEMORYMAP_Init();
  MX_LPUART1_UART_Init();
  MX_RF_Init();
  /* USER CODE BEGIN 2 */

  char str[100];
  sprintf(str, "TEMP_ADC: %d\n", 50);
  int size = (int)((ceil(log10(50))+1+11)*sizeof(char));
  HAL_UART_Transmit(&hlpuart1, str, size, 100);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, SET);

  HAL_ADC_Start_DMA(&hadc1, (uint32_t *)values, 4);
  uint16_t temp = 0;


  /* USER CODE END 2 */

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

        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
c stm32 c-strings
1个回答
0
投票

uint16_t 值[4];

HAL_ADC_Start_DMA(&hadc1, (uint32_t *)值, 4);

问题与

sprint()
无关。

如果

HAL_ADC_START_DMA()
需要一个指向
uint32_t
数组的指针,首先,将
uint16_t
转换为
uint32_t *
会导致堆栈溢出。其次,
values
uint32_t
的数组,而不是字符串,所以要传递数组的地址,应该是
&values

正确的做法应该是:

uint32_t values[4];   // an array of 32-bit for DMA storage

HAL_ADC_Start_DMA(&hadc1, &values, 4);
© www.soinside.com 2019 - 2024. All rights reserved.