在我的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提前提供帮助!
答案 0 :(得分:0)
我已经找到了原因,所以:
我还发布了有关此事的另一篇文章。
STM32F103 SWO and SPI CLK collision
总而言之,
如果您以STM32Cube相同的方式去初始化SPI并再次进行初始化,那么它将起作用(至少在我看来)。
Tnx每个人。