第四章:STM32CubeMx定时器基本使用方法 第一步: 具体配置如下图:激活需要使用到的外设定时器,当系统时钟频率为64MHz时,我们希望1MS发生中断一次;就可以把时钟的预分频系数设置为64-1;计数周期设置为1000-1;计数方式为 Up 向上计数,此时得到的中断频率为:64,000,000 /64 /1000 = 1MS = 1Khz ; 第二步: 可以根据自身需要在NVIC 中断控制器中配置中断响应优先级。 第三步: 代码分析: - 先看TIM7的初始化函数:static void MX_TIM7_Init(void)
" k$ I8 A' g# \0 d" }: \ - : m2 @5 _1 A/ ^, A2 [
- e* z" J" {6 U0 ?4 n) e* ~
- static void MX_TIM7_Init(void)
# v: l" q5 O0 w1 D) z$ ? - {4 Z, `4 j0 f$ d
/ [: f, }" _- ^2 I! y% \- /* USER CODE BEGIN TIM7_Init 0 */) z0 F5 _3 \; `7 f, W9 L
- 4 y1 M6 I# Y; r/ ?: L
- /* USER CODE END TIM7_Init 0 */2 n; I3 @/ R- {) u
2 Y0 d; l; i1 E. V% o: O1 D- TIM_MasterConfigTypeDef sMasterConfig = {0};
8 L- \5 r0 `) D+ ]( S - 4 f, q6 {1 S# U( T% Q* h9 d
- /* USER CODE BEGIN TIM7_Init 1 */% E% T% B) \, H5 t
; y. r3 Q5 `% {- /* USER CODE END TIM7_Init 1 */
% _$ g4 U g; I - htim7.Instance = TIM7;
2 \7 w5 ~; I& R/ _: u) u8 ?4 w% e; ]" p - htim7.Init.Prescaler = 64-1;
9 k7 z7 P% P f9 G) A4 ?" h! o: M! m - htim7.Init.CounterMode = TIM_COUNTERMODE_UP;; e) [0 A- z6 }) \
- htim7.Init.Period = 1000-1;
! v$ A- g- t* Y) a0 ?8 M# a, ] - htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
5 J6 G' h! S+ I - if (HAL_TIM_Base_Init(&htim7) != HAL_OK)2 l/ D; W/ n& @$ i. S3 {
- {
, m% K1 m/ J3 ^+ t9 H5 p8 Q( e: ` - Error_Handler();
. x: k! v" d' J - }; w& k. u- W) K& E, X+ S- b3 }
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;8 v; n: i& D+ N. @3 q+ L
- sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
8 F) l1 ~8 o2 N# }8 Q# B2 ~ - if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
) a5 b/ S) u4 q; g - {
, {8 F7 a0 u% g) z; a6 h; Y0 I - Error_Handler();8 I9 [2 I. R/ |. S/ d9 O2 i3 p
- }8 G( z$ g- g8 v. C5 S3 k
- /* USER CODE BEGIN TIM7_Init 2 */
3 S2 Q' N2 r* Z - 4 ]6 @3 r) K- I- R/ }0 S; ^
- - i+ ^" u& F, ~
- //在这这里添加这行代码,意思是初始化完成便开启定时器中断计数
5 U6 }1 i+ a& Q$ }, U( Y - HAL_TIM_Base_Start_IT(&htim7);
6 @ G$ U8 C( [( B8 e+ s4 | -
$ ]! q6 @+ ~$ b$ v4 d - ; F6 G+ d/ W. e. V" S/ k# e
- /* USER CODE END TIM7_Init 2 */. H' o% [' R' Z8 _
- }
复制代码- /* USER CODE BEGIN 4 */
; |. f9 l8 @7 ~+ x$ z3 r - 9 q" ]5 E @( {' |
- //在BEGIN 4 中添加定时器中断服务函数+ ^: }. u9 m8 v6 R# T5 f, N7 H3 B6 t
- w! Z$ O. \& C) L5 J; R& P- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
5 E L# P8 c3 g9 s - {& v1 U9 b* g6 O
- if (htim->Instance == htim7.Instance) //如果是TIM7响应进来的中断
d( c4 ~! D' R4 o3 e - {
) E6 l: f7 q+ k' L' r7 E$ B - MS ++; //前面配置中断更新时间为1MS,那么这里进来一次MS加一次
2 Q0 [6 y9 U o; E; d" y. [ - if(MS == 1000) //当MS加到1000时,即1S3 ~# H' I4 b6 Q$ g+ A6 R' s
- {4 Z) J" N7 z0 }/ u2 A
- HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); //即1S LED翻转一次0 t' j7 E6 H6 \! B0 C2 f' v
- MS =0; //MS用完后记得清0' S, ]* b( X# ^; y, y7 r3 Y
- }
% _- @8 H6 C5 d/ q! F - }
! ]/ [4 }2 w; t+ ~& q. \ - }: g& `4 z7 M! V. ?
- 4 K! K5 y, c6 C, ~- F
- /* USER CODE END 4 */
复制代码 ; ~; A7 x+ n* @
如果能理解到这里,恭喜你已经学会了定制器的基本操作! 文章出处: 电子爱好者 i& ?$ } B4 T7 g9 v& {
|