Das STM32F4 Discovery Board funktioniert nur im DEBUG-Modus

Ich habe mein Projekt mit STMCUBEMX mit CAN-, SPI- und I2C-Peripherie generiert und darüber hinaus etwas codiert. Code fragt im Grunde den CANBUS ab, speichert Daten über i2c in einem IC und sendet die verarbeiteten Daten über den SPI an die angeschlossene Nodemcu.

Es funktionierte so, wie es sollte, bis ich mich entschied, die Arbeit im Debugging-Modus einzustellen und es als eigenständige Schaltung zu verwenden. Nachdem ich den Code geflasht hatte, zog ich das USB-Kabel heraus und steckte es wieder ein. Und dann begannen seltsame Verhaltensweisen. Als ich versuchte, über LEDs zu debuggen, stellte ich fest, dass jede Operation in Bezug auf SPI oder I2C den Code blockiert und nach diesem Punkt keine LED leuchtet. Eine normale Funktion, die nur arithmetische Operationen ausführt und kein Peripheriegerät verwendet, verhindert nicht, dass die LEDs auch die CAN- und Druckknopf-Interrupts funktionieren, wie ich durch die LEDs beobachtet habe (sie funktionieren immer, auch wenn die Schaltung festzustecken scheint). Sobald ich den Code flashe, funktioniert es wieder wie erwartet.

Bisher habe ich versucht:

  • Ändern des Kristalls von High Speed ​​External auf High Speed ​​Internal
  • Stromversorgung des Boards von einer externen Quelle (USB-Kabel an einem Telefonladeadapter angeschlossen.)
  • Umstellung auf ST-Link statt Jlink.
  • Entfernen der SPI- und I2C-Slaves aus der Schaltung durch Abziehen der Kabel.

Da es die Peripheriegeräte sind, die das Problem verursachen, dachte ich, dass es etwas mit Peripherieuhren zu tun haben könnte. Aber nach diesem Punkt blieb ich im Grunde hängen.

Ich benutze ein stm32f4 Discoboard mit 84 MHz. Ich habe meinen Debugger von st-link auf jlink aktualisiert und debugge über die VS-Codeerweiterung cortex-debug

Beginn meiner Main

      int main(void)
    {

      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_CAN1_Init();
  MX_SPI2_Init();
  MX_I2C1_Init();
  InitializeTimer();

  /* USER CODE BEGIN 2 */
  Can_Setup();

  if (HAL_CAN_Start(&hcan1) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);

  uint8_t Atr[64];
  uint16_t AtrLen = sizeof(Atr);
  int sw = smComSCI2C_Open(ESTABLISH_SCI2C, 0x00, Atr, &AtrLen);  // I2c peripheral init function, this is succesfull but not very stable. 
  if(sw == SW_OK)
  {
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12,GPIO_PIN_SET);
  }

    generateIdentity(); // uses i2c, the code stucks after this point
    generateAddress();  // uses i2c
    while(connectWifi() != 0 );  //uses SPI
    getNonce(&storedNonce);  //uses SPI

Meine Uhrfunktion

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage 
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 84;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

System-Init-Funktion

void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
  SystemInit_ExtMemCtl(); 
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */

  /* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}

Ich habe mich in den letzten Tagen mit diesem Thema beschäftigt und die Deadline für das Projekt ist sehr bald. Alle Hilfestellungen werden sehr geschätzt :)

Können Sie Ihr gesamtes Projekt github? Es gibt viele Dinge, die es sein kann.
Als Sie es im Debugger ausgeführt haben, haben Sie alle Haltepunkte entfernt, bevor Sie den Debugger losgeschnitten haben?

Antworten (2)

entfernen Sie das DWT_Delay() Es scheint, dass es die Probleme im Release-Modus verursacht.

Sie müssen sehr vorsichtig sein, wenn Sie HAL_Delay() oder andere Interrupt-basierte Verzögerungen verwenden. HAL_Delay() wird vom SysTick-Timer inkrementiert. Wenn Sie NVIC-Prioritäten anderer Interrupts vor den SysTick-Timer setzen, besteht die Möglichkeit, dass der Timer den Tick im CPU-Zyklus nicht ausführt und somit in einer Endlosschleife hängen bleibt. Stellen Sie sicher, dass bei Verwendung von HAL_Delay der SysTick-Timer eine höhere Priorität als die anderen hat.