STM32脱硝SPI然后再脱硝SPI不';行不通

STM32脱硝SPI然后再脱硝SPI不';行不通,stm32,spi,Stm32,Spi,在我的STM32F103C8T6上,我正在使用SPI进行通信,有一刻我需要禁用它,制作引脚GPIO并将其降低。一段时间后,我们需要从GPIO中释放它们,并将SPI函数返回给它们,然后进行更多的通信 代码是用最新的STM32Cube生成的,所有的工作都是用SPI实现的 这里是C-Pseudo,只是为了先解释一下,下面是用来做工作的函数 main(){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_

在我的STM32F103C8T6上,我正在使用SPI进行通信,有一刻我需要禁用它,制作引脚GPIO并将其降低。一段时间后,我们需要从GPIO中释放它们,并将SPI函数返回给它们,然后进行更多的通信

代码是用最新的STM32Cube生成的,所有的工作都是用SPI实现的

这里是C-Pseudo,只是为了先解释一下,下面是用来做工作的函数

main(){

  HAL_Init();  

  SystemClock_Config();

  MX_GPIO_Init();   

  MX_DMA_Init();  

  MX_ADC1_Init();  

  MX_SPI1_Init();


  while(1){

    SPI1_TURN_OFF();// It seems (maybe) to work because I can use pins as GPIO

    // use gpio pins for some work  

     SPI1_TURN_ON(); // Registers look ok but it doesn't work

     COMMUNICATE_OVER_SPI(); // Does't work

  }

}
这两个函数应该关闭SPI并使其重新启动

static void SPI1_TURN_OFF(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};



  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, PIN_X |PIN_Y, GPIO_PIN_RESET);

  HAL_SPI_DeInit(&hspi1);


  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, PIN_A|PIN_B|PIN_C, GPIO_PIN_RESET);

  GPIO_InitStruct.Pin = PIN_A|PIN_B|PIN_C;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


}

static void SPI1_TURN_ON(void){
      HAL_GPIO_WritePin(GPIOB, PIN_X |PIN_Y, GPIO_PIN_SET);

      HAL_GPIO_DeInit(GPIOB, PIN_A|PIN_B|PIN_C);

      MX_SPI1_Init();
}
我没有使用STM32 HAL文档中描述的一般顺序之外的任何东西,这会出现什么问题

*备注:实际上没有任何其他代码对此进行操作,它在这里的外观遵循业务逻辑中的相同逻辑


感谢Tnx的提前帮助

我已经找到了原因,所以:

  • STM32 HAL库中的所有函数正常工作
  • 问题完全不同,与SWO与SPI-CLK线的碰撞有关。 (通过添加更多调试输出代码和删除调试器以及仅使用UART打印,证明了这个问题)
  • 我又发了一篇关于这件事的帖子

    总而言之

    如果您以STM32Cube相同的方式取消init SPI并再次取消init,它将正常工作(至少在我的情况下)


    Tnx各位。

    请在您的问题中添加
    MX\u SPI1\u Init
    MX\u GPIO\u Init
    。在我看来,您正在重新设计GPIO,但没有为SPI工作重新初始化它。