Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * startup.c
- *
- */
- #include <stdio.h>
- void startup(void) __attribute__((naked)) __attribute__((section (".start_section")) );
- void startup ( void )
- {
- __asm volatile(
- " LDR R0,=0x2001C000\n" /* set stack */
- " MOV SP,R0\n"
- " BL main\n" /* call main */
- "_exit: B .\n" /* never return */
- ) ;
- }
- typedef struct {
- uint32_t moder;
- uint16_t otyper; // +0x4
- uint16_t otReserved;
- uint32_t ospeedr; // +0x8
- uint32_t pupdr; // +0xc
- uint8_t idrLow; // +0x10
- uint8_t idrHigh; // +0x11
- uint16_t idrReserved;
- uint8_t odrLow; // +0x14
- uint8_t odrHigh; // +0x15
- uint16_t odrReserved;
- } GPIO;
- typedef struct {
- uint32_t ctrl;
- uint32_t load;
- uint32_t val;
- uint32_t calib;
- } SysTick;
- #define GPIO_E (*((volatile GPIO*) 0x40021000))
- #define SYSTICK (*((volatile SysTick*) 0xE000E010))
- #define CLOCK_FREQ 168000000
- #define B_E 0x40 // 0100 0000
- #define B_SELECT 0x04 // 0000 0100
- #define B_RW 0x02 // 0000 0010
- #define B_RS 0x01 // 0000 0001
- void delay_250ns(void)
- {
- SYSTICK.ctrl = 0;
- SYSTICK.load = (CLOCK_FREQ * 0.00000025) - 1;
- SYSTICK.val = 0;
- SYSTICK.ctrl = 5;
- while ((SYSTICK.ctrl & 0x00010000) == 0) {};
- SYSTICK.ctrl = 0;
- }
- void delay_micro(unsigned int us)
- {
- while (us--) {
- delay_250ns();
- delay_250ns();
- delay_250ns();
- delay_250ns();
- }
- }
- void delay_milli(unsigned int ms)
- {
- #ifdef SIMULATOR
- ms = ms / 1000;
- ms++;
- #endif
- while (ms--) {
- delay_micro(1000);
- }
- }
- void ascii_write_controller(uint8_t c)
- {
- ascii_ctrl_bit_set(B_E);
- GPIO_E.odrHigh = c;
- delay_250ns();
- ascii_ctrl_bit_clear(B_E);
- }
- void ascii_write_cmd(uint8_t cmd)
- {
- ascii_ctrl_bit_clear(B_RS);
- ascii_ctrl_bit_clear(B_RW);
- ascii_write_controller(cmd);
- }
- void ascii_write_data(uint8_t data)
- {
- ascii_ctrl_bit_set(B_RS);
- ascii_ctrl_bit_clear(B_RW);
- ascii_write_controller(data);
- }
- uint8_t ascii_read_controller(void)
- {
- ascii_ctrl_bit_set(B_E);
- delay_250ns();
- delay_250ns();
- uint8_t rv = GPIO_E.idrHigh;
- ascii_ctrl_bit_clear(B_E);
- return rv;
- }
- uint8_t ascii_read_status(void)
- {
- GPIO_E.moder &= 0xFFFF00FF; // 0000 0000 0000 0000 FFFF FFFF FFFF FFFF
- ascii_ctrl_bit_clear(B_RS);
- ascii_ctrl_bit_set(B_RW);
- uint8_t rv = ascii_read_controller();
- GPIO_E.moder |= 0x00005500; // 0101 0101 0101 0101 0000 0000 0000 0000
- return rv;
- }
- uint8_t ascii_read_data(void)
- {
- GPIO_E.moder &= 0xFFFF00FF; // 0000 0000 0000 0000 FFFF FFFF FFFF FFFF
- ascii_ctrl_bit_set(B_RS);
- ascii_ctrl_bit_set(B_RW);
- uint8_t rv = ascii_read_controller();
- GPIO_E.moder |= 0x00005500; // 0101 0101 0101 0101 0000 0000 0000 0000
- return rv;
- }
- void ascii_ctrl_bit_set(uint8_t b)
- {
- GPIO_E.odrLow |= B_SELECT | b;
- }
- void ascii_ctrl_bit_clear(uint8_t b)
- {
- GPIO_E.odrLow &= B_SELECT | ~b;
- }
- void ascii_wait_ready()
- {
- while ((ascii_read_status() & 0x80) == 0x80) {}
- }
- void ascii_command(uint8_t cmd)
- {
- ascii_wait_ready();
- delay_micro(8);
- ascii_write_cmd(cmd);
- #ifndef SIMULATOR
- delay_milli(2);
- #endif
- }
- void ascii_gotoxy(uint8_t x, uint8_t y)
- {
- uint8_t address;
- if (y != 1)
- address = 0x40 | (x - 1);
- else
- address = x - 1;
- ascii_write_cmd(0x80 | address);
- delay_micro(45);
- }
- void ascii_write_char(uint8_t c) {
- ascii_wait_ready();
- delay_micro(8);
- ascii_write_data(c);
- delay_micro(43);
- }
- void app_init(void)
- {
- GPIO_E.moder = 0x55555555; // 0101 0101 0101 0101 0101 0101 0101 0101
- }
- void ascii_init(void)
- {
- ascii_command(0x38);
- ascii_command(0x0C);
- ascii_command(0x01);
- ascii_command(0x06);
- }
- void main(void)
- {
- char *s;
- char test1[] = "Alfanumerisk ";
- char test2[] = "Display - test";
- app_init();
- ascii_init();
- ascii_gotoxy(1, 1);
- s = test1;
- while (*s) {
- ascii_write_char(*s++);
- }
- ascii_gotoxy(1, 2);
- s = test2;
- while (*s) {
- ascii_write_char(*s++);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement