|
第四章:STM32CubeMx定时器基本使用方法 第一步: 具体配置如下图:激活需要使用到的外设定时器,当系统时钟频率为64MHz时,我们希望1MS发生中断一次;就可以把时钟的预分频系数设置为64-1;计数周期设置为1000-1;计数方式为 Up 向上计数,此时得到的中断频率为:64,000,000 /64 /1000 = 1MS = 1Khz ; 第二步: 可以根据自身需要在NVIC 中断控制器中配置中断响应优先级。 第三步: 代码分析: - 先看TIM7的初始化函数:static void MX_TIM7_Init(void)
, w! n+ \1 W/ ?# R - " h$ G- P& i0 j f7 `
- 2 c' K9 o* Y! E9 Z
- static void MX_TIM7_Init(void)
( g) W$ v* V2 }5 P9 Y( k9 g - {& o; C2 X- X9 s& ~) Q j
$ |! u4 f; Z2 g# `- /* USER CODE BEGIN TIM7_Init 0 */
, p9 K$ `/ H! w+ C: C' n; { - . q O' N. N3 ^
- /* USER CODE END TIM7_Init 0 */5 V. z0 s8 u2 a. D3 o. V1 |
- 7 ]2 a8 L' }7 J9 J9 A& q
- TIM_MasterConfigTypeDef sMasterConfig = {0};. W# b( A" n/ g
! c. L a& {- c$ H- /* USER CODE BEGIN TIM7_Init 1 */- j/ F4 n8 u: C5 `1 J# G7 A3 }
! d7 A+ W5 X( c; U+ l- /* USER CODE END TIM7_Init 1 */0 X/ h, `5 ]' A7 b* E5 U: N
- htim7.Instance = TIM7;
/ \! n+ k( j$ b# N9 p$ P) ? - htim7.Init.Prescaler = 64-1;
% ^8 _5 C3 B) k - htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
$ v7 e. N, {: ~( m8 R4 Y3 G - htim7.Init.Period = 1000-1;( E/ |* a4 N0 ?$ T
- htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;: ?& s" n- N' b E( E' I; w
- if (HAL_TIM_Base_Init(&htim7) != HAL_OK)* Y, {0 x8 b: F
- {5 j* U D9 e3 Z7 d
- Error_Handler();
2 ]6 ]; j# L# \- `" ^4 p0 ^ a - }
: E8 X, y5 V4 d# c - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
) B) q+ s. z6 ~8 n, U1 ] - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;* s5 p. A% V8 T6 z) H
- if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)8 E6 q( @) E7 }8 E) z Z5 D5 ]
- {
0 F* l6 e& `8 l- w& r' R - Error_Handler();
; p( }9 o& C4 Q, g) y3 k0 c; _ - }7 a$ M% W4 F, [$ ~6 h% \
- /* USER CODE BEGIN TIM7_Init 2 */
0 a( ~8 g. I' K: c" Y! @ -
7 O8 s, t* M3 t- p1 v -
$ F9 b2 o+ z5 g8 C - //在这这里添加这行代码,意思是初始化完成便开启定时器中断计数( Z& }" T% _% }) C& p
- HAL_TIM_Base_Start_IT(&htim7); 8 B3 F; d( H" E
-
/ c7 i& e _0 p1 M. Q- q -
4 y" E& P: _/ h5 X" j3 x - /* USER CODE END TIM7_Init 2 */6 s9 i/ L. J" l
- }
复制代码- /* USER CODE BEGIN 4 */" E- F# P8 d1 o
- $ E( p- ?8 K4 j
- //在BEGIN 4 中添加定时器中断服务函数% l g+ [; C I5 S5 h$ J
; Y6 L( v2 Y" ~6 c4 x5 R& d: I- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)2 N- F4 [9 o k* Q4 D
- {& \2 {! [8 l, `5 G1 W) a8 J
- if (htim->Instance == htim7.Instance) //如果是TIM7响应进来的中断
/ l+ M7 K# Q0 U( j - {
3 D) K4 U2 ?' q# ~ - MS ++; //前面配置中断更新时间为1MS,那么这里进来一次MS加一次
& V+ c. {* O6 i, t$ y V' l3 M - if(MS == 1000) //当MS加到1000时,即1S
$ T4 H$ k& [' y - {
* t2 L3 {- F) b. P, E - HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); //即1S LED翻转一次
; Q2 U, i3 P: H2 O7 X# T - MS =0; //MS用完后记得清0
& ]3 q8 [2 q6 z - }
3 N+ m. M& \. x$ E: e9 W8 w - }
: Q2 j M) t8 u, C( S; H9 `" s - }: p9 n0 ^( d. D6 C" G' \- I8 x
6 i' G. Q% h5 l2 c% `. \, H* F8 h- /* USER CODE END 4 */
复制代码 3 H6 @$ L: I6 |
如果能理解到这里,恭喜你已经学会了定制器的基本操作! 文章出处: 电子爱好者 ' X4 m' H$ C1 Y
|