簡體   English   中英

STM32F3 發現 - 實現 GPIO 中斷

[英]STM32F3 Discovery - Implement GPIO-Interrupt

我想實現一個 GPIO 中斷,但我不知道如何實現,我也沒有找到真正的示例或解釋。

我已經知道如何寫入 Pins,但不多,請考慮我對 c 或編程微控制器沒有任何了解。

一個簡單的例子或解釋會對我有很大幫助。 以下代碼是我已有的,但我不確定這是否正確。

GPIO_InitTypeDef   GPIO_InitStructure;
GPIO_InitStructure.Pin = GPIO_PIN_2;
GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;

HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);

由於@Mouin 已經為您描述了這些步驟並且您已經在使用 HAL,這里是如何執行這些步驟,因此使用 ST Microelectronics 提供的STM32CubeMX軟件對其進行配置的方法。 (注意:建議瀏覽該鏈接,因為 STM32 系列有很多示例,例如 STM32CubeF3 包。)

因此,簡要下載它,為 STM32F3 探索板創建一個新項目。

  1. Pinout選項卡上,將顯示 MCU 及其所有引腳。 只需單擊一個引腳並選擇您想要的功能。 在您的情況下,PA2 引腳上的GPIO_EXTI2

    在此處輸入圖片說明

  2. 現在切換到配置選項卡,並在名為System的最后一列中,單擊GPIO 按鈕 可用選項如下圖所示:

    在此處輸入圖片說明

  3. 下一步是使能相應的中斷。 為此,請關閉Pin Configuration窗口並從System列中單擊NVIC 按鈕 如果您還記得,已在 PA2 上選擇了EXTI2 ,因此請勾選EXTI line2啟用復選框 您也可以在此處設置優先級。

    在此處輸入圖片說明


一切就緒,點擊Generate source code based on user settigns按鈕 → 在此處輸入圖片說明 . 將生成以下源文件:

在此處輸入圖片說明

gpio.c 中的 GPIO 配置:

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOA_CLK_ENABLE();

  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

  /*Configure GPIO pin : PA2 */
  GPIO_InitStruct.Pin = GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI2_TSC_IRQn, 0, 0); // <--- This and
  HAL_NVIC_EnableIRQ(EXTI2_TSC_IRQn); // <--- this are what were missing for you.

stm32f3xx_it.c 中的中斷服務程序:

/**
* @brief This function handles EXTI line2 and Touch Sense controller.
*/
void EXTI2_TSC_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI2_TSC_IRQn 0 */

  /* USER CODE END EXTI2_TSC_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
  /* USER CODE BEGIN EXTI2_TSC_IRQn 1 */

  /* USER CODE END EXTI2_TSC_IRQn 1 */
}

這是觸發中斷時將調用的內容,它將調用 GPIO2 的 IRQ 處理程序,如果一切正常,將調用以下回調。 您必須在此處編寫處理程序代碼。

/**
* @brief Interrupt callback for GPIOs
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if ( GPIO_Pin == GPIO_PIN_2)
    {
        // Write your code here
    }
}

您必須手動添加前一部分(回調),它只有一個弱聲明,但不會生成。 您可以將它放在 stm32f3xx_it.c 中。


如果您想了解有關 MCU 的更多信息,請打開參考手冊並閱讀 GPIO 和 NVIC 部分以了解它是如何在寄存器級別完成的。

通常,在談論中斷時,需要配置 2 個主要內容:

CPU +------+ Interrupt Vector (NVIC) +--------+ Peripheral

在外設方面:您必須配置您正在等待的事件類型:例如 GPIO 的上升沿、計時器滴答聲......此外,一旦發生此事件,您必須告訴外設通知 NVIC

在中斷向量方面:CPU 將通過中斷向量得到通知,所以在這里,基本上,您必須配置中斷的優先級和要執行的 ISR。

如果您正確執行此操作,一旦發生中斷,CPU 將執行 ISR。

在您的代碼中沒有 NVIC 的配置,您也忘記了 NVIC 和 GPIO 之間的鏈接。 我希望我能給你一些幫助,你可以在互聯網上搜索簡潔的代碼。

暫無
暫無

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

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