embox

Форк
0
/
at91_timer_counter.c 
71 строка · 1.9 Кб
1
/**
2
 * @file
3
 * @brief Timer Counter interface realization
4
 *
5
 * @date
6
 * @author Anton Kozlov
7
 */
8

9
#include <stdint.h>
10
#include <stdbool.h>
11
#include <stddef.h>
12
#include <assert.h>
13

14
#include <drivers/at91sam7s256.h>
15
#include <drivers/timer_counter/at91_timer_counter.h>
16

17
#include <hal/reg.h>
18

19

20
void tc_init(uint8_t channel) {
21
	assert(channel < 3);
22
	REG_STORE(AT91C_PMC_PCER, (1L << (AT91C_ID_TC0 + channel)));
23
}
24

25
void tc_config_input(uint8_t channel, uint32_t clock_mode) {
26
	assert(channel < 3);
27
	REG_ORIN(((uint8_t *) AT91C_TC0_CMR) + channel * sizeof(AT91S_TCB),
28
			clock_mode);
29
}
30

31
void tc_reset(uint8_t channel) {
32
	//assert(channel < 3);
33
	REG_STORE(((uint8_t *) AT91C_TC0_CCR) + channel * sizeof(AT91S_TCB),
34
			AT91C_TC_CLKEN | AT91C_TC_SWTRG);
35
}
36

37
uint32_t tc_counter_value(uint8_t channel) {
38
	//assert(channel < 3);
39
	return REG_LOAD(((uint8_t *) AT91C_TC0_CV) + channel * sizeof(AT91S_TCB));
40
}
41

42
void tc_set_limit(uint8_t channel, uint32_t limit) {
43
	REG_STORE(AT91C_TC0_RC + channel * sizeof(AT91S_TCB), limit);
44
	REG_ORIN(((uint8_t *) AT91C_TC0_CMR) + channel * sizeof(AT91S_TCB),
45
			AT91C_TC_CPCTRG);
46
}
47

48
void tc_limit_int_enable(uint8_t channel, irq_handler_t handler) {
49
	// TODO check return code.
50
	irq_attach(AT91C_ID_TC0 + channel, handler, 0, NULL, "Timer limit handler");
51
	REG_STORE(((uint8_t *) AT91C_TC0_IER) + channel * sizeof(AT91S_TCB), AT91C_TC_CPCS);
52
}
53

54
void tc_limit_int_disable(uint8_t channel) {
55
	REG_STORE(((uint8_t *) AT91C_TC0_IDR) + channel * sizeof(AT91S_TCB), AT91C_TC_CPCS);
56
	// TODO check return code.
57
	irq_detach(AT91C_ID_TC0 + channel, NULL);
58
}
59

60
bool tc_was_overflowed(uint8_t channel) {
61
	//assert(channel < 3);
62
	return REG_LOAD(((uint8_t *) AT91C_TC0_SR) + channel * sizeof(AT91S_TCB)) &
63
		AT91C_TC_COVFS;
64
}
65

66
void tc_stop(uint8_t channel) {
67
	//assert(channel < 3);
68
	REG_STORE(((uint8_t *) AT91C_TC0_CCR) + channel * sizeof(AT91S_TCB),
69
		AT91C_TC_CLKDIS);
70
	//REG_STORE(AT91C_PMC_PCDR, (1L << (AT91C_ID_TC0 + channel)));
71
}
72

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.