1 | #include <stdio.h>
|
2 |
|
3 | #define PMC_PCER 0xFFFFFC10 // Power Management Controller: Peripheral Clock Enable Register
|
4 | #define TC_CMR0 0xFFFDC004 // Channel mode Register as seen in the datasheet for channel 0
|
5 | #define TC_CMR1 0xFFFDC044 // Channel mode Register as seen in the datasheet for channel 1
|
6 | #define TC_CMR2 0xFFFDC084 // Channel mode Register as seen in the datasheet for channel 2
|
7 | #define TC_RC0 0xFFFDC01C // Register C as seen in the datasheet for channel 0
|
8 | #define TC_RC1 0xFFFDC05C // Register C as seen in the datasheet for channel 1
|
9 | #define TC_RC2 0xFFFDC09C // Register C as seen in the datasheet for channel 2
|
10 | #define TC_RB0 0xFFFDC018 // Register B as seen in the datasheet for channel 0
|
11 | #define TC_RB1 0xFFFDC058 // Register B as seen in the datasheet for channel 1
|
12 | #define TC_RB2 0xFFFDC098 // Register B as seen in the datasheet for channel 2
|
13 | #define TC_RA0 0xFFFDC014 // Register A as seen in the datasheet for channel 0
|
14 | #define TC_RA1 0xFFFDC054 // Register A as seen in the datasheet for channel 1
|
15 | #define TC_RA2 0xFFFDC094 // Register A as seen in the datasheet for channel 2
|
16 | #define TC_CCR0 0xFFFDC000 // Channel Control Register as seen in the datasheet for channel 0
|
17 | #define TC_CCR1 0xFFFDC040 // Channel Control Register as seen in the datasheet for channel 1
|
18 | #define TC_CCR2 0xFFFDC080 // Channel Control Register as seen in the datasheet for channel 2
|
19 | #define PIO_PDR 0xFFFFF404 // PIO Controller PIO Enable Register for Port PIOA
|
20 | #define PIO_ASR 0xFFFFF470 // PIO Peripheral A Select Register for Port PIOA
|
21 | #define TC_IER0 0xFFFDC024 // Interrupt Enable Register for Channel 0
|
22 |
|
23 | #define IO_WR32(adress, value) (*((volatile unsigned long *) (adress)) = (value))
|
24 | #define IO_RD32(adress) (*((volatile unsigned long *) adress))
|
25 | #define IO_SET_MASK32(adress, mask) IO_WR32((adress), IO_RD32((adress)) | (mask))
|
26 |
|
27 | void pal_pwm_start(){
|
28 |
|
29 | // Channel-Pin-Matching:
|
30 | // PA26: Peripheral A: TIOA0, Peripheral B: ERX3
|
31 | // Timer/Counter Channel 0: Output: TIOA0, TIOB0
|
32 | // Timer1: TC0, TC1, TC2: TCLK0-TCLK2, TIOA0-TIOA2, TIOB0-TIOB2
|
33 | // PA0 - PA31: Parallel I/O Controller A (PIOA)
|
34 |
|
35 | // Power Management Controller (PMC): Peripherial Clock Enable Register
|
36 | // - activate the clock signal for T/C 0 (bit 17 to value 1b)
|
37 | IO_WR32(PMC_PCER, (1<<17)); // Peripheral ID (PID) 17 belongs to Timer/Counter 0 and to Signal TIOA0
|
38 | IO_WR32(PMC_PCER, (1<<2)); // Parallel I/O Controller A (PIOA)
|
39 |
|
40 | // T/C Channel Control Register for Channel 0:
|
41 | // - disable the clock signal: CLKDIS-Bit (bit 1 to value 1)
|
42 | IO_WR32(TC_CCR0, (1<<1));
|
43 |
|
44 | // PIO Disable Register for I/O-Port PIOA
|
45 | // - disable GPIO-functionality for Pins PA26 and PA27 and enable their Peripheral function: Set Bit 26 to value 1
|
46 | IO_WR32(PIO_PDR, (1<<26));
|
47 |
|
48 | // Peripheral A Select Register
|
49 | // - enable Peripheral A instead of Peripheral B for Pins PA26: Set Bit 26 to value 1
|
50 | IO_WR32(PIO_ASR, (1<<26));
|
51 |
|
52 | // T/C Channel Mode Register for Channel 0:
|
53 | // - set the Operating Mode to WAVEFORM: WAVE-Bit (bit 15 to value 1b)
|
54 | // - set the waveform to "up-mode with automatic trigger on RC compare": WAVSEL-Bits (bits 13-14 to value 10b = 2d)
|
55 | // - set the Clock Signal to MCKL / 2 (TIMER_CLOCK1): TCCLKS-Bits (bits 0-2 to value 000b = 0d)
|
56 | // - set the RA Compare Effect on TIOA output level to toogle: ACPA-bits (bit 16, 17 to value 11b = 3d)
|
57 | // - set the RC Compare Effect on TIOA counter to clear: ACPC-Bits (bit 18, 19 to value 10b = 2d)
|
58 | IO_WR32(TC_CMR0, (1<<15));
|
59 | IO_WR32(TC_CMR0, (0<<14) | (1<<13));
|
60 | IO_WR32(TC_CMR0, (0<<2) | (0<<1) | (0<<0));
|
61 | IO_WR32(TC_CMR0, (1<<17) | (1<<16));
|
62 | IO_WR32(TC_CMR0, (0<<19) | (1<<18));
|
63 |
|
64 | // T/C Interrupt Enable Register for Channel 0:
|
65 | // - set the RC Compare interrupt (CPCS)
|
66 | // - set the RA Compare interrupt (CPAS)
|
67 | //IO_WR32(TC_IER0, (1<<4));
|
68 | //IO_WR32(TC_IER0, (1<<2));
|
69 |
|
70 | // T/C Register C for Channel 0:
|
71 | // - set the "reset value register" to 2^11: Register C to value 2^11d = 2048d (cuts down the 16-bit-resolution to 11-bit)
|
72 | IO_WR32(TC_RC0, 2048);
|
73 |
|
74 | // T/C Register A for Channel 0:
|
75 | // - set the LOW-to-HIGH threshold to 2^11 / 2 (50% duty cycle) --> value 1024d
|
76 | IO_WR32(TC_RA0, 1024);
|
77 |
|
78 | // T/C Channel Control Register for Channel 0:
|
79 | // - enable the clock signal: CLKEN-Bit, CLKDIS-Bit (bit 1 to value 0 and bit 0 to value 1)
|
80 | IO_WR32(TC_CCR0, (0<<1)); // unset disable-bit
|
81 | IO_WR32(TC_CCR0, (1<<0)); // set enable-bit
|
82 | }
|