You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F2xx+FreeRTOS+wolfMQTT+DHT11联合运行故障求助

STM32F2xx FreeRTOS+LWIP+wolfMQTT联合运行MQTT任务卡顿问题

环境与目标

基于STM32F2xx平台,使用FreeRTOS(CMSIS_V1)、LWIP和wolfMQTT开发,实现DHT11温湿度数据读取并发布至MQTT Broker。

创建了4个任务:defaultTask、TaskMQTT、TaskSensor、TaskActor,任务创建代码如下:

/* Create the thread(s) */
/* definition and creation of defaultTask */
osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

/* definition and creation of TaskMQTT */
osThreadDef(TaskMQTT, StartTaskMQTT, osPriorityNormal, 0, 512);
TaskMQTTHandle = osThreadCreate(osThread(TaskMQTT), NULL);

/* definition and creation of TaskSensor */
osThreadDef(TaskSensor, StartTaskSensor, osPriorityNormal, 0, 512);
TaskSensorHandle = osThreadCreate(osThread(TaskSensor), NULL);

/* definition and creation of TaskActor */
osThreadDef(TaskActor, StartTaskActor, osPriorityNormal, 0, 512);
TaskActorHandle = osThreadCreate(osThread(TaskActor), NULL);

TaskMQTT任务代码

void StartTaskMQTT(void const * argument)
{
    extern struct netif gnetif;
    char temp_buffer[16];
    char hum_buffer[16];

    MX_LWIP_Init();
    while (!netif_is_link_up(&gnetif)) {
        osDelay(100);
    }

    mqtt_client_t client;
    simple_mqtt_init(&client,
              "192.168.0.71",   // Broker-IP
              1883,             // MQTT-Port
              "stm32_client01", // ClientID
              60);              // Keep-Alive

    if (simple_mqtt_connect(&client) != 0) {
        printf("MQTT Connect failed\n");
        vTaskDelete(NULL);
    }

    simple_mqtt_subscribe(&client, "test/topic", 0);
    simple_mqtt_publish(&client, "test/topic", "Hello World from STM32");

    while (1) {
        //snprintf(temp_buffer, sizeof(temp_buffer), "%.2f", dht.Temperature);
        //snprintf(hum_buffer, sizeof(hum_buffer), "%.2f", dht.Humidity);
        ftoa(dht.Temperature, temp_buffer, 1);
        ftoa(dht.Humidity, hum_buffer, 1);
        simple_mqtt_publish(&client, "test/temperature", temp_buffer);
        simple_mqtt_publish(&client, "test/humidity", hum_buffer);
        simple_mqtt_loop(&client, 100);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

TaskSensor任务代码

基于DHT11单总线驱动实现,代码如下:

void StartTaskSensor(void const * argument)
{
    HAL_DHT11_Init(&dht, DHT11_GPIO_Port, DHT11_Pin, &htim1);
  /* USER CODE BEGIN StartTaskSensor */
  /* Infinite loop */
  for(;;)
  {
      osDelay(1000);
      err = HAL_DHT11_ReadData(&dht);

      if(err != DHT11_OK)
      {
          continue;
      }
      osDelay(1);
  }
    HAL_DHT11_DeInit(&dht);
  /* USER CODE END StartTaskSensor */
}

TaskActor任务代码

void StartTaskActor(void const * argument)
{
  /* USER CODE BEGIN StartTaskActor */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_WritePin(BlueLED_GPIO_Port, BlueLED_Pin, GPIO_PIN_SET);
    //delay_us(50000);
    osDelay(1000);
    HAL_GPIO_WritePin(BlueLED_GPIO_Port, BlueLED_Pin, GPIO_PIN_RESET);
    //delay_us(50000);
    osDelay(1000);
  }
  /* USER CODE END StartTaskActor */
}

问题现象

  • 单独运行MQTT任务或DHT11传感器任务时,功能均正常;
  • 联合运行所有任务时,MQTT任务仅能成功发布2-3次数据后就卡住;
  • TaskActor任务持续正常运行,设备仍可被ping通;
  • DHT11采用单总线协议,读取数据时不能被中断,否则会丢失数据。

已尝试的无效方案

  • 移除DHT11驱动中的__disable_irq();
  • 使用基于DWT的微秒级延时函数:
void delay_us(uint32_t us)
{
    uint32_t start = DWT->CYCCNT;
    uint32_t ticks = us * (SystemCoreClock / 1000000UL);
    while ((DWT->CYCCNT - start) < ticks)
        ;
}
  • 调整任务优先级;
  • 修改任务中的延时时长。

寻求可行的解决方案。


内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:17:22