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