三勺最近在学习STM32F103的定时器功能,本文主要解释在配置通用、基本、高级定时器寄存器实现相应功能时遇到的一些问题。
目标一:基本定时器的1ms定时功能
根据技术手册设置:
1/**
2 * @brief 定时器6 1ms定时
3 * @param None
4 * @retval None
5 */
6void Cbsp::time::time_basic(void)
7{
8 mod.nvic.MY_NVIC_Init(3,3,TIM6_IRQn,2);
9 //=====定时器6时钟======//
10 RCC- >APB1ENR |= 1< < 4;
11
12 //=====定时器6初始化=====//
13 //-自动装载-//
14 TIM6- >CR1 |= 1< < 7;
15
16 //-更新中断使能-//
17 TIM6- >DIER |= 1< < 0;
18 //-设置计数周期-//
19 //TIM6- >CNT = 1000;
20 //-自动重装寄存器-//
21 TIM6- >ARR = 1000-1;
22 //-预分频寄存器-//
23 TIM6- >PSC = 36-1;
24 //-开启计数器使能-//
25 TIM6- >CR1 |= 1< < 0;
26}
在中断服务函数中翻转GPIOC13的电平。
使用逻辑分析仪分析:
现象1 :根据逻辑分析仪的采样结果,发现定时时间并不是1ms,而实2ms。
原因和步骤 :按照计算公式APB1的时钟为36M,定时器6设置36分频,每次累加的时间为1us,ARR寄存器为1000,则定时时间为1ms。出现这种情况唯一的可能就是定时器的时钟频率是72M导致的。
查看数据手册的时钟章节框图可以发现端倪,在APB136M时钟后,由于满足了APB1预分配不为1的条件,定时器时钟进行了倍频。
因此修改定时器的分配系数为72-1,再用逻辑分析仪抓取波形,定时时间正确。
目标二:高级定时器3路互补输出+死区
根据技术手册设置:
1void Cbsp::time::tim_senior_PWM(void)
2{
3 RCC- >APB2ENR |= 1< < 2;//*A*//
4 RCC- >APB2ENR |= 1< < 3;//*B*//
5
6 //=====初始化GPIO=====//
7 GPIOA- >CRH = 0;
8 GPIOB- >CRH = 0;
9 GPIOA- >CRH |= 0x0B< < (8-8)*4;
10 GPIOA- >CRH |= 0x0B< < (9-8)*4;
11 GPIOA- >CRH |= 0x0B< < (10-8)*4;
12 GPIOB- >CRH |= 0x0B< < (13-8)*4;
13 GPIOB- >CRH |= 0x0B< < (14-8)*4;
14 GPIOB- >CRH |= 0x0B< < (15-8)*4;
15
16 //=====开启定时器1时钟=====//
17 RCC- >APB2ENR |= 1< < 11;
18 //=====配置定时器 时基单元=====//
19
20 //+预分频寄存器+//
21 TIM1- >PSC = 72-1;
22 //+自动重装载值+//
23 TIM1- >ARR = 100 -1;
24 //+捕获/比较寄存器+//
25 //-设置为PWM1模式-//
26 TIM1- >CCMR1 |= (0x6)< < (4);
27 TIM1- >CCMR1 |= (0x6)< < (12);
28 TIM1- >CCMR2 |= (0x6)< < (4);
29 //-使能预装在寄存器-//
30 TIM1- >CCMR1 |= (1)< < (11);
31 TIM1- >CCMR1 |= (1)< < (3);
32 TIM1- >CCMR2 |= (1)< < (3);
33
34 //-开启自动重装载允许位-//
35 TIM1- >CR1 |= (0x1)< < 7;
36 //设置向上计数//
37 TIM1- >CR1 &= ~((0x1)< < 4);
38 //设置时钟分频因子
39 //TIM1- >CR1 |= ((0x2)< < 8);
40
41 //+开启通道输出+//
42 TIM1- >CCER |= 1< < 0;//CC1
43 TIM1- >CCER |= 1< < 4;//CC2
44 TIM1- >CCER |= 1< < 8;//CC3
45
46 TIM1- >CCER |= 1< < 2;//CC1N
47 TIM1- >CCER |= 1< < 6;//CC2N
48 TIM1- >CCER |= 1< < 10;//CC3N
49
50 //-设置各通道占空比-//
51 TIM1- >CCR1 = 50;
52 TIM1- >CCR2 = 10;
53 TIM1- >CCR3 = 10;
54 //产生更新事件
55 TIM1- >EGR |= 1< < 0;
56
57 //-死区时间设置-//
58 TIM1- >BDTR |= ((0x7)< < 5);
59 TIM1- >BDTR |= 1;
60 //-主输出使能-//
61 TIM1- >BDTR |= ((0x1)< < 15);
62 //-开启定时器-//
63 TIM1- >CR1 |= (0x1)< < 0;
64}
现象: 一点波形也没有,都是低电平。
原因和步骤:
第一,代码的第61行MOE位主输出使能,忘记设置。
第二,代码的第58、59行,死区时间设置的比波形还长导致一直输出的是低电平。
修正后波形如下:
-
寄存器
+关注
关注
31文章
5336浏览量
120224 -
中断
+关注
关注
5文章
898浏览量
41468 -
定时器
+关注
关注
23文章
3246浏览量
114713 -
STM32F103
+关注
关注
33文章
477浏览量
63597
发布评论请先 登录
相关推荐
评论