NextVOD_Baremetal_Hello/src/stx7105_utils.c

54 lines
1.4 KiB
C

#include "stx7105.h"
/* Private */
#include "stx7105_utils.h"
volatile uint8_t s_tmu_flag = 0U;
void init_led(PIO_TypeDef *gpiox, uint8_t pin, uint8_t init_value) {
gpiox->CLR_PC0 = 1 << pin;
gpiox->SET_PC1 = 1 << pin;
gpiox->CLR_PC2 = 1 << pin;
set_led(gpiox, pin, init_value);
}
void set_led(PIO_TypeDef *gpiox, uint8_t pin, uint8_t val) {
if (val) {
gpiox->SET_POUT = (1 << pin);
} else {
gpiox->CLR_POUT = (1 << pin);
}
}
void delay_ms(uint32_t msec) {
/* Initialize TMU and count to zero */
/* TMU clock is from Peripheral clock, approx. 100MHz */
/* Prescale to 100kHz for convenience (TMUs can only divide by max. 1024) */
uint32_t reload_value = msec * 100 - 1;
TMU->TSTR &= ~TMU_TSTR_STR0_Msk; /* Stop counter */
TMU->TCR0 = 0x04U | TMU_TCR_UNIE_Msk; /* 1024 prescale, enable interrupt */
TMU->TCNT0 = reload_value; /* 66kHz */
TMU->TCOR0 = reload_value; /* Reload register */
TMU->TSTR |= TMU_TSTR_STR0_Msk; /* Start counter */
INTC->IPRA &= ~INTC_IPRA_IPR_TMU0_Msk;
INTC->IPRA |= (1U << INTC_IPRA_IPR_TMU0_Pos); /* Interrupt priority 1 */
/* Wait until underflow occurs */
while (s_tmu_flag != 1) {
__sleep();
}
s_tmu_flag = 0U;
TMU->TSTR &= ~TMU_TSTR_STR0_Msk; /* Stop counter */
}
void tuni0_handler(void) {
s_tmu_flag = 1U;
TMU->TCR0 &= ~(TMU_TCR_UNF_Msk);
}