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

STM32F446RE开发板Timer10计数异常问题求助

STM32F446RE Timer10计数器始终返回0问题排查

我正在使用STM32F446RE开发板运行一个LoRa发送项目,尝试配置并使用Timer10进行计数。采用STM32CubeMX生成初始化代码,已在system_clock.c中配置Timer10时钟,但完成定时器初始化并启动后,调用__HAL_TIM_GET_COUNTER始终返回0,希望找出操作中的错误。

以下是main.c文件代码:

#include "radio.h"
#include <cstdio>

#if defined(SX128x_H)
    #define BW_KHZ              200
    #define SPREADING_FACTOR    7
    #define CF_HZ               2487000000
    #define TX_DBM              6
#else
    #if defined(SX126x_H)
        #define TX_DBM              (Radio::chipType == CHIP_TYPE_SX1262 ? 20 : 14)
    #else
        #define TX_DBM              20
    #endif
    #define BW_KHZ              125
    #define SPREADING_FACTOR    7
    #define CF_HZ               915000000
#endif

/**********************************************************************/
EventQueue queue(4 * EVENTS_EVENT_SIZE);

TIM_HandleTypeDef htim10;
static void MX_TIM10_Init(void)
{

  /* USER CODE BEGIN TIM10_Init 0 */

  /* USER CODE END TIM10_Init 0 */

  /* USER CODE BEGIN TIM10_Init 1 */

  /* USER CODE END TIM10_Init 1 */
  htim10.Instance = TIM10;
  htim10.Init.Prescaler = 0;
  htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim10.Init.Period = 65535;
  htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  //htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim10) != HAL_OK)
  {
    printf("Error Error\r\n");
  }
  /* USER CODE BEGIN TIM10_Init 2 */

  /* USER CODE END TIM10_Init 2 */

}


void tx_test()
{
    static uint8_t seq = 0;

    Radio::radio.tx_buf[0] = seq++;  /* set payload */
    Radio::Send(1, 0, 0, 0);   /* begin transmission */
    printf("sent\r\n");

/*    {
        mbed_stats_cpu_t stats;
        mbed_stats_cpu_get(&stats);
        printf("canDeep:%u ", sleep_manager_can_deep_sleep());
        printf("Uptime: %llu ", stats.uptime / 1000);
        printf("Sleep time: %llu ", stats.sleep_time / 1000);
        printf("Deep Sleep: %llu\r\n", stats.deep_sleep_time / 1000);
    }*/
}

void txDoneCB()
{
    printf("got-tx-done\r\n");
    queue.call_in(500, tx_test);
}

void rxDoneCB(uint8_t size, float rssi, float snr)
{
}


void radio_irq_callback()
{
    queue.call(Radio::service);
}


const RadioEvents_t rev = {
    /* DioPin_top_half */   radio_irq_callback,
    /* TxDone_topHalf */    NULL,
    /* TxDone_botHalf */    txDoneCB,
    /* TxTimeout  */        NULL,
    /* RxDone  */           rxDoneCB,
    /* RxTimeout  */        NULL,
    /* RxError  */          NULL,
    /* FhssChangeChannel  */NULL,
    /* CadDone  */          NULL
};

int main()
{
    printf("\r\nreset-tx ");

    Radio::Init(&rev);

    Radio::Standby();
    Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1);
    Radio::SetChannel(CF_HZ);

    Radio::set_tx_dbm(TX_DBM);

               // preambleLen, fixLen, crcOn, invIQ
    Radio::LoRaPacketConfig(8, false, true, false);
    MX_TIM10_Init();
    HAL_TIM_Base_Start_IT(&htim10);
    HAL_Delay(500);
    __HAL_TIM_SET_COUNTER(&htim10, 15);
    uint16_t timer_val = __HAL_TIM_GET_COUNTER(&htim10);

    printf("timer value = %d", timer_val);


    queue.call_in(500, tx_test);

    queue.dispatch();
}

可能的问题及解决方法

  • TIM10外设时钟未正确使能:检查HAL_TIM_Base_Init函数实现,确认是否包含__HAL_RCC_TIM10_CLK_ENABLE()语句;若没有,手动在MX_TIM10_Init的USER CODE BEGIN TIM10_Init 1或2区域添加该语句,强制开启TIM10时钟。
  • 启动方式干扰计数:当前使用HAL_TIM_Base_Start_IT启动中断模式,但基础定时器计数无需中断即可运行。先替换为HAL_TIM_Base_Start(&htim10)启动非中断模式,测试计数器是否正常递增。
  • 时序与配置验证:
    1. 暂时注释__HAL_TIM_SET_COUNTER(&htim10, 15),启动定时器后延迟1秒再读取计数器,看数值是否变化;
    2. 直接读取寄存器TIM10->CNT替代__HAL_TIM_GET_COUNTER宏,排除宏定义解析问题。
  • CubeMX配置遗漏:重新检查CubeMX中TIM10的配置页面:
    • 确认时钟树中APB2总线时钟配置正确(STM32F446的APB2最高84MHz);
    • 确认TIM10的“Counter Mode”设置为向上计数,预分频器、自动重装载值与代码一致;
    • 检查是否有其他外设占用TIM10资源,或时钟使能选项未勾选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:10:28