簡體   English   中英

STM32 F4 中斷

[英]Interrupt on STM32 F4

當我試圖運行一個簡單的中斷服務例程時,我遇到了硬故障。

我已經初始化了定時器 7:

void configur_TIM7(void);

void configur_TIM7(void){

    RCC->APB1ENR|=RCC_APB1ENR_TIM7EN;
    TIM7->PSC=18000-1;
    TIM7->ARR=10000-1; // Clock set at 180Mhz, so TIM7 triggers each Hz
    TIM7->DIER|=TIM_DIER_UIE;
    NVIC_SetPriority(TIM7_IRQn, 0);
    NVIC_EnableIRQ(TIM7_IRQn);
    TIM7->CR1|=TIM_CR1_CEN;

}

void TIM7_IRQHandler(void){

    TIM7 -> SR=0;
    scaduto=1;

}

如您所見,每次觸發中斷時,處理程序都應將變量“scaduto”設置為 1。 我試圖將“scaduto”定義為 int(而不是 volatile int)。

問題是程序在遇到 SIGTRAP 斷點之前只執行一次迭代。

我主要寫了這個:

int main(void)
{
  /* USER CODE BEGIN 1 */
    MPU_ConfigTypeDef MPU_Config;
  /* 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_USART2_UART_Init();
  MX_I2C1_Init();

  /* USER CODE BEGIN 2 */

    MPU_Config.Clock_Source = INTERNAL_8MHz;
    MPU_Config.Config_Dlpf = DLPF_184A_188G_Hz;
    MPU_Config.Gyro_Full_Scale = FS_SEL_2000;
    MPU_Config.Accel_Full_Scale = AFS_SEL_4g;
    MPU_Config.Sleep_Mode_Bit = 0;  //1: sleep mode, 0: normal mode

    MPU6050_Init(&hi2c1, &MPU_Config); // Initialization - Configuration
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
      return scaduto;
      scaduto=0;


     //scaduto=0;

//    MPU6050_Read_RawData(&Accel_Raw, &Gyro_Raw);
//    MPU6050_Read_ScaledData(&Accel_Scaled, &Gyro_Scaled);
//
//    Acx=Accel_Scaled.x;
//    Acy=Accel_Scaled.y;
//    Acz=Accel_Scaled.z;


    /* USER CODE BEGIN 3 */
  /* USER CODE END 3 */
}
}

(所有MPU的東西都需要在項目的后期)

在此先感謝您的幫助!

首先,在你的 main() 中你做了一些奇怪的事情。

  while (1)
  {
    /* USER CODE END WHILE */
      return scaduto;
      scaduto=0;
      ...
  }

您的 main() function 返回。 它不應該那樣做。 所以刪除 return 語句,它在那里沒有邏輯意義。 到目前為止,您的代碼甚至從未達到MPU6050_Read_RawData 看起來你想在那里有其他東西,但你錯誤地把 return 語句放在那里。 我幾乎可以肯定這就是造成硬故障的原因。

作為旁注,您的計時器(可能)未配置為 1Hz。 定時器的基本時鍾是 APB 時鍾 x2(查看參考手冊的 RCC 部分),它與核心時鍾無關。 所以如果你的 MCU 是 108MHz,但你的 APB 時鍾是 27MHz,那么你的定時器的基本時鍾是 54MHz,你將不得不相應地調整預分頻器和重新加載值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM