STM32
直播中

李进锋

7年用户 888经验值
私信 关注
[问答]

使用STM32L051结合8421编码器进行开发时,LPUART1瘫痪无法正常使用的原因?

我在使用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后,整个寄存器的数值全部都发生了紊乱

回帖(1)

郝埃连

2024-3-25 17:48:07
STM32L051是一款低功耗微控制器,而8421编码器可能指的是一种BCD(Binary-Coded Decimal)编码器,用于将十进制数转换为二进制数。LPUART1是STM32L0系列的一个低功耗UART(Universal Asynchronous Receiver/Transmitter)接口,用于异步串行通信。
如果在使用STM32L051结合8421编码器进行开发时,LPUART1出现瘫痪无法正常使用的情况,可能有以下几个原因:

  • 配置问题

    • LPUART1的配置可能不正确。检查波特率、数据位、停止位、校验位等参数是否设置正确,并且与通信对端相匹配。
    • 检查时钟源和时钟分频配置是否正确,确保LPUART1有足够的时钟频率。
    • 确保LPUART1的GPIO引脚配置正确,没有与其他外设冲突。
  • 硬件连接问题

    • 检查LPUART1的TX和RX引脚与8421编码器或其他通信设备的连接是否正确,是否有短路或断路。
    • 确保连接线的质量良好,没有损坏或接触不良。
  • 中断处理问题

    • 如果使用了中断来处理LPUART1的接收和发送,检查中断服务程序(ISR)是否正确编写,没有死循环或阻塞操作。
    • 确保中断优先级设置合理,避免中断冲突或优先级倒置。
  • 软件问题

    • 检查相关的驱动程序或固件库是否完整且正确,没有错误或遗漏。
    • 如果使用了操作系统或RTOS(实时操作系统),确保相关的线程或任务调度没有导致LPUART1无法正常访问。
  • 电磁干扰

    • 检查系统是否受到电磁干扰,特别是高频噪声,这可能会影响LPUART1的正常工作。
  • 硬件故障

    • 如果以上都检查无误,可能是STM32L051的LPUART1模块或相关硬件出现故障,需要进一步检查或更换硬件。
为了定位问题,你可以尝试以下步骤:

  • 使用示波器或逻辑分析仪检查LPUART1的TX和RX引脚上的信号,看是否有正常的数据传输。
  • 在代码中添加调试信息,通过串口或其他方式输出关键变量的值,以便观察程序运行过程中的状态。
  • 简化系统配置,逐步排除其他外设或模块的干扰,只保留LPUART1和必要的硬件进行测试。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分