学习STM32F103的定时器功能

描述

踩坑STM32F103系列-----定时器

三勺最近在学习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行,死区时间设置的比波形还长导致一直输出的是低电平。

修正后波形如下:

定时器

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分