Stm32 Acara dan interupsi


17

Saya mulai mempelajari interupsi pada stm32 khususnya papan penemuan stm32f4. saya menemukan contoh ini di mana Anda harus menekan tombol untuk memulai interupsi dan tekan lagi untuk menghentikannya.

Pada baris ini: EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt kita harus memilih mode interupsi atau mode peristiwa. Saya mengubahnya ke mode acara tetapi tampaknya tidak berfungsi. Jadi saya keluar dengan kesimpulan bahwa handler dijalankan dengan interupsi saja.

Mengapa kita kemudian menggunakan Acara di stm32 jika Anda tidak dapat menjalankan beberapa kode ketika itu terjadi?

Ini kodenya:

        #include "stm32f4xx.h"
        #include "stm32f4xx_syscfg.h"
        #include "stm32f4xx_rcc.h"
        #include "stm32f4xx_gpio.h"
        #include "stm32f4xx_exti.h"
        #include "misc.h"



        EXTI_InitTypeDef   EXTI_InitStructure;

        void EXTILine0_Config(void);
        void LEDInit(void);


        void ExtInt(void)
        {

          LEDInit();

          /* Configure EXTI Line0 (connected to PA0 pin) in interrupt mode */
          EXTILine0_Config();

          /* Generate software interrupt: simulate a rising edge applied on EXTI0 line */
          EXTI_GenerateSWInterrupt(EXTI_Line0);

          while (1)
          {
          }
        }

        /**
          * @brief  Configures LED GPIO.
          * @param  None
          * @retval None
          */
        void LEDInit()
        {
          GPIO_InitTypeDef  GPIO_InitStructure;

          /* Enable the GPIO_LED Clock */
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

          /* Configure the GPIO_LED pin */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOD, &GPIO_InitStructure);
        }

        /**
          * @brief  Configures EXTI Line0 (connected to PA0 pin) in interrupt mode
          * @param  None
          * @retval None
          */
        void EXTILine0_Config(void)
        {

          GPIO_InitTypeDef   GPIO_InitStructure;
          NVIC_InitTypeDef   NVIC_InitStructure;

          /* Enable GPIOA clock */
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
          /* Enable SYSCFG clock */
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

          /* Configure PA0 pin as input floating */
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
          GPIO_Init(GPIOA, &GPIO_InitStructure);

          /* Connect EXTI Line0 to PA0 pin */
          SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

          /* Configure EXTI Line0 */
          EXTI_InitStructure.EXTI_Line = EXTI_Line0;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);

          /* Enable and set EXTI Line0 Interrupt to the lowest priority */
          NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
        }

        /**
          * @brief  This function handles External line 0 interrupt request.
          * @param  None
          * @retval None
          */
        void EXTI0_IRQHandler(void)
        {
          if(EXTI_GetITStatus(EXTI_Line0) != RESET)
          {
            /* Toggle LED1 */
            GPIO_ToggleBits(GPIOD, GPIO_Pin_12);

            /* Clear the EXTI line 0 pending bit */
            EXTI_ClearITPendingBit(EXTI_Line0);
          }
        }

        /**
          * @}
          */

        /**
          * @}
          */

        /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

        int main(void)
        {

            while(1)
            {
            }
        }

Jawaban:


14

Kadang-kadang menemukan jawaban untuk pertanyaan-pertanyaan ini untuk perangkat ARM bisa lebih sulit daripada mikrokontroler sederhana karena informasi sering tersebar di seluruh keluarga dan panduan pemrograman daripada dimasukkan dalam lembar data. Dalam hal ini jawabannya tampaknya ada di halaman 381 dari manual Referensi RM0090 :

STM32F4xx mampu menangani peristiwa eksternal atau internal untuk membangunkan inti (WFE). Acara bangun dapat dihasilkan baik oleh:

  • (Saya telah menghapus detail mode interupsi eksternal normal)

  • atau mengkonfigurasi jalur EXTI eksternal atau internal dalam mode acara. Saat CPU melanjutkan dari WFE, tidak perlu menghapus bit pending interupsi periferal atau bit NVIC IRQ pending bit karena bit pending yang sesuai dengan garis acara tidak diatur.

Jadi, tampaknya tujuan utamanya adalah untuk mengaktifkan wakeups tanpa menghasilkan interupsi atau harus menanggapi interupsi selama operasi normal.

Itu tidak disebutkan dalam panduan itu dan saya tidak yakin bagaimana berlaku untuk arsitektur STM32 tetapi pada beberapa perangkat skema serupa dapat berguna untuk menangkap peristiwa cepat tanpa menghasilkan interupsi. Misalnya, Anda mungkin memiliki aplikasi di mana penting untuk menangkap bahwa peristiwa sub-mikrodetik telah terjadi, tetapi tidak perlu merespons dengan cepat sehingga Anda hanya dapat memeriksa bendera untuk melihat apakah itu terjadi.

Sunting: (5/2018) Mulai hari ini, jumlah halaman dari teks yang direferensikan adalah halaman 381 (sebelumnya halaman 377)


1
Ya, pada PIC sepertinya banyak dari apa yang saya lakukan dalam interupsi adalah mengatur flag. Di Cortex, sebagian besar bendera ditetapkan tanpa harus mengganggu, jadi saya menggunakan lebih sedikit interupsi
Scott Seidman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.