1 /******************************************************************************************************************************************
2 * 文件名称: SWM320_timr.c
3 * 功能说明: SWM320单片机的计数器/定时器功能驱动库
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.1.0      2017年10月25日
7 * 升级记录:
8 *
9 *
10 *******************************************************************************************************************************************
11 * @attention
12 *
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
17 * -ECTION WITH THEIR PRODUCTS.
18 *
19 * COPYRIGHT 2012 Synwit Technology
20 *******************************************************************************************************************************************/
21 #include "SWM320.h"
22 #include "SWM320_timr.h"
23 
24 
25 /******************************************************************************************************************************************
26 * 函数名称: TIMR_Init()
27 * 功能说明: TIMR定时器/计数器初始化
28 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,有效值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
29 *           uint32_t mode           TIMR_MODE_TIMER 定时器模式    TIMR_MODE_COUNTER 计数器模式
30 *           uint32_t period         定时/计数周期
31 *           uint32_t int_en         中断使能
32 * 输    出: 无
33 * 注意事项: 无
34 ******************************************************************************************************************************************/
TIMR_Init(TIMR_TypeDef * TIMRx,uint32_t mode,uint32_t period,uint32_t int_en)35 void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t int_en)
36 {
37     SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
38 
39     TIMR_Stop(TIMRx);   //一些关键寄存器只能在定时器停止时设置
40 
41     TIMRx->CTRL &= ~TIMR_CTRL_CLKSRC_Msk;
42     TIMRx->CTRL |= mode << TIMR_CTRL_CLKSRC_Pos;
43 
44     TIMRx->LDVAL = period;
45 
46     switch((uint32_t)TIMRx)
47     {
48     case ((uint32_t)TIMR0):
49         TIMRG->IF = (1 << TIMRG_IF_TIMR0_Pos);      //使能中断前清除中断标志
50         TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk;
51         TIMRG->IE |= (int_en << TIMRG_IE_TIMR0_Pos);
52 
53         if(int_en) NVIC_EnableIRQ(TIMR0_IRQn);
54         break;
55 
56     case ((uint32_t)TIMR1):
57         TIMRG->IF = (1 << TIMRG_IF_TIMR1_Pos);
58         TIMRG->IE &= ~TIMRG_IE_TIMR1_Msk;
59         TIMRG->IE |= (int_en << TIMRG_IE_TIMR1_Pos);
60 
61         if(int_en) NVIC_EnableIRQ(TIMR1_IRQn);
62         break;
63 
64     case ((uint32_t)TIMR2):
65         TIMRG->IF = (1 << TIMRG_IF_TIMR2_Pos);
66         TIMRG->IE &= ~TIMRG_IE_TIMR2_Msk;
67         TIMRG->IE |= (int_en << TIMRG_IE_TIMR2_Pos);
68 
69         if(int_en) NVIC_EnableIRQ(TIMR2_IRQn);
70         break;
71 
72     case ((uint32_t)TIMR3):
73         TIMRG->IF = (1 << TIMRG_IF_TIMR3_Pos);
74         TIMRG->IE &= ~TIMRG_IE_TIMR3_Msk;
75         TIMRG->IE |= (int_en << TIMRG_IE_TIMR3_Pos);
76 
77         if(int_en) NVIC_EnableIRQ(TIMR3_IRQn);
78         break;
79 
80     case ((uint32_t)TIMR4):
81         TIMRG->IF = (1 << TIMRG_IF_TIMR4_Pos);
82         TIMRG->IE &= ~TIMRG_IE_TIMR4_Msk;
83         TIMRG->IE |= (int_en << TIMRG_IE_TIMR4_Pos);
84 
85         if(int_en) NVIC_EnableIRQ(TIMR4_IRQn);
86         break;
87 
88     case ((uint32_t)TIMR5):
89         TIMRG->IF = (1 << TIMRG_IF_TIMR5_Pos);
90         TIMRG->IE &= ~TIMRG_IE_TIMR5_Msk;
91         TIMRG->IE |= (int_en << TIMRG_IE_TIMR5_Pos);
92 
93         if(int_en) NVIC_EnableIRQ(TIMR5_IRQn);
94         break;
95     }
96 }
97 
98 /******************************************************************************************************************************************
99 * 函数名称: TIMR_Start()
100 * 功能说明: 启动定时器,从初始值开始计时/计数
101 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
102 * 输    出: 无
103 * 注意事项: 无
104 ******************************************************************************************************************************************/
TIMR_Start(TIMR_TypeDef * TIMRx)105 void TIMR_Start(TIMR_TypeDef * TIMRx)
106 {
107     TIMRx->CTRL |= TIMR_CTRL_EN_Msk;
108 }
109 
110 /******************************************************************************************************************************************
111 * 函数名称: TIMR_Stop()
112 * 功能说明: 停止定时器
113 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
114 * 输    出: 无
115 * 注意事项: 无
116 ******************************************************************************************************************************************/
TIMR_Stop(TIMR_TypeDef * TIMRx)117 void TIMR_Stop(TIMR_TypeDef * TIMRx)
118 {
119     TIMRx->CTRL &= ~TIMR_CTRL_EN_Msk;
120 }
121 
122 /******************************************************************************************************************************************
123 * 函数名称: TIMR_Halt()
124 * 功能说明: 暂停定时器,计数值保持不变
125 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
126 * 输    出: 无
127 * 注意事项: 无
128 ******************************************************************************************************************************************/
TIMR_Halt(TIMR_TypeDef * TIMRx)129 void TIMR_Halt(TIMR_TypeDef * TIMRx)
130 {
131     switch((uint32_t)TIMRx)
132     {
133     case ((uint32_t)TIMR0):
134         TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR0_Pos);
135         break;
136 
137     case ((uint32_t)TIMR1):
138         TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR1_Pos);
139         break;
140 
141     case ((uint32_t)TIMR2):
142         TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR2_Pos);
143         break;
144 
145     case ((uint32_t)TIMR3):
146         TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR3_Pos);
147         break;
148 
149     case ((uint32_t)TIMR4):
150         TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR4_Pos);
151         break;
152 
153     case ((uint32_t)TIMR5):
154         TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR5_Pos);
155         break;
156     }
157 }
158 
159 /******************************************************************************************************************************************
160 * 函数名称: TIMR_Resume()
161 * 功能说明: 恢复定时器,从暂停处继续计数
162 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
163 * 输    出: 无
164 * 注意事项: 无
165 ******************************************************************************************************************************************/
TIMR_Resume(TIMR_TypeDef * TIMRx)166 void TIMR_Resume(TIMR_TypeDef * TIMRx)
167 {
168     switch((uint32_t)TIMRx)
169     {
170     case ((uint32_t)TIMR0):
171         TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR0_Pos);
172         break;
173 
174     case ((uint32_t)TIMR1):
175         TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR1_Pos);
176         break;
177 
178     case ((uint32_t)TIMR2):
179         TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR2_Pos);
180         break;
181 
182     case ((uint32_t)TIMR3):
183         TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR3_Pos);
184         break;
185 
186     case ((uint32_t)TIMR4):
187         TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR4_Pos);
188         break;
189 
190     case ((uint32_t)TIMR5):
191         TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR5_Pos);
192         break;
193     }
194 }
195 
196 /******************************************************************************************************************************************
197 * 函数名称: TIMR_SetPeriod()
198 * 功能说明: 设置定时/计数周期
199 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
200 *           uint32_t period         定时/计数周期
201 * 输    出: 无
202 * 注意事项: 无
203 ******************************************************************************************************************************************/
TIMR_SetPeriod(TIMR_TypeDef * TIMRx,uint32_t period)204 void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period)
205 {
206     TIMRx->LDVAL = period;
207 }
208 
209 /******************************************************************************************************************************************
210 * 函数名称: TIMR_GetPeriod()
211 * 功能说明: 获取定时/计数周期
212 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
213 * 输    出: uint32_t              当前定时/计数周期
214 * 注意事项: 无
215 ******************************************************************************************************************************************/
TIMR_GetPeriod(TIMR_TypeDef * TIMRx)216 uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx)
217 {
218     return TIMRx->LDVAL;
219 }
220 
221 /******************************************************************************************************************************************
222 * 函数名称: TIMR_GetCurValue()
223 * 功能说明: 获取当前计数值
224 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
225 * 输    出: uint32_t              当前计数值
226 * 注意事项: 无
227 ******************************************************************************************************************************************/
TIMR_GetCurValue(TIMR_TypeDef * TIMRx)228 uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx)
229 {
230     return TIMRx->CVAL;
231 }
232 
233 /******************************************************************************************************************************************
234 * 函数名称: TIMR_INTEn()
235 * 功能说明: 使能中断
236 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
237 * 输    出: 无
238 * 注意事项: 无
239 ******************************************************************************************************************************************/
TIMR_INTEn(TIMR_TypeDef * TIMRx)240 void TIMR_INTEn(TIMR_TypeDef * TIMRx)
241 {
242     switch((uint32_t)TIMRx)
243     {
244     case ((uint32_t)TIMR0):
245         TIMRG->IE |= (0x01 << TIMRG_IE_TIMR0_Pos);
246         NVIC_EnableIRQ(TIMR0_IRQn);
247         break;
248 
249     case ((uint32_t)TIMR1):
250         TIMRG->IE |= (0x01 << TIMRG_IE_TIMR1_Pos);
251         NVIC_EnableIRQ(TIMR1_IRQn);
252         break;
253 
254     case ((uint32_t)TIMR2):
255         TIMRG->IE |= (0x01 << TIMRG_IE_TIMR2_Pos);
256         NVIC_EnableIRQ(TIMR2_IRQn);
257         break;
258 
259     case ((uint32_t)TIMR3):
260         TIMRG->IE |= (0x01 << TIMRG_IE_TIMR3_Pos);
261         NVIC_EnableIRQ(TIMR3_IRQn);
262         break;
263 
264     case ((uint32_t)TIMR4):
265         TIMRG->IE |= (0x01 << TIMRG_IE_TIMR4_Pos);
266         NVIC_EnableIRQ(TIMR4_IRQn);
267         break;
268 
269     case ((uint32_t)TIMR5):
270         TIMRG->IE |= (0x01 << TIMRG_IE_TIMR5_Pos);
271         NVIC_EnableIRQ(TIMR5_IRQn);
272         break;
273     }
274 }
275 
276 /******************************************************************************************************************************************
277 * 函数名称: TIMR_INTDis()
278 * 功能说明: 禁能中断
279 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
280 * 输    出: 无
281 * 注意事项: 无
282 ******************************************************************************************************************************************/
TIMR_INTDis(TIMR_TypeDef * TIMRx)283 void TIMR_INTDis(TIMR_TypeDef * TIMRx)
284 {
285     switch((uint32_t)TIMRx)
286     {
287     case ((uint32_t)TIMR0):
288         TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR0_Pos);
289         break;
290 
291     case ((uint32_t)TIMR1):
292         TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR1_Pos);
293         break;
294 
295     case ((uint32_t)TIMR2):
296         TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR2_Pos);
297         break;
298 
299     case ((uint32_t)TIMR3):
300         TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR3_Pos);
301         break;
302 
303     case ((uint32_t)TIMR4):
304         TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR4_Pos);
305         break;
306 
307     case ((uint32_t)TIMR5):
308         TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR5_Pos);
309         break;
310     }
311 }
312 
313 /******************************************************************************************************************************************
314 * 函数名称: TIMR_INTClr()
315 * 功能说明: 清除中断标志
316 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
317 * 输    出: 无
318 * 注意事项: 无
319 ******************************************************************************************************************************************/
TIMR_INTClr(TIMR_TypeDef * TIMRx)320 void TIMR_INTClr(TIMR_TypeDef * TIMRx)
321 {
322     switch((uint32_t)TIMRx)
323     {
324     case ((uint32_t)TIMR0):
325         TIMRG->IF = (0x01 << TIMRG_IF_TIMR0_Pos);
326         break;
327 
328     case ((uint32_t)TIMR1):
329         TIMRG->IF = (0x01 << TIMRG_IF_TIMR1_Pos);
330         break;
331 
332     case ((uint32_t)TIMR2):
333         TIMRG->IF = (0x01 << TIMRG_IF_TIMR2_Pos);
334         break;
335 
336     case ((uint32_t)TIMR3):
337         TIMRG->IF = (0x01 << TIMRG_IF_TIMR3_Pos);
338         break;
339 
340     case ((uint32_t)TIMR4):
341         TIMRG->IF = (0x01 << TIMRG_IF_TIMR4_Pos);
342         break;
343 
344     case ((uint32_t)TIMR5):
345         TIMRG->IF = (0x01 << TIMRG_IF_TIMR5_Pos);
346         break;
347     }
348 }
349 
350 /******************************************************************************************************************************************
351 * 函数名称: TIMR_INTStat()
352 * 功能说明: 获取中断状态
353 * 输    入: TIMR_TypeDef * TIMRx  指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
354 * 输    出: uint32_t              0 TIMRx未产生中断    1 TIMRx产生了中断
355 * 注意事项: 无
356 ******************************************************************************************************************************************/
TIMR_INTStat(TIMR_TypeDef * TIMRx)357 uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx)
358 {
359     switch((uint32_t)TIMRx)
360     {
361     case ((uint32_t)TIMR0):
362         return (TIMRG->IF & TIMRG_IF_TIMR0_Msk) ? 1 : 0;
363 
364     case ((uint32_t)TIMR1):
365         return (TIMRG->IF & TIMRG_IF_TIMR1_Msk) ? 1 : 0;
366 
367     case ((uint32_t)TIMR2):
368         return (TIMRG->IF & TIMRG_IF_TIMR2_Msk) ? 1 : 0;
369 
370     case ((uint32_t)TIMR3):
371         return (TIMRG->IF & TIMRG_IF_TIMR3_Msk) ? 1 : 0;
372 
373     case ((uint32_t)TIMR4):
374         return (TIMRG->IF & TIMRG_IF_TIMR4_Msk) ? 1 : 0;
375 
376     case ((uint32_t)TIMR5):
377         return (TIMRG->IF & TIMRG_IF_TIMR5_Msk) ? 1 : 0;
378     }
379 
380     return 0;
381 }
382 
383 
384 /******************************************************************************************************************************************
385 * 函数名称: Pulse_Init()
386 * 功能说明: 脉宽测量功能初始化
387 * 输    入: uint32_t pulse            PULSE_LOW 测量低脉冲宽度   PULSE_HIGH 测量高脉冲宽度
388 *           uint32_t int_en         是否使能脉冲测量完成中断
389 * 输    出: 无
390 * 注意事项: 无
391 ******************************************************************************************************************************************/
Pulse_Init(uint32_t pulse,uint32_t int_en)392 void Pulse_Init(uint32_t pulse, uint32_t int_en)
393 {
394     SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
395 
396     TIMRG->PCTRL = (0     << TIMRG_PCTRL_CLKSRC_Pos) |      // 系统时钟作为时钟源
397                    (pulse << TIMRG_PCTRL_HIGH_Pos)   |
398                    (0     << TIMRG_PCTRL_EN_Pos);
399 
400     TIMRG->IE |= (1 << TIMRG_IE_PULSE_Pos);     //使能才能查询中断标志
401 
402     if(int_en)  NVIC_EnableIRQ(PULSE_IRQn);
403 }
404 
405 /******************************************************************************************************************************************
406 * 函数名称: Pulse_Start()
407 * 功能说明: 脉宽测量功能启动,测量到脉宽后会自动关闭测量功能
408 * 输    入: 无
409 * 输    出: 无
410 * 注意事项: 无
411 ******************************************************************************************************************************************/
Pulse_Start(void)412 void Pulse_Start(void)
413 {
414     TIMRG->PCTRL |= (1 << TIMRG_PCTRL_EN_Pos);
415 }
416 
417 /******************************************************************************************************************************************
418 * 函数名称: Pulse_Done()
419 * 功能说明: 脉宽测量是否完成
420 * 输    入: 无
421 * 输    出: uint32_t              1 测量已完成    0 测量未完成
422 * 注意事项: 无
423 ******************************************************************************************************************************************/
Pulse_Done(void)424 uint32_t Pulse_Done(void)
425 {
426     if(TIMRG->IF & TIMRG_IF_PULSE_Msk)
427     {
428         TIMRG->IF = TIMRG_IF_PULSE_Msk;     // 清除中断标志
429 
430         return 1;
431     }
432     else
433     {
434         return 0;
435     }
436 }
437