82 lines
2.6 KiB
C
82 lines
2.6 KiB
C
#include <stdint.h>
|
|
|
|
#define ST_GPIO0_BASE_ADDR (0xFD020000)
|
|
#define ST_GPIO0_OFFSET_POUT 0x00U
|
|
#define ST_GPIO0_OFFSET_SET_POUT 0x04U
|
|
#define ST_GPIO0_OFFSET_CLR_POUT 0x08U
|
|
#define ST_GPIO0_OFFSET_PC0 0x20U
|
|
#define ST_GPIO0_OFFSET_SET_PC0 0x24U
|
|
#define ST_GPIO0_OFFSET_CLR_PC0 0x28U
|
|
#define ST_GPIO0_OFFSET_PC1 0x30U
|
|
#define ST_GPIO0_OFFSET_SET_PC1 0x34U
|
|
#define ST_GPIO0_OFFSET_CLR_PC1 0x38U
|
|
#define ST_GPIO0_OFFSET_PC2 0x40U
|
|
#define ST_GPIO0_OFFSET_SET_PC2 0x44U
|
|
#define ST_GPIO0_OFFSET_CLR_PC2 0x48U
|
|
|
|
#define SH_TMU_BASE_ADDR (0xFFD80000)
|
|
#define SH_TMU_OFFSET_TOCR 0x00U
|
|
#define SH_TMU_OFFSET_TSTR 0x04U
|
|
#define SH_TMU_OFFSET_TCOR0 0x08U
|
|
#define SH_TMU_OFFSET_TCNT0 0x0CU
|
|
#define SH_TMU_OFFSET_TCR0 0x10U
|
|
#define SH_TMU_OFFSET_TCOR1 0x14U
|
|
#define SH_TMU_OFFSET_TCNT1 0x18U
|
|
#define SH_TMU_OFFSET_TCR1 0x1CU
|
|
#define SH_TMU_OFFSET_TCOR2 0x20U
|
|
#define SH_TMU_OFFSET_TCNT2 0x24U
|
|
#define SH_TMU_OFFSET_TCR2 0x28U
|
|
#define SH_TMU_OFFSET_TCPR2 0x2CU
|
|
|
|
#define LED_RED_PIN 5U
|
|
#define LED_BLUE_PIN 4U
|
|
|
|
static void init_led(uint8_t pin) {
|
|
*(uint32_t *)(ST_GPIO0_BASE_ADDR + ST_GPIO0_OFFSET_CLR_PC0) = (1 << pin);
|
|
*(uint32_t *)(ST_GPIO0_BASE_ADDR + ST_GPIO0_OFFSET_SET_PC1) = (1 << pin);
|
|
*(uint32_t *)(ST_GPIO0_BASE_ADDR + ST_GPIO0_OFFSET_CLR_PC2) = (1 << pin);
|
|
}
|
|
|
|
static void set_led(uint8_t pin, uint8_t val) {
|
|
if (val) {
|
|
*(uint32_t *)(ST_GPIO0_BASE_ADDR + ST_GPIO0_OFFSET_SET_POUT) = (1 << pin);
|
|
|
|
} else {
|
|
*(uint32_t *)(ST_GPIO0_BASE_ADDR + ST_GPIO0_OFFSET_CLR_POUT) = (1 << pin);
|
|
}
|
|
}
|
|
|
|
static void delay_ms(uint32_t msec) {
|
|
/* Initialize TMU and count to zero */
|
|
/* TMU clock is from Peripheral clock, approx. 66MHz */
|
|
/* Prescale to 450kHz for convenience (TMUs can only divide by max. 1024) */
|
|
|
|
*(uint8_t *)(SH_TMU_BASE_ADDR + SH_TMU_OFFSET_TSTR) &= ~1U; /* Stop counter */
|
|
*(uint16_t *)(SH_TMU_BASE_ADDR + SH_TMU_OFFSET_TCR0) = 0x04U; /* 1024 prescale */
|
|
*(uint32_t *)(SH_TMU_BASE_ADDR + SH_TMU_OFFSET_TCNT0) = (msec * 66); /* 66kHz */
|
|
*(uint8_t *)(SH_TMU_BASE_ADDR + SH_TMU_OFFSET_TSTR) |= 1U; /* Start counter */
|
|
|
|
/* Wait until underflow occurs */
|
|
uint16_t tcr0 = 0U;
|
|
do {
|
|
tcr0 = *(uint16_t *)(SH_TMU_BASE_ADDR + SH_TMU_OFFSET_TCR0);
|
|
} while ((tcr0 & 0x100) == 0);
|
|
|
|
*(uint8_t *)(SH_TMU_BASE_ADDR + SH_TMU_OFFSET_TSTR) &= ~1U; /* Stop counter */
|
|
}
|
|
|
|
int main(void) {
|
|
init_led(LED_RED_PIN);
|
|
init_led(LED_BLUE_PIN);
|
|
|
|
set_led(LED_RED_PIN, 0);
|
|
set_led(LED_BLUE_PIN, 0);
|
|
|
|
for (;;) {
|
|
/* Dead loop */
|
|
set_led(LED_BLUE_PIN, 1);
|
|
delay_ms(1);
|
|
set_led(LED_BLUE_PIN, 0);
|
|
delay_ms(1);
|
|
}
|
|
} |