diff options
-rwxr-xr-x | laser-tag software/main.c | 174 |
1 files changed, 120 insertions, 54 deletions
diff --git a/laser-tag software/main.c b/laser-tag software/main.c index c12fca1..221eaca 100755 --- a/laser-tag software/main.c +++ b/laser-tag software/main.c @@ -103,7 +103,7 @@ static const smc_power_mode_config_t g_idlePowerMode = { .powerModeName = kPowerModeVlpw, }; -/* Switch1 GPIO pin */ +/* Switch GPIO pins */ static const gpio_input_pin_user_config_t g_switch1 = { .pinName = GPIO_MAKE_PIN(GPIOA_IDX, 1), .config.isPullEnable = true, @@ -111,6 +111,48 @@ static const gpio_input_pin_user_config_t g_switch1 = { .config.interrupt = kPortIntEitherEdge, }; +static const gpio_input_pin_user_config_t g_switch2 = { + .pinName = GPIO_MAKE_PIN(GPIOA_IDX, 2), + .config.isPullEnable = true, + .config.pullSelect = kPortPullUp, + .config.interrupt = kPortIntEitherEdge, +}; + +static const gpio_input_pin_user_config_t g_switchUp = { + .pinName = GPIO_MAKE_PIN(GPIOA_IDX, 4), + .config.isPullEnable = true, + .config.pullSelect = kPortPullUp, + .config.interrupt = kPortIntEitherEdge, +}; + +static const gpio_input_pin_user_config_t g_switchDown = { + .pinName = GPIO_MAKE_PIN(GPIOA_IDX, 5), + .config.isPullEnable = true, + .config.pullSelect = kPortPullUp, + .config.interrupt = kPortIntEitherEdge, +}; + +static const gpio_input_pin_user_config_t g_switchLeft = { + .pinName = GPIO_MAKE_PIN(GPIOA_IDX, 18), + .config.isPullEnable = true, + .config.pullSelect = kPortPullUp, + .config.interrupt = kPortIntEitherEdge, +}; + +static const gpio_input_pin_user_config_t g_switchRight = { + .pinName = GPIO_MAKE_PIN(GPIOA_IDX, 13), + .config.isPullEnable = true, + .config.pullSelect = kPortPullUp, + .config.interrupt = kPortIntEitherEdge, +}; + +static const gpio_input_pin_user_config_t g_switchSelect = { + .pinName = GPIO_MAKE_PIN(GPIOA_IDX, 12), + .config.isPullEnable = true, + .config.pullSelect = kPortPullUp, + .config.interrupt = kPortIntEitherEdge, +}; + /* LPTMR configurations */ static const lptmr_user_config_t g_lptmrConfig = { .timerMode = kLptmrTimerModeTimeCounter, @@ -123,7 +165,8 @@ static const lptmr_user_config_t g_lptmrConfig = { /* PIT config */ static const pit_user_config_t g_pitChan0 = { - .periodUs = 104, // 9615 Hz (9600 baud 0.16% error) + .periodUs = 193000, + .isInterruptEnabled = true, }; /* CMP config */ @@ -238,6 +281,60 @@ static void lptmr_call_back(void) } } +/* Play music using the PIT timer */ +uint16_t notes[] = { + 0, // rest + 494, // B4 1 + 523, // C5 2 + 554, // C#5 3 + 587, // D5 4 + 622, // D#5 5 + 659, // E5 6 + 698, // F5 7 + 740, // F#5 8 + 784, // G5 9 + 830, // G#5 10 + 880, // A5 11 + 932, // A#5 12 + 988, // B5 13 +}; +uint8_t beeps[] = { + 8, 8, 4, 1, + 0, 1, 0, 6, + 0, 6, 0, 6, + 10, 10, 11, 13, + 11, 11, 11, 6, + 0, 4, 0, 8, + 0, 8, 0, 8, + 6, 6, 8, 6, +}; + +tpm_pwm_param_t param = { + .mode = kTpmEdgeAlignedPWM, + .edgeMode = kTpmHighTrue, + .uDutyCyclePercent = 50, +}; + +int position; + +void PIT_IRQHandler(void) +{ + if (PIT_HAL_IsIntPending(g_pitBase[0], 0)) + { + PIT_HAL_ClearIntFlag(g_pitBase[0], 0); + param.uFrequencyHZ = notes[beeps[position]]; + position = (position + 1) % sizeof(beeps); + if (param.uFrequencyHZ) + TPM_DRV_PwmStart(0, ¶m, 3); + else + TPM_DRV_PwmStop(0, ¶m, 3); + } + if (PIT_HAL_IsIntPending(g_pitBase[0], 1)) + { + PIT_HAL_ClearIntFlag(g_pitBase[0], 1); + } +} + uint8_t g_txBuff[] = { '$' }; void PORTA_IRQHandler(void) @@ -246,6 +343,14 @@ void PORTA_IRQHandler(void) PORT_HAL_ClearPortIntFlag(PORTA_BASE_PTR); if (GPIO_DRV_ReadPinInput(g_switch1.pinName)) { + TPM_DRV_PwmStop(0, ¶m, 3); + PIT_DRV_StopTimer(0, 0); + } else { + position = 0; + PIT_DRV_StartTimer(0, 0); + } + + if (GPIO_DRV_ReadPinInput(g_switch2.pinName)) { LPUART_DRV_AbortSendingData(1); } else { LPUART_DRV_SendData(1, g_txBuff, 1); @@ -309,21 +414,21 @@ int main (void) CLOCK_SYS_SetConfiguration(&g_defaultClockConfigVlpr); /* Initialize LPTMR */ - //lptmr_state_t lptmrState; - //LPTMR_DRV_Init(LPTMR0_IDX, &lptmrState, &g_lptmrConfig); - //LPTMR_DRV_SetTimerPeriodUs(LPTMR0_IDX, 100000); - OSA_Init(); - //LPTMR_DRV_InstallCallback(LPTMR0_IDX, lptmr_call_back); + lptmr_state_t lptmrState; + LPTMR_DRV_Init(LPTMR0_IDX, &lptmrState, &g_lptmrConfig); + LPTMR_DRV_SetTimerPeriodUs(LPTMR0_IDX, 100000); + //OSA_Init(); + LPTMR_DRV_InstallCallback(LPTMR0_IDX, lptmr_call_back); /* Initialize DMA */ dma_state_t dma_state; DMA_DRV_Init(&dma_state); -#if 0 /* Initialize PIT */ PIT_DRV_Init(0, false); PIT_DRV_InitChannel(0, 0, &g_pitChan0); +#if 0 /* Initialize the DAC */ dac_converter_config_t MyDacUserConfigStruct; DAC_DRV_StructInitUserConfigNormal(&MyDacUserConfigStruct); @@ -361,6 +466,12 @@ int main (void) /* Buttons */ GPIO_DRV_InputPinInit(&g_switch1); + GPIO_DRV_InputPinInit(&g_switch2); + GPIO_DRV_InputPinInit(&g_switchUp); + GPIO_DRV_InputPinInit(&g_switchDown); + GPIO_DRV_InputPinInit(&g_switchLeft); + GPIO_DRV_InputPinInit(&g_switchRight); + GPIO_DRV_InputPinInit(&g_switchSelect); /* Start LPTMR */ LPTMR_DRV_Start(LPTMR0_IDX); @@ -387,9 +498,7 @@ int main (void) &g_fioChan); DMA_DRV_RegisterCallback(&g_fioChan, fioDmaCallback, NULL); -#if 1 - /* Play some chip tunez */ - //CLOCK_SYS_SetTpmSrc(1, kClockTpmSrcMcgIrClk); + /* Connect buzzer to TPM0_CH3 */ PORT_HAL_SetMuxMode(g_portBase[GPIOE_IDX], 30, kPortMuxAlt3); tpm_general_config_t tmpConfig = { .isDBGMode = false, @@ -402,49 +511,6 @@ int main (void) TPM_DRV_Init(0, &tmpConfig); TPM_DRV_SetClock(0, kTpmClockSourceModuleMCGIRCLK, kTpmDividedBy1); - uint16_t notes[] = { - 0, // rest - 494, // B4 1 - 523, // C5 2 - 554, // C#5 3 - 587, // D5 4 - 622, // D#5 5 - 659, // E5 6 - 698, // F5 7 - 740, // F#5 8 - 784, // G5 9 - 830, // G#5 10 - 880, // A5 11 - 932, // A#5 12 - 988, // B5 13 - }; - uint8_t beeps[] = { - 8, 8, 4, 1, - 0, 1, 0, 6, - 0, 6, 0, 6, - 10, 10, 11, 13, - 11, 11, 11, 6, - 0, 4, 0, 8, - 0, 8, 0, 8, - 6, 6, 8, 6, - }; - - tpm_pwm_param_t param = { - .mode = kTpmEdgeAlignedPWM, - .edgeMode = kTpmHighTrue, - .uDutyCyclePercent = 50, - }; - int i; - for (i = 0; ; i = (i + 1) % sizeof(beeps)) { - param.uFrequencyHZ = notes[beeps[i]]; - if (param.uFrequencyHZ) - TPM_DRV_PwmStart(0, ¶m, 3); - else - TPM_DRV_PwmStop(0, ¶m, 3); - OSA_TimeDelay(193); - } -#endif - /* We're done, everything else is triggered through interrupts */ for(;;) { #ifndef DEBUG |