簡體   English   中英

STM32最大中斷處理頻率

[英]STM32 maximum interrupt handling frequency

我正在嘗試實現自己的從FPGA到STM的SPI通信,其中我的FPGA作為MASTER並生成芯片使能和時鍾以進行通信。 FPGA在其上升沿發送數據並在其下降沿接收數據,我的FPGA代碼正常工作。

在STM端,我在中斷時捕獲此主時鍾,並在其上升沿接收數據,並在其下降沿發送數據,但是如果我將時鍾速度從250khz提高到了正常,通信將無法正常進行

據我了解,STM在168 Mega hz上工作,我根據168Mhz設置時鍾設置,處理1MHz中斷不是什么大問題,所以您能指導我如何在STM中處理此高速時鍾嗎?

我的代碼寫在下面

        /*
* Project name:
  EXTI_interrupt (EXTI interrupt test)
* Copyright:
  (c) Mikroelektronika, 2011.
* Revision History:
  20111226:
   - Initial release;
* Description:
 This code demonstrates how to use External Interrupt on PD10.
 PD10 is external interrupt pin for click1 socket.
 receive data from mosi line in each rising edge.
* Test configuration:
 MCU:             STM32F407VG
                  http://www.st.com/st-web- 

 ui/static/active/en/resource/technical/document/datasheet/DM00037051.pdf
 dev.board:       EasyMX PRO for STM32
                  http://www.mikroe.com/easymx-pro/stm32/
 Oscillator:      HSI-PLL, 140.000MHz
 Ext. Modules:    -
 SW:              mikroC PRO for ARM
                  http://www.mikroe.com/mikroc/arm/
* NOTES:
  receive 32 bit data from mosi line in each rising edge
*/
          //D10 clk
          //D2 ss
          //C0 MOSI
          //C1 FLAG



   int read=0;
 int flag_int=0;
int val=0;
int rec_data[32];
 int index_rec=0;
 int display_index=0;
 int flag_dint=0;



void ExtInt() iv IVT_INT_EXTI15_10 ics ICS_AUTO {
EXTI_PR.B10 = 1;                     // clear flag
flag_int=1; //Flag on interrupt

}

TFT_Init_ILI9340();

void main() {


GPIO_Digital_Input(&GPIOD_BASE, _GPIO_PINMASK_10);
GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_13); // Set PORTD as 
digital output
GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_12); // Set PORTD as 
digital output
GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_14); // Set PORTD as 
digital output
GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_15); // Set PORTD as    
digital output


  GPIO_Digital_Input(&GPIOA_IDR, _GPIO_PINMASK_0);         // Set PA0 as 
  digital input
  GPIO_Digital_Input(&GPIOC_IDR, _GPIO_PINMASK_0);         // Set PA0 as 
  digital input
  GPIO_Digital_Input(&GPIOC_IDR, _GPIO_PINMASK_2);         // Set PA0 as 
 digital input
  GPIO_Digital_Output(&GPIOC_IDR, _GPIO_PINMASK_1);         // Set PA0 as 
 digital input

 //interupt register
SYSCFGEN_bit = 1;                    // Enable clock for alternate pin 
functions
SYSCFG_EXTICR3 = 0x00000300;         // Map external interrupt on PD10
EXTI_RTSR = 0x00000000;              // Set interrupt on Rising edge 
(none)
EXTI_FTSR = 0x00000400;              // Set Interrupt on Falling edge 
(PD10)
EXTI_IMR |= 0x00000400;              // Set mask
//NVIC_IntEnable(IVT_INT_EXTI15_10);   // Enable External interrupt

while(1)
{


        //interrupt is not enable until i push the button
                     if((GPIOD_ODR.B2==0)&&(flag_dint==0))

             {                            if (Button(&GPIOA_IDR, 0, 1, 1))
                                  {
                                       Delay_ms(100);
                                       GPIOC_ODR.B1=1;     //Status for FPGA
                                           NVIC_IntEnable(IVT_INT_EXTI15_10);   // Enable External interrupt
                                   }


              }

            if(flag_int==1)
             {
    //functionality on rising edge
                          flag_int=0;

                      if(index_rec<31)
                      {

                //display data on led
                                   GPIOD_ODR.B13=    GPIOC_IDR.B0;
//save data in an array                     
 rec_data[index_rec]=  GPIOC_IDR.B0;
   //read data

                              index_rec=index_rec+1;
                      }
                      else
                      {
                             flag_dint=1;
                               NVIC_IntDisable(IVT_INT_EXTI15_10);
                      }





}                           // Infinite loop

       }
}

在不涉及特定代碼的情況下,請參閱PeterJ_01的注釋,時鍾速率問題可以由對吞吐量的誤解來解釋。

您假定假設您的STM設備的時鍾為168Mhz,則它可以維持相同的中斷吞吐量,而您似乎已經保守地放松到了1Mhz。

但是,它能夠支持的中斷吞吐量是設備處理每個中斷所花費時間的倒數。 該時間包括處理器進入服務路由所花費的時間(即檢測中斷,中斷當前代碼並從向量表中解析到要跳轉到的位置)和執行服務例程所花費的時間。

讓我們超級樂觀地說,進入例程需要1個周期,而路由本身需要3個周期(2個用於設置的標志,1個用於退出例程)。 這給出4個周期,即168Mhz為23.81ns,取倒數42Mhz。 這也可以通過將您將獲得的最大頻率(168Mhz)除以處理所花費的周期數來計算。

因此,我們真正的樂觀界限是42Mhz,但實際上會更低。 為了獲得更准確的估計,您應該測試實現時序並深入查看設備文檔以查看中斷響應時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM