2016-10-15 19 views
0

私はGPIO割り込みを実装したいと思いますが、実際のサンプルや説明は見つかりませんでした。STM32F3発見 - GPIO割り込みの実装

私はすでにピンに書き込む方法を知っていますが、それほど多くはありませんが、私は実際にはcや​​プログラミング用マイクロコントローラについての知識はありません。

私は単純な例や説明が私を大いに助けます。次のコードは私がすでに持っているものですが、これが正しいかどうかわかりません。周側に

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

:割り込みについて話すとき

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); 

答えて

3

@Mouinはステップを説明しており、HALを既に使用しているので、これらのステップを実行する方法がありますので、STマイクロエレクトロニクスが提供するSTM32CubeMXソフトウェアを使用して構成する方法があります。 (注:STM32ファミリには多くの例があるので、そのリンクを参照することをお勧めします。たとえば、STM32CubeF3パッケージ)。

したがって簡単にダウンロードして、STM32F3ディスカバリボード用の新しいプロジェクトを作成します。 ピン配置タブで

  1. 、MCUは、そのすべてのピンで表示されます。ピンをクリックして、必要な機能を選択するだけです。 PA2ピン上のあなたのケースではGPIO_EXTI2

    enter image description here

  2. は今設定タブを行うに切り替え、最後の列にシステムと呼ばれ、GPIOボタンをクリックしてください。利用可能なオプションは、下の画像を見ることができます。

    enter image description here

  3. 次のステップは、対応する割り込みを有効にすることです。これを行うには、ピン設定ウィンドウを閉じ、システム列から、NVICボタンをクリックします。覚えている場合は、EXTI2がPA2で選択されているので、EXTIライン2のチェックボックスをオンにしてください。ここでも優先順位を設定できます。

    enter image description here


すべてが準備ができて、ユーザーsettignsボタン&#x2192に基づいてソースコードを生成をクリックしてください。 enter image description here。以下のソースファイルがgeneretedされます。gpio.cで

enter image description here

GPIOの設定:stm32f3xx_it.cで

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. 

割り込みサービスrutine:

/** 
* @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の詳細についてreference manualを開き、それがレジスタレベルで行われている方法を知ってGPIOとNVICセクションを読みたい場合。

+0

ありがとう、今、それは動作し、それを理解し、確かにそのリンクを見ていきます。 – Meister96Fels

3

は、一般的に設定するには、2つの主要なものがあり、例えば、立ち上がりエッジのために:あなたは「wating再イベントの種類を設定する必要がありますGPIOでは、タイマーティック...あなたは周辺機器にこのイベントが発生した後にNVICに通知する必要があります。

オン割り込みベクタ側:CPUは割り込みベクタの平均によって通知されますので、割り込みの優先度を設定する必要がありますISRを実行します。

これを正しく行うと、CPUは割り込みが発生するとISRを実行します。

あなたのコードには、NVICの設定はありません。また、NVICとGPIOの間のリンクも忘れています。私はあなたにいくつかの助けを与えることを望む、あなたはインターネットで簡潔なコードを検索することができます。

関連する問題