1

我想知道 HAL 库中是否有一个用户可定义的内置 ISR 函数,该函数在 STM32L4xx MCU 上的 SPIx Rx 缓冲区中接收到一个字节后立即触发?例如,作为启动测试,我想通过 SPI2 从主 STM32L452 核板发送一个字节(0xBC)到从站 STM32L452 核板。一旦从板接收到该字节,它就会闪烁 LED2,并将不同的字节 (0xCD) 发送回主板。一旦主机接收到字节,它会闪烁 LED2 作为确认。我已将两块板初始化为主/从,启用 DMA 和全局中断,使用 MXcube 每次传输 8 位。我可以使用 HAL_SPI_Transmit_DMA() 和 HAL_SPI_Receive_DMA() 函数和写入主程序的 while(1) 部分的延迟来实现我想要的(如下所示)。然而,

主码:

   uint8_t spiDataReceive = 0;
   uint8_t spiDataTransmit = 0xBC;

   while(1) {
       if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) {
             //Transmit byte 0xBC to Slave and Receive Response
             HAL_SPI_Transmit_DMA(&hspi2, &spiDataTransmit, 1);
             HAL_Delay(20);
             HAL_SPI_Receive_DMA(&hspi2, &spiDataReceive, 1);

             if(spiDataReceive == 0xCD) {
                 flashLED2();
                 spiDataReceive = 0x00;
             }
        }
   }

奴隶代码:

 uint8_t spiDataReceive = 0;
 uint8_t spiDataTransmit = 0xCD;

 while(1) {
      HAL_SPI_Receive_DMA(&hspi2, &spiDataReceive, 1);
      HAL_Delay(10);

      if(spiDataReceive == 0xBC) {
         HAL_SPI_Transmit_DMA(&hspi2, &spiDataTransmit, 1);
         flashLED2();
         spiDataReceive = 0x00;
      }
 }
4

2 回答 2

1

不需要图书馆。您需要在 SPI CR 寄存器中设置 RNEIE 位并在 NVIC 中启用中断。2行代码。不需要图书馆。

唯一需要的资源是 STM 网站上的参考手册。

于 2020-04-21T19:17:15.697 回答
0

是的,HAL 提供用户回调。为了使用这些,您必须在 NVIC 中激活相应的中断并让中断向量表调用 HAL 处理程序(也请查看stm32l4xx_it.c)。

但在这样做之前,您应该考虑以下问题:

  • 如果您对 ST HAL 库的复杂性感到困惑或沮丧,请阅读参考手册并遵循 P__J__ 的建议(请参阅其他答案)。如果您对硬件接口的复杂性感到困惑或沮丧,请遵循目前的答案。

  • 两者都HAL_SPI_Transmit_DMA()支持HAL_SPI_Transmit_IT()可变数量的传输字节。如果您只需要一个字节的传输,那么 HAL 函数可能是一种矫枉过正。它们的优点是您可以运行一些 C 库函数,而无需处理 C 中的硬件寄存器访问(如果这对您来说很新,来自 arduino 生态系统)。当然,当您扩展应用程序时,通过同一接口传输多个字节。

  • 您应该决定是要从与 UART 绑定的 DMA 获取中断,还是要避免 DMA 并从 UART 本身获取中断。从我的角度来看,您真的不应该通过用于启动 DMA 传输以获取数据的同一中断事件触发 ISR!

  • 与您在控制器的参考手册数据表中找到硬件寄存器的描述相同 ,您可以在STM32L4/L4+ HAL 和低的用户手册中找到有关 HAL 的文档(分层概念、使用要求等) 层驱动程序 (参见第 70 和 102 节,以及第 3 章)。当然,这个接口主要是为了抽象和可移植性,而直接寻址硬件接口通常在延迟/CPU负载和ROM/RAM使用方面有更好的效率。“低级”库驱动程序旨在进行某种妥协,但如果您对整个主题不熟悉并且不确定从什么开始,您应该从硬件寄存器接口或可移植 HAL 库 API 开始。

  • 如果规范文档(HW 或 Lib 描述)对您来说过于抽象,并且您更喜欢一些动手信息源,您可能需要先查看 STM32CubeL4 的 STM32Cube 固件示例这些还包括可用于 NUCLEO-L4532RE(和其他)并在应用笔记 AN4726(第 16 页)中描述的SPI 数据交换用例(SPI_FullDuplex_ComIT例如)。


除了中断选择/处理之外,您还应该检查程序的另外两个方面:

  • 如果您从硬件获得中断,则没有理由进行HAL_Delay()调用。

  • 请记住,在 SPI 上,您只能在主机传输数据(可能是零数据)时将数据从从机“返回”到主机。否则,从机端的“发送”调用只会将数据放入TX寄存器,SPI外设将无限等待来自主机的SCK触发……

于 2020-04-25T14:54:52.813 回答