我已经完成了几个月的申请,即将完成。
处理器是
STM32G051K8T,我已经升级到 STMCubeIDE 1.10.1 并在我的定制板上使用 ST-LINK V2(蓝色药丸)。
突然间它挂在主程序中。
起初它挂在 sprintf() 语句的中间。
声明是
- char buf[120];
- sprintf(buf,"Calibration Factor: %lurn",ADC1->CALFACT); // dies on this statement
- print_debug_str("Hello Worldrn");
char buf[120] 最初是 char buf[40] 但我把它做得更长,以防万一它溢出缓冲区。没有区别。
我将“ADC1-CALFACT”更改为“16l”或“(uint32_t) 16”没有任何区别。它只是挂在那个命令上。
由于我的新 sprintf 可能使用了堆,所以我进入 STM32G051K8TX.ld 以将最小堆从 0x200 设置为 0x300。这没有什么区别。
我的第一个想法是它发生在某个内存位置。所以我放了 100 __NOP(); 包含 sprintf() 的代码之前的语句。没关系,它仍然挂在 sprintf()
我注释掉了 sprintf() 语句并更改了 print_debug_str(buf); 至
print_debug_str("你好世界rn"); 它挂在 print_debug str() 例程中。
- void print_debug_str(void * s)
- {
- static uint8_t db[256];
- volatile uint32_t i = 0;
- volatile uint32_t j;
- uint16_t len = strlen(s);
- while (UART1Busy) i++;
- memmove(db,s,len);
- UART1Busy = true;
- for (j=0;j<2500;j++) i++; // now stopping here
- HAL_UART_Transmit_DMA(&huart1,db,len);
- }
- void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
- {
- UART1Busy = false;
- UNUSED(huart);
- }
这让我想知道它是否不是基于内存而是基于时间。
所以我把 100 __NOP(); 在 for 循环中;
- {
- uint16_t i;
- for (i=0;i<30000;i++)
- {
- __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); // 20
- __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); // 40
- __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); // 60
- __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); // 80
- __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); // 100
- }
- }
现在它在 sprintf() 语句之前的这段代码中停止。
我现在猜测这是一个时间问题。它发生在某个时间。
我从来没有设置看门狗定时器,我在程序的后面使用了三个定时器(TIM2、TIM3、TIM14)。因此,以防万一它们现在不像以前那样工作,我决定将它们注释掉,这导致了有关未调用例程的警告。
这是代码的当前版本。直到它打破:
- 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_DMA_Init();
- MX_ADC1_Init();
- MX_I2C1_Init();
- //MX_TIM2_Init();
- //MX_TIM3_Init();
- //MX_TIM14_Init();
- MX_USART1_UART_Init();
- MX_USART2_UART_Init();
- /* Initialize interrupts */
- MX_NVIC_Init();
- /* USER CODE BEGIN 2 */
- /*
- ENCODER_POWER_OFF; // Make sure encoder is off so it can start correctly.
- print_debug_str("Encoder Power Offrn");
- TASK_PIN_L;
- TP2_L;
- DIO2_L;
- DIO3_L;
- DIO4_L;
- if (isDebug(DEBUG_verify_memory_structures))
- {
- verify_memory_structures();
- }
- */
- __NOP();
- {
- uint16_t i;
- for (i=0;i<30000;i++)
- {
- __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); // 20
- __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); // 40
- __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); // 60
- __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); // 80
- __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); // 100
- }
- }
- //ADC_init();
- __NOP();
- if (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK)
- {
- print_debug_str("Did not calibrate right!rnrn");
- }
- else
- {
- char buf[120];
- sprintf(buf,"Calibration Factor: %lurn",ADC1->CALFACT); // dies on this statement
- //sprintf(buf,"Calibration Factor: %lurn",(uint32_t) 0xA5A5A5A5); // dies on this statement
- print_debug_str(buf);
- }
也许我需要解释发生了什么。
我将调试器运行到 __NOP(); 在第 55 行我有一个断点,我在 __NOP() 处也有一个断点;在第 69 行。当我告诉它在第一个断点后恢复时,它永远不会返回并在第 69 行中断。
暂停似乎并没有真正起作用。它熄灭并恢复打开,但我无法检查变量。当我尝试查看时,它显示“错误:报告多个错误。无法执行 MI 命令:-var-create - * 来自调试器后端的错误消息:-var-create:无法创建变量对象无法创建变量对象”
尝试重置按钮,恢复按钮熄灭,暂停按钮亮起,但它不会像往常一样回到 main() 的开头,
因此,我必须使用 Terminate 按钮离开调试器,然后使用 Run -> Debug 返回调试器。
我最近升级到 STM32CubeIDE 1.10.1。这是这个版本中 ST 的已知问题之一吗?
1.10.1版本是否默认开启了看门狗定时器之类的东西?
有什么建议可以解决这个问题吗?在过去的 2-3 个月里,这每天都在工作。
我附上了整个 main.c 代码,因此您可以看到在执行此代码之前外围设备是如何设置的。
我不知道发生了什么事。这是工作。处理器可能出了什么问题?如果不需要,我不想更换处理器。
0