Arm STM32最大中断处理频率

Arm STM32最大中断处理频率,arm,microcontroller,spi,interrupt-handling,mikroc,Arm,Microcontroller,Spi,Interrupt Handling,Mikroc,我正在尝试实现我自己的从FPGA到STM的SPI通信,其中我的FPGA充当主控,并生成用于通信的芯片启用和时钟。FPGA在上升沿传输数据,在下降沿接收数据。我的FPGA代码工作正常 在STM端,我在中断时捕获主时钟,并在上升沿接收数据,在下降沿传输数据,但如果我将时钟速度从250khz提高,则通信无法正常工作 据我所知,STM工作在168兆赫,我根据168Mhz设置时钟设置,1mhz中断的处理不是一个大问题,所以你能告诉我如何在STM中处理这个高速时钟吗 我的代码写在下面 /*

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

在STM端,我在中断时捕获主时钟,并在上升沿接收数据,在下降沿传输数据,但如果我将时钟速度从250khz提高,则通信无法正常工作

据我所知,STM工作在168兆赫,我根据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

       }
}
/*
*项目名称:
EXTI_中断(EXTI中断测试)
*版权所有:
(c) Mikroelektronika,2011年。
*修订历史:
20111226:
-初始释放;
*说明:
此代码演示如何在PD10上使用外部中断。
PD10是click1插座的外部中断引脚。
从每个上升沿的mosi线接收数据。
*测试配置:
MCU:STM32F407VG
http://www.st.com/st-web- 
ui/static/active/en/resource/technical/document/datasheet/DM00037051.pdf
开发板:用于STM32的EasyMX PRO
http://www.mikroe.com/easymx-pro/stm32/
振荡器:HSI-PLL,140.000MHz
外部模块:-
SW:mikroC PRO用于ARM
http://www.mikroe.com/mikroc/arm/
*注:
从每个上升沿的mosi线接收32位数据
*/
//D10时钟
//D2 ss
//C0 MOSI
//C1旗
int read=0;
int flag_int=0;
int-val=0;
int rec_数据[32];
int index_rec=0;
int display_index=0;
int flag_dint=0;
void exet()iv IVT_INT_EXTI15_10 ics_AUTO{
EXTI_PR.B10=1;//清除标志
flag_int=1;//中断时的标志
}
TFT_Init_ILI9340();
void main(){
GPIO\ U数字\ U输入(&GPIOD\ U基座,\ GPIO\ U引脚掩码\ U 10);
GPIO_Digital_输出(&GPIOD_BASE,_GPIO_PINMASK_13);//将端口D设置为
数字输出
GPIO_数字_输出(&GPIOD_基,_GPIO_PINMASK_12);//将端口D设置为
数字输出
GPIO_Digital_输出(&GPIOD_BASE,_GPIO_PINMASK_14);//将端口D设置为
数字输出
GPIO_Digital_输出(&GPIOD_BASE,_GPIO_PINMASK_15);//将端口D设置为
数字输出
GPIO_数字_输入(&GPIOA_IDR,_GPIO_PINMASK_0);//将PA0设置为
数字输入
GPIO_数字_输入(&GPIOC_IDR,_GPIO_PINMASK_0);//将PA0设置为
数字输入
GPIO_数字_输入(&GPIOC_IDR,_GPIO_PINMASK_2);//将PA0设置为
数字输入
GPIO_数字_输出(&GPIOC_IDR,_GPIO_PINMASK_1);//将PA0设置为
数字输入
//中断寄存器
SYSCFGEN_bit=1;//为备用引脚启用时钟
功能
SYSCFG_EXTICR3=0x00000300;//映射PD10上的外部中断
EXTI_RTSR=0x00000000;//在上升沿设置中断
(无)
EXTI_FTSR=0x00000400;//设置下降沿中断
(PD10)
EXTI_IMR |=0x00000400;//设置掩码
//NVIC_IntEnable(IVT_INT_EXTI15_10);//启用外部中断
而(1)
{
//直到我按下按钮,中断才被启用
if((GPIOD_ODR.B2==0)和&(flag_dint==0))
{if(按钮(&GPIOA_IDR,0,1,1))
{
延迟μms(100);
GPIOC_ODR.B1=1;//FPGA的状态
NVIC_IntEnable(IVT_INT_EXTI15_10);//启用外部中断
}
}
if(flag_int==1)
{
//上升沿上的功能
flag_int=0;

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

假设STM设备的时钟为168Mhz,它可以维持相同的中断吞吐量,这似乎是保守地放宽到1Mhz

然而,它能够支持的中断吞吐量是由设备处理每个中断所需的时间的倒数给出的。这一时间包括处理器进入服务路由所需的时间(即检测中断、中断当前代码和从向量表解析跳转到何处)加上执行服务例程所需的时间

让我们非常乐观地说,进入例程需要1个周期,路由本身需要3个周期(2个用于设置的标志,1个用于跳出例程)。这使得168Mhz下的4个周期为23.81ns,取反42Mhz。这也可以通过除以您将达到的最大频率(168Mhz)来计算按处理所花费的周期数


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

老实说,我不明白您在做什么。您的硬件有一堆硬件SPI,但你试着把你自己的软件做一个。代码很糟糕。你错过了很多挥发性物质,代码有延迟,你读了EXTI中断中的按钮,这一切都很糟糕。了解一下你的硬件,然后重新开始这个项目。