Initial commit, code based on LPC1224 support and LPC812-MAX CMSIS-DAP interface...
[lpc11u3x] / include / drivers / timers.h
1 /****************************************************************************
2  *  drivers/timers.h
3  *
4  * Copyright 2012 Nathael Pajani <nathael.pajani@ed3l.fr>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  *************************************************************************** */
21 #ifndef DRIVERS_TIMERS_H
22 #define DRIVERS_TIMERS_H
24 #include <stdint.h>
26 /***************************************************************************** */
27 /*                Timers                                                       */
28 /***************************************************************************** */
29 /* Four timers are available, Two 16 bits and two 32 bits
30  * All timers have 4 channels though 32 bits timers have all 4 channels available
31  *   on capture /match pins while 16bits ones have only two (channels 0 and 1).
32  */
33 #define NUM_TIMERS 4
34 #define NUM_CHANS 4
36 /* Timer numbers to be used for functions from this driver. */
37 #define LPC_TIMER_16B0  0
38 #define LPC_TIMER_16B1  1
39 #define LPC_TIMER_32B0  2
40 #define LPC_TIMER_32B1  3
43 /* Timer modes for the "mode" timer config structure field */
44 enum lpc_timer_mode {
45         LPC_TIMER_MODE_TIMER = 0,
46         LPC_TIMER_MODE_COUNTER,
47         LPC_TIMER_MODE_CAPTURE,
48         LPC_TIMER_MODE_MATCH,
49         LPC_TIMER_MODE_PWM,  /* Pulse Width Modulation */
50         LPC_TIMER_MODE_PWD,  /* Pulse Width Demodulation */
51 };
53 /* Structure used to pass parameters to configure a timer */
54 /* Notes:
55  * In counter or PWM mode, the config is done using config[0] for enabled channels and config[1] holds
56  *   the channel number used to control PWM cycle.
57  * The field "reset_on_capture" must be set to LPC_COUNTER_CLEAR_ON_EVENT_EN ored with one
58  *   of the LPC_COUNTER_CLEAR_ON_CHAN*_* to activate the clear timer on event functionality
59  */
60 struct timer_config
61 {
62         uint32_t mode; /* Counter, Timer Capture, Timer Match or PWM */
63         uint8_t config[NUM_CHANS]; /* Configure the internal behavior when a capture or a match occurs */
64         uint8_t ext_match_config[NUM_CHANS]; /* Configure the external behavior when a match occurs */
65         uint32_t match[NUM_CHANS]; /* The match values if the timer is used in match mode */
66         uint32_t reset_on_capture;
67 };
71 /* Start the timer :
72  * Remove the reset flag if present and set timer enable flag.
73  * Timer must be turned on and configured (no checks done here).
74  */
75 void timer_start(uint32_t timer_num);
76 void timer_continue(uint32_t timer_num);
78 /* Pause the timer counter, does not reset */
79 void timer_pause(uint32_t timer_num);
81 /* Stop and reset the timer counter */
82 void timer_stop(uint32_t timer_num);
84 /* Resets the timer and lets it count again imediately */
85 void timer_restart(uint32_t timer_num);
87 uint32_t timer_get_capture_val(uint32_t timer_num, uint32_t channel);
89 uint32_t timer_get_counter_val(uint32_t timer_num);
91 /* Change the match value of a single timer channel */
92 void timer_set_match(uint32_t timer_num, uint32_t channel, uint32_t val);
94 /***************************************************************************** */
95 /*   Timer Setup */
96 /* Returns 0 on success
97  * Takes a timer number and a timer config structure as arguments.
98  * Refer to timer config structure for details.
99  * Note: use of channel 3 for PWM cycle length is enforced.
100  */
101 int timer_setup(uint32_t timer_num, const struct timer_config* conf);
105 /* Power up a timer.
106  * Note that clkrate should be a divider of the main clock frequency chosed
107  *   for your application as it will be used to divide the main clock to get
108  *   the prescaler value.
109  * Set clkrate to 0 to disable the prescaler.
110  * callback is used for all the possible timer interrupts (activated using the
111  *   config field in timer_config struct upon timer setup)
112  *   The interrupt flags are passed to the interrupt routine as argument.
113  */
114 void timer_on(uint32_t timer_num, uint32_t clkrate, void (*callback)(uint32_t));
116 /* Removes the main clock from the selected timer block */
117 void timer_off(uint32_t timer_num);
119 #endif /* DRIVERS_TIMERS_H */