#include #include "ch573/gpio.h" #include "ch573/uart.h" #include "ch573/pwr.h" #include "isr_vector.h" #define GPIO_PORT_A ch573_gpio__gpio_port_a #define GPIO_PORT CH573_GPIO__GPIO_PORT_T_INTF #define UART1 ch573_uart__uart1 #define UART CH573_UART__UART_T_INTF #define PWR1 ch573_pwr__pwr_mgmt #define PWR CH573_PWR__PWR_MGMT_T_INTF /* * Function which delays for a bit. */ void delay(void); void main(void); uint32_t collatz(uint32_t n) { uint32_t c = 0; while (n > 1) { if (n % 2 == 0) { n /= 2; } else { n = n * 3 + 1; } c++; } return c; } void blink_n(int n) { uint32_t bit = 1 << 8; while (n > 0) { GPIO_PORT.out.set(GPIO_PORT_A, OFF, 8); delay(); GPIO_PORT.out.set(GPIO_PORT_A, ON, 8); delay(); --n; } } void delay(void) { for (volatile uint32_t i = 0; i < 10000; ++i) { asm volatile(""); } } volatile uint32_t deadbeef = 0xdeadbeef; // Memory-mapped address of the data values in flash. extern uint32_t DATA_VALUES_IN_FLASH; // Where the data is located in sram. extern uint32_t DATA_SEGMENT_START; extern uint32_t DATA_SEGMENT_STOP; #define gpio_usart1_tx_pin 9 #define gpio_usart1_rx_pin 8 const char* hello_world = "Hello, World!\r\n"; #define BAUD_RATE 115200 /* Main routine. This is called on_reset once everything else has been set up. */ void main(void) { GPIO_PORT.dir.set(GPIO_PORT_A, DIR_OUT, gpio_usart1_tx_pin); GPIO_PORT.pd_drv.set(GPIO_PORT_A, 0, gpio_usart1_tx_pin); UART.div.set(UART1, 1); UART.fcr.set(UART1, 0x07); UART.ier.txd_en.set(UART1, ON); UART.lcr.word_sz.set(UART1, WORD_SZ_8_BITS); uint32_t dl = (10 * 6400000 / 8 / BAUD_RATE + 5) / 10; UART.dl.set(UART1, dl); // PWR.slp_clk_off_0.uart1.set(PWR1, CLK_SOURCE_ENABLED); const char* ptr = hello_world; while (1) { if (*ptr == 0) { ptr = hello_world; } while (!UART.lsr.thr_empty.get(UART1)); UART.thr.set(UART1, *(ptr++)); } } IRQ(systick) { collatz(5); } IRQ(exc) { } IRQ(nmi) { }