三勺最近在學習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文章
5363瀏覽量
121155 -
中斷
+關注
關注
5文章
900瀏覽量
41746 -
定時器
+關注
關注
23文章
3255瀏覽量
115366 -
STM32F103
+關注
關注
33文章
479瀏覽量
63874
發布評論請先 登錄
相關推薦
評論