我在使用
STM32L051型号芯片结合一个旋转式的8421编码器进行开发时,发现我对GPIO操作会引起LPUART1的结构体中很多参数的变化,最终导致LPUART1瘫痪而无法正常使用,其关键代码如下
- int Lora_ID_Scan(void)
- {
- int LORA_ID = 0;
- LORA_ID_GPIO_Init();
- HAL_GPIO_WritePin(LORA_COM1_GPIO_Port,LORA_COM1_Pin,GPIO_PIN_SET);
- LORA_ID |= HAL_GPIO_ReadPin(LORA_ID_GPIO_Port,LORA_ID_1_Pin) << 0;
- LORA_ID |= HAL_GPIO_ReadPin(LORA_ID_GPIO_Port,LORA_ID_2_Pin) << 1;
- LORA_ID |= HAL_GPIO_ReadPin(LORA_ID_GPIO_Port,LORA_ID_4_Pin) << 2;
- LORA_ID |= HAL_GPIO_ReadPin(LORA_ID_GPIO_Port,LORA_ID_8_Pin) << 3;
- HAL_GPIO_WritePin(LORA_COM1_GPIO_Port,LORA_COM1_Pin,GPIO_PIN_RESET);
- HAL_GPIO_WritePin(LORA_COM2_GPIO_Port,LORA_COM2_Pin,GPIO_PIN_SET);
- LORA_ID |= HAL_GPIO_ReadPin(LORA_ID_GPIO_Port,LORA_ID_1_Pin) << 4;
- LORA_ID |= HAL_GPIO_ReadPin(LORA_ID_GPIO_Port,LORA_ID_2_Pin) << 5;
- LORA_ID |= HAL_GPIO_ReadPin(LORA_ID_GPIO_Port,LORA_ID_4_Pin) << 6;
- LORA_ID |= HAL_GPIO_ReadPin(LORA_ID_GPIO_Port,LORA_ID_8_Pin) << 7;
- LORA_ID_GPIO_DeInit();
- return LORA_ID;
- }
当程序运行到LORA_ID_GPIO_Init();时相关寄存器变化如下
当程序运行到 LORA_ID_GPIO_DeInit(); 时
以下为两个函数的具体实现
- void LORA_ID_GPIO_Init()
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(LORA_COM2_GPIO_Port, LORA_COM2_Pin, GPIO_PIN_RESET);
- HAL_GPIO_WritePin(LORA_COM1_GPIO_Port, LORA_COM1_Pin, GPIO_PIN_RESET);
- /*Configure GPIO pin : PtPin */
- GPIO_InitStruct.Pin = LORA_COM1_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_PULLDOWN;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(LORA_COM1_GPIO_Port, GPIO_InitStruct);
- /*Configure GPIO pin : PtPin */
- GPIO_InitStruct.Pin = LORA_COM2_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_PULLDOWN;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(LORA_COM2_GPIO_Port, GPIO_InitStruct);
- /*Configure GPIO pins : PBPin PBPin PBPin PBPin */
- GPIO_InitStruct.Pin = LORA_ID_2_Pin|LORA_ID_8_Pin|LORA_ID_1_Pin|LORA_ID_4_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_PULLDOWN;
- HAL_GPIO_Init(LORA_ID_GPIO_Port, GPIO_InitStruct);
- }
- void LORA_ID_GPIO_DeInit()
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- GPIO_InitStruct.Pin = LORA_COM1_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(LORA_COM1_GPIO_Port, GPIO_InitStruct);
- GPIO_InitStruct.Pin = LORA_COM2_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(LORA_COM2_GPIO_Port, GPIO_InitStruct);
- GPIO_InitStruct.Pin = LORA_ID_2_Pin|LORA_ID_8_Pin|LORA_ID_1_Pin|LORA_ID_4_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(LORA_ID_GPIO_Port, GPIO_InitStruct);
- }
当我把这个函数注释掉时,他的上层函数在调用这行代码时也会令LPUART1相关寄存器的数值紊乱
- char mybuff[16] = {0};
- int ID = 0xff;
- // int ID = Lora_ID_Scan();
- sprintf(mybuff, "%d", ID);
关键代码为sprintf这行,当调用sprintf后,整个寄存器的数值全部都发生了紊乱