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)启动非中断模式,测试计数器是否正常递增。 - 时序与配置验证:
- 暂时注释
__HAL_TIM_SET_COUNTER(&htim10, 15),启动定时器后延迟1秒再读取计数器,看数值是否变化; - 直接读取寄存器
TIM10->CNT替代__HAL_TIM_GET_COUNTER宏,排除宏定义解析问题。
- 暂时注释
- CubeMX配置遗漏:重新检查CubeMX中TIM10的配置页面:
- 确认时钟树中APB2总线时钟配置正确(STM32F446的APB2最高84MHz);
- 确认TIM10的“Counter Mode”设置为向上计数,预分频器、自动重装载值与代码一致;
- 检查是否有其他外设占用TIM10资源,或时钟使能选项未勾选。
内容的提问来源于stack exchange,提问作者Nguyen Huy
相关产品推荐
相关产品推荐

