Timer (計時器) 就是慢慢數時間,在timer內部有一個計數器。

而計數器會數到Register的value當數值數到設定值Timer就會發起IRQ

而程式就會轉跳到中斷向量裡頭去執行想要做的事情。

Timer 計時器配置

 TIM_TimeBaseInitTypeDef TIM3_TimeBase;
TIM3_TimeBase.TIM_ClockDivision = ;
TIM3_TimeBase.TIM_CounterMode = TIM_CounterMode_Up;
TIM3_TimeBase.TIM_Period = ;
TIM3_TimeBase.TIM_Prescaler = - ;
TIM_TimeBaseInit(TIM3, &TIM3_TimeBase);
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

在這段配置裡頭比較重要的是知道啟動Timer的輸入頻率,以及Timer的計數頻率,與設定的週期

有了這些資訊之後我們就知道如何去觸發Timer 的 IRQ

這邊提及一下Timer的輸入頻率跟RCC配置有相關,我們透過Clock Tree可以知道假設啟動Timer的APBx (x = 1/2)

有設定除頻的話,Timer的輸入頻率會是APBx * 2

STM32F407 System clock = 168MHz

APB2 = 42MHz, APB2 = 84MHz

所以我們的初始設定TIM3輸入頻率是 42MHz * 2 = 84MHz

 /* HCLK = SYSCLK / 1*/
RCC->CFGR |= RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK / 2*/
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; /* PCLK1 = HCLK / 4*/
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;

這段程式碼在startup_stm32f4xx.s 已經先配置過一次RCC所以在初始狀態APB1/2頻率如上敘述。

回到Timer多久觸發一次IRQ的計算,目前已知最重要的輸入頻率所以接下來的計算都是靠我們設定的Register去計算

首先在配置IRQ觸發頻率時,通常我們會先確定要用怎樣的頻率去計數這段時間。所以我們會去配置除頻系數

TIM3_TimeBase.TIM_Prescaler = - ;

以這行程式碼而言,我的除頻系數填的是83而我的計數頻率會變成1Mhz

計數頻率 = 84MHz / (83 + 1) = 1Mhz

再來是我要計數的數值就是決定觸發IRQ的關鍵

TIM3_TimeBase.TIM_Period = ;

IRQ觸發頻率 = 1Mhz / (20 + 1) = 47.63KHz

頭過上面的配置Timer就會開始啟動了,但實際要發起IRQ還是要透過中斷機制,所以還是必須配置中斷向量

 NVIC_TIM3.NVIC_IRQChannel                   = TIM3_IRQn;
NVIC_TIM3.NVIC_IRQChannelPreemptionPriority = ;
NVIC_TIM3.NVIC_IRQChannelSubPriority = ;
NVIC_TIM3.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_TIM3);

在Function Block 只用到一小部分 Timer 很強大還有很多細節須要去學習

(STM32F4) Timer 基本操作的更多相关文章

  1. STM32F4 Timer simplified block diagram

    Timers TIM1 and TIM8 use 16-bit counters and are the most complex timers of all timers included in t ...

  2. STM32F4 Timer Internal Trigger Connection

    The Timers can be cascaded to make more complex timing relationships, or longer periods. Internally ...

  3. (STM32F4) Timer Compare mode 操作

    Timer 比較模式(compare) 具體會用在哪種狀況目前還沒有這種經驗,但Compare有配置功能pin想必有應用會用到這個模式 從Function Block來看比較模式比基本Timer多了比 ...

  4. STM32F4 Timer External Clock TI2 Both Edges Demo

    #define CLK_FREQ ( 10000 ) #define CORE_FREQ ( 168000000 ) static void TIM_GPIO_Config( void ) { GPI ...

  5. (STM32F4) 精準的Delay不透過Timer

    從一個厲害的國外工程師看來的delay寫法,使用while loop會使用幾個指令去計算,可能會需要多少時間. while(variable--); 這行代碼執行一次預估會消耗MCU 4 clock ...

  6. 使用SVG基本操作API

    前面的话 本文将详细介绍SVG基本操作API,并使用这些API操作实例效果 基础API 在javascript中,可以使用一些基本的API来对SVG进行操作 [NS地址] 因为SVG定义在其自身的命令 ...

  7. Linux时间子系统之二:Alarm Timer

    一.前言 严格来讲Alarm Timer也算POSIX Timer一部分,包含两种类型CLOCK_REALTIME_ALARM和CLOCK_BOOTTIME_ALARM.分别是在CLOCK_REALT ...

  8. STM32F4 SPI with DMA

    STM32F4 SPI with DMA A few people have requested code, so I thought I’d post the code showing how I’ ...

  9. 78-WS2812-Library (STM32F4)

    78-WS2812-Library (STM32F4) //-------------------------------------------------------------- // File ...

随机推荐

  1. OCFS2 Fencing

    OCFS2 FencingPosted on February 8, 2011 by Abdulhameed Basha I am very excited to start writing my e ...

  2. shiro 权限集成 sessionManager 配置 学习记录(三)

    1.shiro配置文件增加sessionManager管理 <!-- 6.shiro结合Session会话管理器 start --> <bean id="sessionMa ...

  3. svm原理及opencv

    转自http://www.cnblogs.com/justany/archive/2012/11/23/2784125.html

  4. C++ 模板 与 泛型编程

    C++ 模板 与 泛型编程 前言 模板有两种:类模板和函数模板 .模板是泛型编程的基础. 什么叫:泛型编程? 使用独立于特定类型的方式进行编程.也就是我们在编程的时候不明确的写上类型,而是使用一个模板 ...

  5. Solidity智能合约调用智能合约

    来源:https://medium.com/@blockchain101/calling-the-function-of-another-contract-in-solidity-f9edfa921f ...

  6. 详解python包管理器pip安装

    pip对于使用python的朋友并不陌生,当你想安装python模块的时候一定会首先想到它.pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品. 今天来说 ...

  7. ubuntu下学习linux

    ---恢复内容开始--- 查看当前正在运行的进程(ps命令, grep 搜索命令) ps -ef # -e 显示所有进程,环境变量 -f 全格式 也可以用: ps -e -f # 显示所有关于java ...

  8. java程序员修炼之前笔记(前半部分)

    第一部分 用java7做开发 第一章 初始java7 java7中的新特性 switch支持String 支持100_000_000数值表示法 新的异常处理 | 连接多个异常 final Except ...

  9. 编写高质量代码改善C#程序的157个建议——建议76: 警惕线程的优先级

    建议76: 警惕线程的优先级 线程在C#中有5个优先级:Highest.AboveNormal.Normal.BelowNormal和Lowest.讲到线程的优先级,就会涉及线程的调度.Windows ...

  10. 引用数据类型(类)和ArrayList

    引用数据类型(类) 类的类型为两种: 第一种,Java为我们提供好的类,如Scanner类,Scanner类等,这些已存在的类中包含了很多的方法与属性,可供我们使用. 第二种,我们自己创建的类,按照类 ...