(STM32F4) Timer 基本操作
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 基本操作的更多相关文章
- 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 ...
- STM32F4 Timer Internal Trigger Connection
The Timers can be cascaded to make more complex timing relationships, or longer periods. Internally ...
- (STM32F4) Timer Compare mode 操作
Timer 比較模式(compare) 具體會用在哪種狀況目前還沒有這種經驗,但Compare有配置功能pin想必有應用會用到這個模式 從Function Block來看比較模式比基本Timer多了比 ...
- STM32F4 Timer External Clock TI2 Both Edges Demo
#define CLK_FREQ ( 10000 ) #define CORE_FREQ ( 168000000 ) static void TIM_GPIO_Config( void ) { GPI ...
- (STM32F4) 精準的Delay不透過Timer
從一個厲害的國外工程師看來的delay寫法,使用while loop會使用幾個指令去計算,可能會需要多少時間. while(variable--); 這行代碼執行一次預估會消耗MCU 4 clock ...
- 使用SVG基本操作API
前面的话 本文将详细介绍SVG基本操作API,并使用这些API操作实例效果 基础API 在javascript中,可以使用一些基本的API来对SVG进行操作 [NS地址] 因为SVG定义在其自身的命令 ...
- Linux时间子系统之二:Alarm Timer
一.前言 严格来讲Alarm Timer也算POSIX Timer一部分,包含两种类型CLOCK_REALTIME_ALARM和CLOCK_BOOTTIME_ALARM.分别是在CLOCK_REALT ...
- 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’ ...
- 78-WS2812-Library (STM32F4)
78-WS2812-Library (STM32F4) //-------------------------------------------------------------- // File ...
随机推荐
- 使用 XML-RPC 为 C++ 应用程序启用 Web 服务
http://www.ibm.com/developerworks/cn/webservices/ws-xml-rpc/ 引言 Internet 现在的受欢迎程度越来越高,由于这个原因及其固有的优势, ...
- easyui图标大全
.icon-blank{ background:url('icons/blank.gif') no-repeat; } .icon-add{ background:url('icons/edit_ad ...
- code1068 乌龟棋
暴力显然不行,所以考虑dp 记f[i][j][k][l]为使用i张1,j张2,k张3,l张4所得到的最大分数. 对于每个f[i][j][k][l],都可以由i-1张1,j张2,k张3,l张4所得到, ...
- LA4794 分享巧克力
Sharing Chocolate Chocolate in its many forms is enjoyed by millions of people around the world ever ...
- TCP、UDP、HTTP、SOCKET之间的区别与联系-乾颐堂CCIE
IP:网络层协议: TCP和UDP:传输层协议: HTTP:应用层协议: SOCKET:TCP/IP网络的API. TCP/IP代表传输控制协议/网际协议,指的是一系列协议. TCP和UDP使用IP协 ...
- Python使用日常
#Python中文件夹和文件的判断import os My_Path = "/home/lpworkstudy/Gooddir/" #现在我们判断这个文件夹是否存在 #如果不存在, ...
- 取得MapReduce的Thread Dump
====2016/5/20: 经过上级指示,为了MR性能调优,需要截取MR的服务器的线程堆栈(Thread Dump) 战友介绍的方法是这样的: ①.使用ps命令[ps -ef | grep java ...
- Perl 学习笔记-标量数据
最近学习Perl, 准备看一遍入门指南,关键的东西还是记录下来,以便以后复习和查看参考. 笔记来自<<Perl语言入门第5版>> 1. 在Perl内部,不区分整数值和浮点数值, ...
- Yii2 中国省市区三级联动
1.获取源码:https://github.com/chenkby/yii2-region 2.安装 添加到你的composer.json文件 "chenkby/yii2-region&qu ...
- 一、Numpy基础--数组
(一)Numpy数组对象 Numpy中的nadrray是一个多维数组对象,该对象由两部分组成: 实际的数据 描述这些数据的元数据 大部分的数组操作仅仅修改元数据部分,而不改变底层的实际数据. 数组的数 ...