2 #include "serial_dma.h"
7 * Only port A, C, and D can do aysnc DMA (p. 67)
9 * DMA Channel Allocation:
10 * Ch Trigger Description
11 * 0 gpio timestamp (async event)
13 * 2 uart2 tx timestamp (time sync xmt)
14 * 3 uart2 rx timestamp (time sync rcv)
17 * UART 0 UART 1 UART 2
18 * xmt rcv xmt rcv xmt rcv
19 * --- --- --- --- --- ---
20 * A2 A1 --A19 A18-- - -
24 * D7 D6 - - **D3/3 D2/3** <<<
25 * - - - - **D5/3 D4/3**
26 * E20 E21 E0 E1 E16 E17
51 /* Trigger select options */
53 #define TMP_CONF_TRGSEL_EXTRG 0x0 // 0b0000 External trigger pin input (EXTRG_IN)
54 #define TMP_CONF_TRGSEL_CMP0 0x1 // 0b0001 CMP0 output
55 #define TMP_CONF_TRGSEL_PIT0 0x4 // 0b0100 PIT trigger 0
56 #define TMP_CONF_TRGSEL_PIT1 0x5 // 0b0101 PIT trigger 1
57 #define TMP_CONF_TRGSEL_TPM0 0x8 // 0b1000 TPM0 overflow
58 #define TMP_CONF_TRGSEL_TPM1 0x9 // 0b1001 TPM1 overflow
59 #define TMP_CONF_TRGSEL_TPM2 0xA // 0b1010 TPM2 overflow
60 #define TMP_CONF_TRGSEL_RTCA 0xC // 0b1100 RTC alarm
61 #define TMP_CONF_TRGSEL_RTCS 0xD // 0b1101 RTC seconds
62 #define TMP_CONF_TRGSEL_LPTMR 0xE // 0b1110 LPTMR trigger
69 extern DigitalOut led1;
70 extern DigitalOut led2;
92 void test_tpm_init(void)
94 // EXTRG_IN - PTB8 - alt 3
98 // Setup System Integration Module
101 sim->SCGC5 |= SIM_SCGC5_PORTA_MASK
102 | SIM_SCGC5_PORTB_MASK
103 | SIM_SCGC5_PORTC_MASK
104 | SIM_SCGC5_PORTD_MASK
105 | SIM_SCGC5_PORTE_MASK
106 | SIM_SCGC5_LPTMR_MASK;
108 sim->SCGC6 |= SIM_SCGC6_TPM0_MASK
109 | SIM_SCGC6_TPM1_MASK
110 | SIM_SCGC6_TPM2_MASK
111 | SIM_SCGC6_DAC0_MASK
112 | SIM_SCGC6_ADC0_MASK
114 | SIM_SCGC6_DMAMUX_MASK
115 | SIM_SCGC6_RTC_MASK;
117 sim->SOPT2 |= SIM_SOPT2_TPMSRC(1);
119 sim->SOPT4 = SIM_SOPT4_TPM1CLKSEL_MASK
120 | SIM_SOPT4_TPM1CH0SRC(3);
122 printf("SOPT2:%08lx SCGC5:%08lx SCGC6:%08lx\r\n",
123 sim->SOPT2, sim->SCGC5, sim->SCGC6);
124 //SOPT2:05010000 SCGC5:00003f83 SCGC6:07800001
126 //sim->SOPT7 |= SIM_SOPT7_ADC0TRGSEL(TMP_CONF_TRGSEL_EXTRG);
128 // Setup Port Control
129 PORT_Type *port = PORTC;
131 PORTE->PCR[25] = PORT_PCR_ISF_MASK
135 port->PCR[0] = PORT_PCR_ISF_MASK
140 // Setup Timer/PWM Module
141 volatile TPM_Type *tpm = TPM1;
143 tpm->SC = TPM_SC_PS(0x7)
146 tpm->CNT = TPM_CNT_COUNT(0);
148 tpm->MOD = TPM_CNT_COUNT(0xFFFF);
150 tpm->CONTROLS[1].CnV = 0x1234;
151 tpm->CONTROLS[1].CnSC = TPM_CnSC_CHF_MASK
153 | TPM_CnSC_ELSA_MASK;
155 //tpm->CONTROLS[0].CnSC = TPM_CnSC_CHF_MASK
156 // | TPM_CnSC_CHIE_MASK
157 // | TPM_CnSC_MSB_MASK
158 // | TPM_CnSC_MSA_MASK
159 // | TPM_CnSC_ELSB_MASK
160 // | TPM_CnSC_ELSA_MASK;
162 tpm->STATUS = TPM_STATUS_CH0F_MASK
163 | TPM_STATUS_CH1F_MASK
164 | TPM_STATUS_CH2F_MASK
165 | TPM_STATUS_CH3F_MASK
166 | TPM_STATUS_CH4F_MASK
167 | TPM_STATUS_CH5F_MASK
168 | TPM_STATUS_TOF_MASK;
170 tpm->CONF = TPM_CONF_TRGSEL(TMP_CONF_TRGSEL_EXTRG)
173 | TPM_CONF_GTBEEN_MASK
174 | TPM_CONF_DBGMODE_MASK;
176 tpm->SC = TPM_SC_CMOD(1)
180 printf("test - %02lx %08lx\r\n", tpm->CONTROLS[1].CnSC, tpm->CONTROLS[1].CnV); wait(0.1);
183 void test_tpm_run(void)
185 //static DigitalIn pin(PTC0);
186 //static DigitalIn pin(PTC2);
187 //static int pin = 0;
189 printf("PTC0:%08lx GPCR:%08lx:%08lx - SC:%04lx CNT:%04lx MOD:%04lx STATUS:%04lx CONF:%08lx - CnSC:%02lx CnV:%04lx\r\n",
190 PORTC->PCR[0], PORTC->GPCHR, PORTC->GPCLR,
191 TPM1->SC, TPM1->CNT, TPM1->MOD, TPM1->STATUS, TPM1->CONF,
192 TPM1->CONTROLS[1].CnSC, TPM1->CONTROLS[1].CnV);
193 TPM1->SC |= TPM_STATUS_TOF_MASK;
194 TPM1->STATUS |= TPM_STATUS_TOF_MASK;
197 void test_pit_init(void)
199 //printf("test_pit_init\r\n");
202 SIM->SCGC6 |= SIM_SCGC6_PIT_MASK;
206 PIT->CHANNEL[0].LDVAL = 0xFFFFFFFF;
207 PIT->CHANNEL[0].TCTRL = 0;
210 PIT->CHANNEL[1].LDVAL = 0xFFFFFFFF;
211 PIT->CHANNEL[1].TCTRL = PIT_TCTRL_CHN_MASK;
214 PIT->CHANNEL[0].TCTRL |= PIT_TCTRL_TEN_MASK;
215 PIT->CHANNEL[1].TCTRL |= PIT_TCTRL_TEN_MASK;
219 void test_pit_run(void)
221 register volatile uint32_t *tmh asm("r4") = &PIT->LTMR64H;
222 register volatile uint32_t *tml asm("r5") = &PIT->LTMR64L;
224 register uint32_t hi0 asm("r0"), lo0 asm("r1");
225 register uint32_t hi1 asm("r2"), lo1 asm("r3");
227 asm("ldr %0, [%4]\n\t" // Two clocks per load
231 : "=r"(hi0), "=r"(lo0), "=r"(hi1), "=r"(lo1)
232 : "r"(tmh), "r"(tml));
234 uint64_t tm0 = ~((uint64_t)hi0 << 32 | lo0);
235 uint64_t tm1 = ~((uint64_t)hi1 << 32 | lo1);
236 double bus = 24E6; // 24 MHz bus clock
239 printf(" %08lx:%08lx", (uint32_t)(tm0>>32), (uint32_t)tm0);
240 printf(" %08lx:%08lx", (uint32_t)(tm1>>32), (uint32_t)tm1);
241 printf(" %08lx", (uint32_t)(tm1-tm0));
242 printf(" %f", (double)tm0 / bus);
245 void test_sdma_init(void)
247 sdma0 = sdma_open(SDMA_UART0, SDMA_CHANNEL0, SDMA_CHANNEL1);
248 sdma1 = sdma_open(SDMA_UART1, SDMA_CHANNEL0, SDMA_CHANNEL1);
249 sdma2 = sdma_open(SDMA_UART2, SDMA_CHANNEL2, SDMA_CHANNEL3);
251 sdma_pinmap(sdma1, PTE0, PTE1);
252 sdma_pinmap(sdma2, PTD3, PTD2);
255 void test_sdma_run(void)
257 char xmt[32] = "hello, world";
262 sdma_write(sdma1, xmt, strlen(xmt));
263 sdma_flush(sdma1, &tm1);
265 sdma_read(sdma2, rcv, strlen(xmt));
266 sdma_wait(sdma2, &tm2);
268 printf("send: [%s] -> [%s] ", xmt, rcv);
269 printf("time: %08lx / %08lx ", (uint32_t)tm1, (uint32_t)tm2);
270 printf("tag: dir:%08lx in:%08lx\r\n",
271 FPTD->PDDR, FPTD->PDIR);
273 (void)xmt; (void)rcv;
274 (void)tm1; (void)tm2;
277 void test_tdma_init(void)
281 tdma0 = tdma_open(TDMA_CHAN0, 3, PTA1, PullNone);
282 tdma1 = tdma_open(TDMA_CHAN1, 3, PTC1, PullNone);
283 tdma2 = tdma_open(TDMA_CHAN2, 3, PTD3, PullUp);
284 tdma3 = tdma_open(TDMA_CHAN3, 3, PTD2, PullUp);
287 void test_tdma_run(void)
289 static uint32_t time0[2];
290 static uint32_t time1[2];
291 static uint32_t time2[2];
292 static uint32_t time3[2];
294 tdma_stamp(tdma0, (uint64_t*)&time0);
295 tdma_stamp(tdma1, (uint64_t*)&time1);
296 tdma_stamp(tdma2, (uint64_t*)&time2);
297 tdma_stamp(tdma3, (uint64_t*)&time3);
305 printf(" %08lx:%08lx", time0[1], time0[0]);
306 printf(" %08lx:%08lx", time1[1], time1[0]);
307 printf(" %08lx:%08lx", time2[1], time2[0]);
308 printf(" %08lx:%08lx", time3[1], time3[0]);
309 //printf(" do:%08lx", FPTD->PDOR);
310 //printf(" di:%08lx", FPTD->PDIR);
311 //printf(" dd:%08lx", FPTD->PDDR);
316 led1 = 1; led2 = 0; wait(0.1);
317 led1 = 0; led2 = 1; wait(0.1);
329 for (int i = 0; true; i++) {