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 в режимі подій. Коли процесор поновлюється з WFE, не потрібно очищати біт очікування периферійного переривання або біт очікування каналу NVIC IRQ, оскільки біт очікування, що відповідає рядку події, не встановлений.

Отже, головна мета полягає в тому, щоб увімкнути пробудження, не створюючи переривання або не реагуючи на перебої під час нормальної роботи.

Це не вказано в цьому посібнику, і я не впевнений, наскільки це застосовано до архітектури STM32, але на деяких інших пристроях подібні схеми можуть бути корисні для лову швидких подій без генерування переривань. Наприклад, у вас може бути додаток, у якому важливо визначити, що відбулася подія під мікросекундою, але не потрібно швидко реагувати на неї, щоб ви могли просто перевірити прапор, щоб побачити, чи відбулося воно.

Редагувати: (5/2018) Станом на сьогодні, номер сторінки згаданого тексту - це сторінка 381 (раніше сторінка 377)


1
Так, на PICs здається, що більшість того, що я роблю в перерві, - це встановлені прапори. У Cortex більшість цих прапорів встановлюються без переривання, тому я використовую менше перерв
Скотт Сейдман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.