เหตุการณ์ Stm32 และการขัดจังหวะ


17

ฉันเริ่มเรียนรู้การขัดจังหวะบน stm32 โดยเฉพาะอย่างยิ่งบอร์ดค้นพบ stm32f4 ฉันพบตัวอย่างนี้ซึ่งคุณต้องกดปุ่มเพื่อเริ่มการขัดจังหวะและผลักดันมันอีกครั้งเพื่อหยุดมัน

ในบรรทัดนี้: EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt เราต้องเลือกโหมดอินเตอร์รัปต์หรือโหมดเหตุการณ์ ฉันเปลี่ยนเป็นโหมดกิจกรรม แต่ดูเหมือนว่าจะไม่ทำงานดังนั้นฉันจึงออกมาพร้อมกับข้อสรุปว่าตัวจัดการถูกดำเนินการเมื่อมีการขัดจังหวะเท่านั้น

เหตุใดเราจึงใช้กิจกรรมใน stm32 หากคุณไม่สามารถเรียกใช้รหัสบางอย่างเมื่อเกิดขึ้น

นี่คือรหัส:

        #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)
            {
            }
        }

คำตอบ:


14

บางครั้งการหาคำตอบสำหรับคำถามเหล่านี้สำหรับอุปกรณ์ ARM อาจทำได้ยากกว่าไมโครคอนโทรลเลอร์ที่ง่ายกว่าเพราะข้อมูลมักแพร่กระจายไปทั่วครอบครัวและคู่มือการเขียนโปรแกรมแทนที่จะรวมอยู่ในแผ่นข้อมูล ในกรณีนี้คำตอบจะปรากฏในหน้า 381 ของคู่มืออ้างอิง RM0090 :

STM32F4xx สามารถจัดการเหตุการณ์ภายนอกหรือภายในเพื่อปลุกแกนกลาง (WFE) เหตุการณ์การปลุกสามารถสร้างได้โดย:

  • (ฉันลบรายละเอียดโหมดขัดจังหวะภายนอกปกติ)

  • หรือการกำหนดค่าสาย EXTI ภายนอกหรือภายในในโหมดเหตุการณ์ เมื่อ CPU ดำเนินการต่อจาก WFE ไม่จำเป็นต้องล้างบิตการขัดจังหวะที่รอต่อพ่วงส่วนต่อท้ายหรือบิต NVIC IRQ channel ค้างอยู่เนื่องจากบิตที่ค้างอยู่ที่สอดคล้องกับบรรทัดเหตุการณ์ไม่ได้ถูกตั้งค่า

ดังนั้นจึงดูเหมือนว่าจุดประสงค์หลักคือการเปิดใช้งานการปลุกโดยไม่สร้างการขัดจังหวะหรือต้องตอบโต้การขัดจังหวะระหว่างการทำงานปกติ

มันไม่ได้กล่าวถึงในคู่มือนั้นและฉันไม่แน่ใจว่าการใช้งานกับสถาปัตยกรรม STM32 ได้อย่างไร แต่ในอุปกรณ์อื่น ๆ ที่มีรูปแบบคล้ายคลึงกันนั้นมีประโยชน์ในการจับเหตุการณ์ที่รวดเร็วโดยไม่ทำให้เกิดการขัดจังหวะ ตัวอย่างเช่นคุณอาจมีแอปพลิเคชันที่มีความสำคัญในการจับภาพว่าเกิดเหตุการณ์ย่อยไมโครวินาที แต่ไม่จำเป็นต้องตอบกลับอย่างรวดเร็วเพื่อให้คุณสามารถตรวจสอบการตั้งค่าสถานะเพื่อดูว่ามันเกิดขึ้นหรือไม่

แก้ไข: (5/2018) ณ วันนี้หมายเลขหน้าของข้อความอ้างอิงคือหน้า 381 (ก่อนหน้าหน้า 377)


1
ใช่บน PICs ดูเหมือนว่าสิ่งที่ฉันทำในการขัดจังหวะมากคือการตั้งค่าสถานะ ใน Cortex ธงส่วนใหญ่จะถูกตั้งค่าโดยไม่ต้องขัดจังหวะดังนั้นฉันจึงใช้การขัดจังหวะน้อยลง
Scott Seidman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.