-
Notifications
You must be signed in to change notification settings - Fork 0
/
Timer1.c
55 lines (49 loc) · 2.45 KB
/
Timer1.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
// Timer1.c
// Runs on LM4F120/TM4C123
// Use TIMER1 in 32-bit periodic mode to request interrupts at a periodic rate
// Daniel Valvano
// Last Modified: 3/6/2015
// You can use this timer only if you learn how it works
/* This example accompanies the book
"Embedded Systems: Real Time Interfacing to Arm Cortex M Microcontrollers",
ISBN: 978-1463590154, Jonathan Valvano, copyright (c) 2013
Program 7.5, example 7.6
Copyright 2013 by Jonathan W. Valvano, [email protected]
You may use, edit, run or distribute this file
as long as the above copyright notice remains
THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
For more information about my classes, my research, and my books, see
http://users.ece.utexas.edu/~valvano/
*/
#include <stdint.h>
#include "tm4c123gh6pm.h"
void (*PeriodicTask1)(void); // user function
// ***************** TIMER1_Init ****************
// Activate TIMER1 interrupts to run user task periodically
// Inputs: task is a pointer to a user function
// period in units (1/clockfreq)
// Outputs: none
void Timer1_Init(void(*task)(void), uint32_t period){
SYSCTL_RCGCTIMER_R |= 0x02; // 0) activate TIMER1
PeriodicTask1 = task; // user function
TIMER1_CTL_R = 0x00000000; // 1) disable TIMER1A during setup
TIMER1_CFG_R = 0x00000000; // 2) configure for 32-bit mode
TIMER1_TAMR_R = 0x00000002; // 3) configure for periodic mode, default down-count settings
TIMER1_TAILR_R = period-1; // 4) reload value
TIMER1_TAPR_R = 0; // 5) bus clock resolution
TIMER1_ICR_R = 0x00000001; // 6) clear TIMER1A timeout flag
TIMER1_IMR_R = 0x00000001; // 7) arm timeout interrupt
NVIC_PRI5_R = (NVIC_PRI5_R&0xFFFF00FF)|0x00008000; // 8) priority 4
// interrupts enabled in the main program after all devices initialized
// vector number 37, interrupt number 21
NVIC_EN0_R = 1<<21; // 9) enable IRQ 21 in NVIC
TIMER1_CTL_R = 0x00000001; // 10) enable TIMER1A
}
void Timer1A_Handler(void){
TIMER1_ICR_R = TIMER_ICR_TATOCINT;// acknowledge TIMER1A timeout
(*PeriodicTask1)(); // execute user task
}