硬汉嵌入式论坛

 找回密码
 立即注册
查看: 121|回复: 1
收起左侧

[TIMER] STM32H7的定时器应用之高精度单次延迟实现的疑惑

[复制链接]

3

主题

4

回帖

13

积分

新手上路

积分
13
发表于 2025-5-24 16:52:02 | 显示全部楼层 |阅读模式
void bsp_InitHardTimer(void)
{
    TIM_HandleTypeDef  TimHandle = {0};
        uint32_t usPeriod;
        uint16_t usPrescaler;
        uint32_t uiTIMxCLK;
        TIM_TypeDef* TIMx = TIM_HARD;
       
        RCC_TIM_HARD_CLK_ENABLE();                /* 使能TIM时钟 */
       
    /*-----------------------------------------------------------------------
                bsp.c 文件中 void SystemClock_Config(void) 函数对时钟的配置如下:

        System Clock source       = PLL (HSE)
        SYSCLK(Hz)                = 400000000 (CPU Clock)
        HCLK(Hz)                  = 200000000 (AXI and AHBs Clock)
        AHB Prescaler             = 2
        D1 APB3 Prescaler         = 2 (APB3 Clock  100MHz)
        D2 APB1 Prescaler         = 2 (APB1 Clock  100MHz)
        D2 APB2 Prescaler         = 2 (APB2 Clock  100MHz)
        D3 APB4 Prescaler         = 2 (APB4 Clock  100MHz)

        因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = APB1 x 2 = 200MHz;
        因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = APB2 x 2 = 200MHz;
        APB4上面的TIMxCLK没有分频,所以就是100MHz;

        APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1
        APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17

        APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5

        ----------------------------------------------------------------------- */
        if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM15) || (TIMx == TIM16) || (TIMx == TIM17))
        {
                /* APB2 定时器时钟 = 200M */
                uiTIMxCLK = SystemCoreClock / 2;
        }
        else       
        {
                /* APB1 定时器 = 200M */
                uiTIMxCLK = SystemCoreClock / 2;
        }

        usPrescaler = uiTIMxCLK / 1000000 - 1;        /* 分频比 = 1 */
       
        if (TIMx == TIM2 || TIMx == TIM5)
        {
                usPeriod = 0xFFFFFFFF;
        }
        else
        {
                usPeriod = 0xFFFF;
        }

        /*
       设置分频为usPrescaler后,那么定时器计数器计1次就是1us
       而参数usPeriod的值是决定了最大计数:
       usPeriod = 0xFFFF 表示最大0xFFFF微秒。
       usPeriod = 0xFFFFFFFF 表示最大0xFFFFFFFF微秒。
    */
        TimHandle.Instance = TIMx;
        TimHandle.Init.Prescaler         = usPrescaler;
        TimHandle.Init.Period            = usPeriod;
        TimHandle.Init.ClockDivision     = 0;
        TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
        TimHandle.Init.RepetitionCounter = 0;
    TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
       
        if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
        {
                Error_Handler(__FILE__, __LINE__);
        }

        /* 配置定时器中断,给CC捕获比较中断使用 */
        {
                HAL_NVIC_SetPriority(TIM_HARD_IRQn, 0, 2);
                HAL_NVIC_EnableIRQ(TIM_HARD_IRQn);       
        }

    /* 启动定时器 */
        HAL_TIM_Base_Start(&TimHandle);
}

我最近在学习H7定时器的单词计时的内容,我看到   TimHandle.Init.Prescaler  = usPrescaler; 这个分频系数是32,时钟频率应该是200MHz,记一次应该是0.16us。但注释上写的是1us,是我哪里没有注意到吗?
感谢你的帮助!

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-5-25 09:10:55 | 显示全部楼层
这个systemcoreclock变量不是初始的64,通过hal库前面的初始化后会更新为系统时钟大小
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 03:39 , Processed in 0.241728 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表