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. django项目搭建及Session使用

    django+session+中间件 一.使用命令行创建django项目 在指定路径下创建django项目 django-admin startproject djangocommon   在项目目录 ...

  2. Java中的并发工具类:CountDownLatch、CyclicBarrier和Semaphore

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 一. ...

  3. TortoiseSVN教程

    TortoiseSVN使用教程 TortoiseSVN是一个SVN的客户端 1.Checkout Repository 首先要Checkout服务器端的Repository,所谓的Checkout就是 ...

  4. Storm中并行度原来是这样计算的(1.0.1版本)

    ==思考问题1== 向集群提交一个拓扑的时候,Storm是如何计算Task数以及Executor数的? 具体有多少个worker,多少个executor,每个executor负责多少个task? == ...

  5. CSS 伪类和伪元素--pseudo

    总结在前: 0. 参考资料 1. 伪类和伪元素是不同的两种东西. 2. 伪类和伪元素都属于CSS选择器. 3. CSS引入伪类和伪元素是为了实现基于文档树之外的信息,i.e. 段落的第一行,的格式化. ...

  6. 【转载】rabbitmq的发布确认和事务

    地址:https://my.oschina.net/lzhaoqiang/blog/670749 摘要: 介绍confirm的工作机制.使用spring-amqp介绍事务以及发布确认的使用方式.因为事 ...

  7. error: failed to push some refs to 'https://git.oschina.net/bluede/TuShuGuanLi.g it'

    出现了这样的错,可以强制提交 git push -u origin master -f

  8. HDU 6153 A Secret (KMP)

    题意:给定两个串,求其中一个串 s 的每个后缀在另一个串 t 中出现的次数. 析:首先先把两个串进行反转,这样后缀就成了前缀.然后求出 s 的失配函数,然后在 t 上跑一遍,如果发现不匹配了或者是已经 ...

  9. CodeForces 342B Xenia and Spies (水题模拟,贪心)

    题意:给定 n 个间谍,m个区间,一个 s,一个f,然后从 s开始传纸条,然后传到 f,然后在每个 t 时间在区间内的不能传,问你最少的时间传过去. 析:这个题,就模拟一下就好,贪心策略,能传就传,找 ...

  10. 编写高质量代码改善C#程序的157个建议——建议118:使用SecureString保存密钥等机密字符串

    建议118:使用SecureString保存密钥等机密字符串 托管代码中的字符串是一类特殊的对象,它们不可用被改变.每次使用System.String类张的方法之一时,或者使用此类型进行运算时(如赋值 ...