[英]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 探索板創建一個新項目。
在Pinout選項卡上,將顯示 MCU 及其所有引腳。 只需單擊一個引腳並選擇您想要的功能。 在您的情況下,PA2 引腳上的GPIO_EXTI2
:
現在切換到配置選項卡,並在名為System的最后一列中,單擊GPIO 按鈕。 可用選項如下圖所示:
下一步是使能相應的中斷。 為此,請關閉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.