精华内容
下载资源
问答
  • STM32 的时钟配置比较复杂,而定时器时钟配置更是 ‘奇葩‘。 如下图(截图自STM32F4编程手册)APB的预分频器分频系数如果不为1,则定时器的时钟就倍频了反而。 配置技巧 下面以STM32F4为例, 这里配置定时器8的...

    众所周知

    STM32 的时钟配置比较复杂,而定时器的时钟配置更是 ‘奇葩‘。 如下图(截图自STM32F4编程手册)APB的预分频器分频系数如果不为1,则定时器的时钟就倍频了反而。

    配置技巧

    下面以STM32F4为例, 这里配置定时器8的计数频率为 10Khz,从时钟树中可知TIM8挂在APB2总线

    • 获取当前 APB2(PLCK2) 的时钟频率

    • 获取 APB2 预分频器的分频值

    • 根据上述参数判断,如果分频值不为1,则定时器时钟 x2

    • .Prescaler = xxx 这是一个推荐的写法

    int hw_timer_init(TIM_HandleTypeDef *htim)
    {
        uint32_t FLatency, t8Clk;
        RCC_ClkInitTypeDef clkCfg;
    
        TIM_ClockConfigTypeDef sClockSourceConfig = {0};
        TIM_OC_InitTypeDef sConfigOC = {0};
    
        /* USER CODE BEGIN TIM_Init 1 */
    
        t8Clk = HAL_RCC_GetPCLK2Freq();
        HAL_RCC_GetClockConfig(&clkCfg, &FLatency);
    
        if (clkCfg.APB2CLKDivider != RCC_HCLK_DIV1) {
            t8Clk = HAL_RCC_GetPCLK2Freq() * 2;
        }
    
        /* USER CODE END TIM1_Init 1 */
    
        htim->Instance = TIM8;
        htim->Init.Prescaler =  (t8Clk / 10000) - 1;// 10K
        htim->Init.CounterMode = TIM_COUNTERMODE_UP;
        htim->Init.Period = 0xFFFF;
        htim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
        htim->Init.RepetitionCounter = 0;
        htim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
        HAL_TIM_Base_Init(htim);
        
        ...
        
        return 0;
    }
    ```

    总结

    • 这种配置方法最大的好处就是该定时器不受底层时钟配置的影响,移植性也更好。你甚至都不需要知道当前的具体时钟信息(当然作为一个好的Mcuer你应该知道自己在做什么)。

    • 其实在很多地方我们都可以借鉴这种方法,而不是只会写绝对值。

    展开全文
  • 首先来看一下STM32L151的clock tree, 可以看到TIM2-7是在APB1上的, APB1的最大时钟配置是32MHz, 接下来我的及进行一下我的项目中的始终配置说明,后续也会附上代码。 我的项目中HSE用的是8MHz外部晶振,在项目配置...

    首先来看一下STM32L151的clock tree, 可以看到TIM2-7是在APB1上的, APB1的最大时钟配置是32MHz, 接下来我的及进行一下我的项目中的始终配置说明,后续也会附上代码。

    我的项目中HSE用的是8MHz外部晶振,在项目配置中,我选择了PLLMUL=6,PLLDIV=/3, 这样算下来我的PLLCLK 大小为

    PLLCLK =  8 *6 /3 = 16MHz,然后我选择PLLCLK作为SYSCLKd的时钟源,这样SYSCLK=16MHz, 然后选择AHB(也就是HCLK)的Prescaler = /1, 所以HCLK = 16MHz,  APB1(PCLK1) 和 APB2(PCLK2)都是16MHz, 这样TIM2-7的时钟也是16MHz

    注意:注意下图中,蓝色部分的说明。(下面这个图是截取的F系列的单片机说明,但是原理是一样的),在上图L151系列的途中,也有说明,红色曲折线后面的也说明了 当APB1 prescaler =1时,TIM2-7的时钟等于APB1的时钟,当APB1 prescaler为其他值时,则TIM2-7的时钟为APB1的2倍(✖2).

    有人会问,既然需要 TIM2~7 的时钟频率=32MHz,为什么不直接取 APB1 的预分频系数=1?答
    案是:APB1 不但要为 TIM2~7 提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可
    以在保证其它外设使用较低时钟频率时,TIM2~7 仍能得到较高的时钟频率。
    再举个例子:当 AHB=32MHz 时,APB1 的预分频系数必须大于 2,因为 APB1 的最大频率只能
    为 16MHz。如果 APB1 的预分频系数=2,则因为这个倍频器,TIM2~7 仍然能够得到 32MHz 的
    时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频
    器的初衷。

    下面将配置代码粘贴出来:

    //时钟配置代码:

    void platform_rcc_init(void)
    {
        __IO uint32_t count = 0;   //__IO 是volatile的定义,表示每次使用都要重新重寄存器里取值

        RCC_HSEConfig(RCC_HSE_ON);
        while((RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) && (count != HSE_STARTUP_TIMEOUT)){
            count++;
        }
        if ((RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET)&&(count != HSE_STARTUP_TIMEOUT)){
            FLASH_ReadAccess64Cmd(ENABLE);
            FLASH_PrefetchBufferCmd(ENABLE);
            FLASH_SetLatency(FLASH_Latency_1);
            RCC_HCLKConfig(RCC_SYSCLK_Div1);    //RCC_SYSCLK_Div1:   AHB clock = SYSCLK
            RCC_PCLK2Config(RCC_HCLK_Div1);       //RCC_HCLK_Div1:  APB2 clock = HCLK
            RCC_PCLK1Config(RCC_HCLK_Div1);       //16MHz  RCC_HCLK_Div1:  APB1 clock = HCLK
            //RCC_PLLMul_6: PLL clock source multiplied by 6
            //RCC_PLLDiv_3: PLL Clock output divided by 3
            RCC_PLLConfig(RCC_PLLSource_HSE,RCC_PLLMul_6, RCC_PLLDiv_3); // PLL = 8MHz * 6 /3 =16MHz
            RCC_PLLCmd(ENABLE);
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//RCC_SYSCLKSource_PLLCLK: PLL selected as system clock source
            while(RCC_GetSYSCLKSource() != 0x0C); //  - 0x0C: PLL used as system clock
        }else{
            RCC_HSEConfig(RCC_HSE_OFF);
            RCC_DeInit();
            RCC_HSICmd(ENABLE);
            FLASH_ReadAccess64Cmd(ENABLE);
            FLASH_PrefetchBufferCmd(ENABLE);
            FLASH_SetLatency(FLASH_Latency_1);
            while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
            RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
            while(RCC_GetSYSCLKSource() != 0x04);//- 0x04: HSI used as system clock
        }
    }

    定时器配置代码:

    void Timer_Init(uint16_t Period,uint16_t Prescaler)
    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        NVIC_InitTypeDef NVIC_InitStruct;

        TIM_DeInit(TIM2);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

        TIM_TimeBaseInitStruct.TIM_Period            =  Period-1;
        TIM_TimeBaseInitStruct.TIM_Prescaler       =  Prescaler-1;
        TIM_TimeBaseInitStruct.TIM_CounterMode=  TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_ClockDivision=  TIM_CKD_DIV1;
        //TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);

        TIM_ClearFlag(TIM2,TIM_FLAG_Update);
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

        NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitStruct);

        TIM_Cmd(TIM2,ENABLE);                                      //timer enable
    }
     

    调用Timer_Init(10,1600)得到的就是1ms的定时器设置,可以在定时器中断函数中TIM2_IRQHandler进行相应的定时响应处理。

    定时1ms的计算 = ((1+TIM_prescaler)/16MHz ) * (1+ TIM_Period)

                                = (1+(1600-1)) /16000000  *  (1+(10-1))

                                 = 1600/16000000 * 10

                                 =1/1000  s      也就是1ms

     

    展开全文
  • 关于STM32定时器时钟频率问题

    千次阅读 2019-07-17 14:15:43
    今天用HAL库开发,使用...定时器2是挂载在APB1上的,所以我认为频率应该是42HMZ,然后配置100us中断,500ms使用LED反转,发觉实际LED250ms反转一次,然后查手册,看到这段话。 现在APB1的预分频器为4分频,所以APB...

    今天用HAL库开发,使用cubemx软件配置时钟,如图所示。
    在这里插入图片描述
    看右侧可以知道APB1时钟是42MHZ,APB2时钟是84MHZ,然后需要配置定时器2,通过查看库函数,找到这代码。
    在这里插入图片描述
    定时器2是挂载在APB1上的,所以我认为频率应该是42HMZ,然后配置100us中断,500ms使用LED反转,发觉实际LED250ms反转一次,然后查手册,看到这段话。
    在这里插入图片描述
    现在APB1的预分频器为4分频,所以APB1上的定时器频率为84MHZ,最后解决了这个问题。

    展开全文
  • STM32F407系统&&定时器时钟频率

    千次阅读 2019-11-29 14:26:35
    定时器时钟频率系统时钟定时器时钟 系统时钟 不多BB原理,直接上结果,想要了解原理的详见《STM32F4xx中文参考手册》,它很香 SystemInit 函数是整个设置系统时钟的入口函数,对于使用ST提供的STM32F4固件库的话,会...

    STM32F407系统&&定时器时钟频率

    系统时钟

    不多BB原理,直接上结果,想要了解原理的详见《STM32F4xx中文参考手册》,它很香

    SystemInit 函数是整个设置系统时钟的入口函数,对于使用ST提供的STM32F4固件库的话,会在系统启动之后先执行 main 函数,同时在进入 main 函数之前,首先要调用 SystemInit 系统初始化函数完成系统时钟等相关配置,这个过程设置是在启动文件 startup_stm32f40_41xxx_s 中设置的

    SystemInit 函数中设置的系统时钟大小:
    在这里插入图片描述

    定时器时钟

    • 当APB1的时钟分频数为1的时候,TIM2 ~ TIM7 以及 TIM12 ~ TIM14 的时钟为APB1的时钟,而如果APB1的时钟分频数不为1,那么 TIM2 ~ TIM7 以及 TIM12 ~ TIM14 的时钟频率将为 APB1 时钟的 2 倍

    • 当APB2的时钟分频数为1的时候,TIM1 以及 TIM8 ~ TIM11 的时钟为APB2的时钟,而如果APB2的时钟分频数不为1,那么 TIM1 以及 TIM8 ~ TIM11 的时钟频率将为 APB2 时钟的 2 倍

    各定时器时钟频率:
    在这里插入图片描述

    展开全文
  • 在研究STM32L476的通用定时器时,遇到了一个关于SystemCoreClock值=4000000U的问题,琢磨了好久,终于弄...3、其实这个值在此处只是一个变量定义时的初始值,系统在时钟初始化时会使用上面的方法3进行更新的。在Syst...
  • 定时器时钟

    千次阅读 2016-08-11 21:58:17
    STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。 时钟源问题: 名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在 ...
  • 时钟真的很重要,希望看到的...之前配置PWM都是84M没想那么多,结果一看我配置的是20ms,为啥一直是10ms,我想到了时钟问题,结果一搜索还真的是时钟问题,我一看博主的问题,我当时就知道是我要的答案,因为我当时配
  • 内部的HSI/2经PLLx16,所以最大只能为64MHZ 而外部的选8M经PLL后,可以最大到72Mhz ...HCLK :AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟 经过总线桥AHB--APB,通过设置分
  • STM32f407系统定时器时钟配置、计算

    千次阅读 2017-10-08 15:44:53
    1. 外部晶振的选择 ...系统默认配置为25M,即打开官方库文件参数HSE Frequency(Hz) 一般为25000000 HSE Frequency(Hz) | 25000000 ---------- #if !defined (HSE_VALUE) #define HSE_VALUE ((uint32...
  • STM32中定时器时钟

    千次阅读 2015-11-18 09:45:51
    STM32中定时器时钟源 ... (出处: 单片机论坛) STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补...其它6个为普通定时器时钟由APB1的输出产生。 下图是STM32参考手册上时钟分配图中,有关定时器
  • STM32F407定时器TIM3的时钟频率设置说明时钟树设置相关 时钟树 先是外部时钟,然后/M后变为1MHz,xN后变为366MHz,/P后变为168MHz,此时为SYSCLK时钟频率,经过/1后变为AHB的时钟频率HCLK=SYSCLK,/4后变为APB1时钟...
  • STM32定时器3配置时钟的坑

    千次阅读 2020-06-29 00:38:22
    如果APB1给TIM的时钟是36M的话,我使用3599预分频之后,那分频之后的频率就是 36M/3600=10K (因为是从零开始计数,所以计算使用3600,但是代码里面要用3599)也就是说每计一个数用的时间就是1/10K = 0.0001s = 0.1...
  • 至于时钟频率和进入中断函数时间间隔的计算, 可以参考STM32时钟树和前面章节的计算过程。 配置代码 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1Peri...
  • STC15W4K32S4 系列 T0定时器输出时钟

    千次阅读 2016-03-09 09:31:46
    T0的时钟输出引脚是在T0CLKO/P3.5。...当其为1时,允许T0定时器对外输出时钟,输出时钟频率 = T0溢出率 / 2。当其为0时,不允许T0定时器对外输出时钟。(T0的溢出率是指每秒T0上溢的次数)。  我们还可以选择
  • STM32CUBEMX配置教程(十二)STM32的定时器触发的固定频率ADC采样(使用DMA)
  • 关于STM32的定时器配置时钟分割的问题

    千次阅读 多人点赞 2019-07-19 18:28:47
    愿你的身后总有力量,愿你成为自己的太阳~ 之前学32定时器的部分时,就一直对时钟...STM32的定时器配置中的时钟分割,是与定时器的输入捕获功能和滤波单元相关的。不同的参数代表以不同的采样频率对输入信号进行...
  • STM32CUBEMX配置教程(十三)STM32的定时器触发的固定频率DAC输出(使用DMA)
  • 51单片机定时器的简单配置

    千次阅读 多人点赞 2020-03-29 22:43:12
    51单片机定时器 先上一张图 问就是很有用 定时器有两个功能 定时 和 计数 定时器和计数器是单片机内部的同一个模块...时钟周期:时钟周期 T 是时序中最小的时间单位,具体计算的方法就是 1/时钟频率 我的单片机开...
  • 定时器时钟来源(4个): 1)内部时钟(CK_INT) 2)外部时钟模式 1:外部输入脚(TIx) 3)外部时钟模式 2:外部触发输入(ETR) 4)内部触发输入(ITRx) 定时器的周期计算: psc:预分频系数 (范围...
  • STM8S0 定时器2中断配置

    千次阅读 2018-02-05 16:23:55
    目录: 1.程序:定时器2中断配置、高精度延时函数和LED灯初始化 2.基础知识: 一、程序: #include  #include "timer.h" #include "led.h" //unsigned int ms_count=0;...//1分频,定时器时钟等于系统时钟
  • DSP之时钟定时器之一时钟发生器

    万次阅读 2012-08-15 09:43:29
    时钟定时器包括时钟产生器、通用定时器、实时时钟以及看门狗定时器等。  时钟产生器的功能是产生CPU的工作时钟,并提供CLKOUT时钟输出;通用定时器、实时时钟及看门狗定时器的功能是通过计数器为系统提供定时...
  • STM32CUEB关于KEIL5、stm32f103c8t6时钟配置和LED灯闪烁程序 .
  • STM32定时器1中断配置

    2021-02-04 10:00:56
    ②开启定时器1的时钟 ③设置中断时间=预分频数*自动重装值/72000000(秒) ④配置模式,然后初始化结构体 ⑤配置中断优先级 ⑥使能定时器1 ⑦在定时器1的中断函数中写入相关操作 具体实现 /*TIM1 定时器中断 抢占...
  •  上面的程序实现了在系统时钟为48Mhz、周期为500、分频因子为48、且时钟1分频(就是不分频)时,定时器频率为2000hz(时钟啥的自己配置) Period的范围为0~65535,Prescaler的范围为0~65535  f = (system ...
  • 51单片机定时器、计数器配置

    千次阅读 2020-08-29 19:35:41
    在了解了单片机的时钟频率时钟周期、机器周期之后,显然我们可以知道定时器的工作原理,在此之前我们先算出51单片机的脉冲周期:以f=12MHz为例,12分频 T=1/f ×\times× 12 = 1us。 这时,单片机将计数内部时钟...
  • 定时器 3.1 分类与简介 3.1.1 分类与主要功能特点 3.1.2 三种常用的定时器简介 3.1.3 三种计数模式 3.1.4 定时器计数的原理 3.2 时钟来源 3.3 通用定时器简介 3.4 计数溢出时间公式 3.4 定时器中断的原理 3.5 输入...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,915
精华内容 5,166
关键字:

定时器6的时钟配置频率