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

问题描述 投票:1回答:1

在我的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 spi
1个回答
0
投票

我已经找到原因,所以:

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

STM32F103 SWO and SPI CLK collision

总共,

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

Tnx大家。

© www.soinside.com 2019 - 2024. All rights reserved.