SPI写STM32的速度很慢

纳撒尼尔(Nathaniel Brochu)

我目前正在编写代码,以逐像素写入LCD屏幕。该代码可以正常工作,但是处理代码的速度非常慢。目的只是在LCD屏幕上写数字,所以我使用带有“ for循环”功能的“开关”功能来读取我将激活的每个位。我想知道是否有人可以告诉我一种加快我的代码速度的方法...

int * switch_library_number_1(int num,int octet){

switch(num)
{

case 0 : ;
    int number_0 [] = {0x80, 0x08,
              0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88,
              0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, ...};

        int * pNumber_0 = &number_0[octet];

        return pNumber_0;
          break;

case 1 : ;
    int number_1 [] = {0x80, 0x08,
              0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, ...};

    int * pNumber_1 = &number_1[octet];

    return pNumber_1;
      break;
}

然后上升到这样的九个,我认为您不需要看起来所有情况。另外,即使我删除了大多数,我也有522字节的数字。其余代码如下:

int main(void)
{
ADC_Initialization();
SPI_Initialization();
int nombre_octet = 522;
int premier_nombre;
int deuxieme_nombre;

while(1)
{
    GPIOA->BSRRL = CS;
    for(int i = 0; i < nombre_octet; i++)
    {
        write_spi(*switch_library_number_1(0, i));
    }
    GPIOA -> BSRRH = CS;

    for(int i = 0; i < 100; i++)
            {
            }

    GPIOA->BSRRL = CS;
    for(int i = 0; i < nombre_octet; i++)
    {
        write_spi(*switch_library_number_2(1, i));
    }
    GPIOA -> BSRRH = CS;

    }
}

最后,这是write_SPI函数,但是由于它很简单,所以我认为这不是问题。

void write_spi(char data)
{
    SPI1->DR = data;

    while (!(SPI1->SR & SPI_I2S_FLAG_TXE));
    while (!(SPI1->SR & SPI_I2S_FLAG_RXNE));
    while (SPI1->SR & SPI_I2S_FLAG_BSY);
}

提前致谢!

我非常喜欢将代码分成三个片段的方式。我可以为每个建议改进之处:

switch_library_number_1()

  • 这可能只是一个二维数组,number[][]或者如果number_0number_1......是相同长度的不是,它可能是指向这些数组。需要检查有效num有效期offset这可能是较小的速度改进。
  • 您的number_0...数组当前处于堆栈中,并且是可读写的。制作它们const,这样他们就不会使用RAM。
  • 当前,您正在返回指向堆栈上内存位置的指针-如果运气和偶然的原因,这通常不起作用。如果超出定义范围(功能),则不应访问堆栈数据。static const这样可以保证安全,因为它不再在堆栈中了。

主循环

  • switch_library_number_1/2每次循环迭代都调用有点奇怪您知道您的数据将只是数组。write_spi(number[0][i]);如果number正确设置了数组,则可能会被替换这应该使您有一些速度上的改进,因为它极大地简化了数据获取。
  • 您似乎有一个忙循环。这是一个棘手的做法(我敢打赌,这100是个猜测,请注意编译器可以优化此循环)。如果可能,请使用某些库提供的延迟功能或计时器来获取精确的延迟。这是SPI从设备的实际要求吗?

write_spi(char数据)

  • char应该在unsigned char这里。chars可能是带符号的,也可能是无符号的,所以当您将它们用作字节(不是实际的字符串字符)时,应指定带符号。
  • 您似乎在等待每个字节的传输完成,这是安全的,但是有点慢。通常,可以将其重写为的更快替代方案wait_for_SPI_ready_for_TX; SPI_TX,您只需等待发送下一个字节。请注意,在再次拉高CS之前,您还需要等待字节完全传输。这可能是一个很大的速度改进。

需要考虑的其他事项:

  • 实际的SPI时钟是多少?如果增加时钟,可能会大大提高速度。
  • 您如何衡量它“慢”?它是否指向缓慢的代码部分(那是什么呢?如果从C语言中看不出来,它们将汇编成什么?)
  • 您是否有示波器/逻辑分析仪来查看电线上的实际信号?这可以提供有用的数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章