前言
, z: r! y1 B. E, m5 z! i用FreeRTOS内核来检测CPU使用率,需要用一个定时器来记录单片机运行时间。(STM32F407通用定时器标准库开发)* o- F' S: H: P. b7 l$ l
9 J9 R6 r! t1 r [2 i" h! F
一、如何配置定时器频率?
' h; d; @) @. `# o% i1.芯片手册中获取关键信息
$ ?. E) s& Z6 E# G4 P0 m0 r% h我的大致理解是:从RCC获取TIMxCLK频率的脉冲,在经过控制器,再通过预分频器控制CNT COUNTER递增等动作。
* ]# `, c7 O1 @( I0 b' B. i
4 s7 Y7 s) `- r; p' B) K
2 P+ M5 @7 J, N/ Z) T4 B8 r& Z y" a% Z1 h0 N. x2 Z, e7 Q
) ?: R8 m4 [/ C1 c$ j X
4 o# \. u7 O5 y在手册里的时钟树里找到了APB总线给定时器提供时钟,我的F407用的TIM6,在APB1总线上(查手册系统架构可看)168Mhz的主频已经被4分频,
" C- Z# n( j* j- S# `3 }. a( ?! [' P% a* \9 e
% e; G& M6 i/ L$ Q) E: \7 p& u' E5 q
7 M* z0 n8 g: S2 }" v1 t3 l可知:现在TIMxCLK为84Mhz,我们定时器要获得20000hz即可。再配置预分频器即可。
# v1 S- ]$ `* F* G1 G下面开始操作起来
$ D; ~* ]9 h' {. n+ B- j0 B. L2 W0 r( _" p
2.用标准库配置定时器, F6 v! c2 n+ U% `" H) j g
代码如下(示例):- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
, S5 ]- W- t; \' B8 d
) e o7 [# l3 B7 s1 S& _/ o- // 开启TIMx_CLK6 H0 S5 M1 ~5 ~& y& w
- RCC_APB1PeriphClockCmd(BASIC_TIM_CLK, ENABLE);
: }/ ^+ T3 s/ J2 X7 {; q) J - ) [. a- T* L( S" M+ z9 F
- /* 累计 TIM_Period个后产生一个更新或者中断*/
# @7 l" R- A! G2 [4 J7 B x3 o1 b - //当定时器从0计数到19,即为20次,为一个定时周期" ^4 l: ~0 w, }' x% r
- TIM_TimeBaseStructure.TIM_Period = 20-1; ( Y. h, h) |9 _. ]" g; v$ \7 b
2 s( v; |& W; Z2 p: o1 y- //定时器时钟源TIMxCLK = APB2CLK/4*2 = 84Mhz
- H) O6 H) ~: p5 P/ v - // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=1MHz
9 t0 L# ~2 C1 f) I7 w - TIM_TimeBaseStructure.TIM_Prescaler = 84-1;
3 d- a/ A2 k3 \& L* b1 x - , j/ y# X3 Y6 f; M
- // 初始化定时器TIMx
; D" [6 j- Z6 B/ X S: W - TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);
复制代码 7 e3 b' E6 D! `. W' o
这样就实现了定时器 20000Hz 中断。(中断部分未上传)
0 s% b9 o1 N* s* B( F' r/ G, g. @; Y5 {————————————————
1 l8 m% ^- q& b6 S9 T版权声明:梦想当极客的小芦
, ?2 z2 k; N6 g
8 y% G& u7 ~. ~5 ]
l, e* s; j# K0 w! A- S, G" V+ F |