我正在对 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 */
}
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);