forked from unfrozen/stm8_libs
-
Notifications
You must be signed in to change notification settings - Fork 2
/
lib_cap2.c
121 lines (98 loc) · 2.49 KB
/
lib_cap2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
* File name: lib_cap2.c
* Date first: 01/08/2018
* Date last: 10/21/2018
*
* Description: STM8 Library for capture on Timer2
*
* Author: Richard Hodges
*
* Copyright (C) 2018 Richard Hodges. All rights reserved.
* Permission is hereby granted for any use.
*
******************************************************************************
*
* Pinout:
*
* Pin 1, PD4: Timer2 channel 1
*/
#include "stm8s_header.h"
#include "lib_cap2.h"
/******************************************************************************
*
* Capture memory
*/
int cap2_buf[16];
int cap2_last;
int cap2_ovfl;
volatile char cap2_ptr_get;
volatile char cap2_ptr_put;
/******************************************************************************
*
* Set up timer2 for capture
*/
void cap2_init(char prescale)
{
cap2_ptr_get = 0;
cap2_ptr_put = 0;
cap2_ovfl = 0;
cap2_last = 0;
TIM2_IER = TIMx_CC1IE; /* interrupt on input 1 compare */
TIM2_EGR = TIMx_CC1G; /* capture on input 1 */
TIM2_CCMR1 = 1; /* no filter, no PS, IC1 mapped on TI1FP1 */
TIM2_CCER1 = TIMx_CC1P | TIMx_CC1E; /* capture on falling edge */
TIM2_PSCR = prescale; /* prescaler = 2^N */
TIM2_CR1 = TIMx_CEN; /* enable counter, don't reload */
}
/******************************************************************************
*
* Get number of captures waiting
*/
char cap2_count(void)
{
char count;
count = cap2_ptr_put - cap2_ptr_get;
if (count & 0x80) /* pointer wrap */
count += 16;
return count;
}
/******************************************************************************
*
* Get next capture count (wait if needed)
*/
int cap2_get(void)
{
int val;
while (cap2_ptr_get == cap2_ptr_put);
val = cap2_buf[cap2_ptr_get];
cap2_ptr_get++;
cap2_ptr_get &= 0x0f;
return val;
}
/******************************************************************************
*
* Get overflow count
*/
int cap2_overflow(void)
{
return cap2_ovfl;
}
/******************************************************************************
*
* Timer2 capture interrupt
*/
void cap2_isr(void) __interrupt (IRQ_TIM2C)
{
int cap_cur;
char ptr_new;
TIM2_CCER1 ^= TIMx_CC1P; /* change edge polarity */
cap_cur = (TIM2_CCR1H << 8) + TIM2_CCR1L;
cap2_buf[cap2_ptr_put] = cap_cur - cap2_last;
cap2_last = cap_cur;
ptr_new = cap2_ptr_put + 1;
ptr_new &= 15;
if (ptr_new == cap2_ptr_get)
cap2_ovfl++;
else
cap2_ptr_put = ptr_new;
}