首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >STM32最大中断处理频率

STM32最大中断处理频率
EN

Stack Overflow用户
提问于 2018-04-09 07:42:31
回答 1查看 4.3K关注 0票数 1

我试图实现我自己的SPI通信从FPGA到STM,在其中我的FPGA作为主控,并产生芯片启用和时钟的通信。FPGA在上升的边缘传输数据,在下降的边缘接收数据,我的FPGA代码工作正常。

在STM端,我在中断时捕获这个主时钟,在它上升的边缘接收数据,在它下降的边缘发送数据,但是如果我将时钟速度从250 its提高,通信就不能正常工作。

根据我的理解,STM工作在168兆赫时,我根据168 1mhz设置时钟设置,处理1 1mhz中断不是一个大问题,所以您能指导我如何在STM中处理这个高速时钟吗?

我的代码写在下面

代码语言:javascript
运行
复制
        /*
* 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

       }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 11:23:42

如果没有进入特定的代码,请参阅01的评论,时钟速率问题可以通过假设中对吞吐量的误解来解释。

假设您的STM设备的时钟为168 1Mhz,它可以保持相同的中断吞吐量,而您似乎保守地放松到了1 1Mhz。

然而,它能够支持的中断的吞吐量是由设备处理每个中断所需的时间反比得出的。这一次包括处理器输入服务路由所需的时间(即检测中断、中断当前代码和从向量表解析到何处)以及执行服务例程所需的时间。

让我们非常乐观地说,进入例程需要一个周期,而路由本身则需要3(设置的标志为2,跳出例程则为1)。这给出了在168 the为23.81ns时的4圈,取42 the的逆。这也可以通过将您达到的最大频率(168 the )除以所花费的处理周期数来计算。

因此,我们真正乐观的界限是42 our,但实际上会更低。为了获得更准确的估计,您应该测试您的实现时间,并深入了解设备的文档,以查看中断响应时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49727821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档