STM32 DeInit SPI然后Init SPI再次不起作用

时间:2019-10-02 12:52:29

标签: stm32 spi

在我的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提前提供帮助!

1 个答案:

答案 0 :(得分:0)

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

  1. STM32 HAL库中的所有功能都可以正常工作
  2. 问题完全不同,并且与SWO与SPI CLK线的冲突有关。 (通过添加更多调试输出代码并删除调试器,仅使用UART进行打印就证明了该问题。)

我还发布了有关此事的另一篇文章。

STM32F103 SWO and SPI CLK collision

总而言之,

如果您以STM32Cube相同的方式去初始化SPI并再次进行初始化,那么它将起作用(至少在我看来)。

Tnx每个人。