Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.04 KB | None | 0 0
  1. /*
  2.  *  startup.c
  3.  *
  4.  */
  5. #include <stdio.h>
  6.  
  7. void startup(void) __attribute__((naked)) __attribute__((section (".start_section")) );
  8.  
  9. void startup ( void )
  10. {
  11. __asm volatile(
  12.     " LDR R0,=0x2001C000\n"     /* set stack */
  13.     " MOV SP,R0\n"
  14.     " BL main\n"                /* call main */
  15.     "_exit: B .\n"              /* never return */
  16.     ) ;
  17. }
  18.  
  19. typedef struct {
  20.   uint32_t moder;
  21.   uint16_t otyper;      // +0x4
  22.   uint16_t otReserved;
  23.   uint32_t ospeedr;     // +0x8
  24.   uint32_t pupdr;       // +0xc
  25.   uint8_t  idrLow;      // +0x10
  26.   uint8_t  idrHigh;     // +0x11
  27.   uint16_t idrReserved;
  28.   uint8_t  odrLow;      // +0x14
  29.   uint8_t  odrHigh;     // +0x15
  30.   uint16_t odrReserved;
  31. } GPIO;
  32.  
  33. typedef struct {
  34.   uint32_t ctrl;
  35.   uint32_t load;
  36.   uint32_t val;
  37.   uint32_t calib;
  38. } SysTick;
  39.  
  40. #define GPIO_E (*((volatile GPIO*) 0x40021000))
  41. #define SYSTICK (*((volatile SysTick*) 0xE000E010))
  42.  
  43. #define CLOCK_FREQ 168000000
  44.  
  45. #define B_E      0x40 // 0100 0000
  46. #define B_SELECT 0x04 // 0000 0100
  47. #define B_RW     0x02 // 0000 0010
  48. #define B_RS     0x01 // 0000 0001
  49.  
  50. void delay_250ns(void)
  51. {
  52.   SYSTICK.ctrl = 0;
  53.   SYSTICK.load = (CLOCK_FREQ * 0.00000025) - 1;
  54.   SYSTICK.val = 0;
  55.   SYSTICK.ctrl = 5;
  56.  
  57.   while ((SYSTICK.ctrl & 0x00010000) == 0) {};
  58.  
  59.   SYSTICK.ctrl = 0;
  60. }
  61.  
  62. void delay_micro(unsigned int us)
  63. {
  64.   while (us--) {
  65.     delay_250ns();
  66.     delay_250ns();
  67.     delay_250ns();
  68.     delay_250ns();
  69.   }
  70. }
  71.  
  72. void delay_milli(unsigned int ms)
  73. {
  74. #ifdef SIMULATOR
  75.   ms = ms / 1000;
  76.   ms++;
  77. #endif
  78.  
  79.   while (ms--) {
  80.     delay_micro(1000);
  81.   }
  82. }
  83.  
  84.  
  85.  
  86. void ascii_write_controller(uint8_t c)
  87. {
  88.   ascii_ctrl_bit_set(B_E);
  89.   GPIO_E.odrHigh = c;
  90.  
  91.   delay_250ns();
  92.  
  93.   ascii_ctrl_bit_clear(B_E);
  94. }
  95.  
  96. void ascii_write_cmd(uint8_t cmd)
  97. {
  98.   ascii_ctrl_bit_clear(B_RS);
  99.   ascii_ctrl_bit_clear(B_RW);
  100.  
  101.   ascii_write_controller(cmd);
  102. }
  103.  
  104. void ascii_write_data(uint8_t data)
  105. {
  106.   ascii_ctrl_bit_set(B_RS);
  107.   ascii_ctrl_bit_clear(B_RW);
  108.  
  109.   ascii_write_controller(data);
  110. }
  111.  
  112.  
  113. uint8_t ascii_read_controller(void)
  114. {
  115.   ascii_ctrl_bit_set(B_E);
  116.  
  117.   delay_250ns();
  118.   delay_250ns();
  119.  
  120.   uint8_t rv = GPIO_E.idrHigh;
  121.  
  122.   ascii_ctrl_bit_clear(B_E);
  123.  
  124.   return rv;
  125. }
  126.  
  127. uint8_t ascii_read_status(void)
  128. {
  129.   GPIO_E.moder &= 0xFFFF00FF; // 0000 0000 0000 0000 FFFF FFFF FFFF FFFF
  130.  
  131.   ascii_ctrl_bit_clear(B_RS);
  132.   ascii_ctrl_bit_set(B_RW);
  133.  
  134.   uint8_t rv = ascii_read_controller();
  135.  
  136.   GPIO_E.moder |= 0x00005500; // 0101 0101 0101 0101 0000 0000 0000 0000
  137.  
  138.   return rv;
  139. }
  140.  
  141. uint8_t ascii_read_data(void)
  142. {
  143.   GPIO_E.moder &= 0xFFFF00FF; // 0000 0000 0000 0000 FFFF FFFF FFFF FFFF
  144.  
  145.   ascii_ctrl_bit_set(B_RS);
  146.   ascii_ctrl_bit_set(B_RW);
  147.  
  148.   uint8_t rv = ascii_read_controller();
  149.  
  150.   GPIO_E.moder |= 0x00005500; // 0101 0101 0101 0101 0000 0000 0000 0000
  151.  
  152.   return rv;
  153. }
  154.  
  155.  
  156. void ascii_ctrl_bit_set(uint8_t b)
  157. {
  158.   GPIO_E.odrLow |= B_SELECT | b;
  159. }
  160.  
  161. void ascii_ctrl_bit_clear(uint8_t b)
  162. {
  163.   GPIO_E.odrLow &= B_SELECT | ~b;
  164. }
  165.  
  166. void ascii_wait_ready()
  167. {
  168.   while ((ascii_read_status() & 0x80) == 0x80) {}
  169. }
  170.  
  171. void ascii_command(uint8_t cmd)
  172. {
  173.   ascii_wait_ready();
  174.  
  175.   delay_micro(8);
  176.  
  177.   ascii_write_cmd(cmd);
  178.  
  179. #ifndef SIMULATOR
  180.   delay_milli(2);
  181. #endif
  182. }
  183.  
  184. void ascii_gotoxy(uint8_t x, uint8_t y)
  185. {
  186.   uint8_t address;
  187.  
  188.   if (y != 1)
  189.     address = 0x40 | (x - 1);
  190.   else
  191.     address = x - 1;
  192.  
  193.   ascii_write_cmd(0x80 | address);
  194.   delay_micro(45);
  195. }
  196.  
  197. void ascii_write_char(uint8_t c) {
  198.   ascii_wait_ready();
  199.  
  200.   delay_micro(8);
  201.   ascii_write_data(c);
  202.   delay_micro(43);
  203. }
  204.  
  205. void app_init(void)
  206. {
  207.   GPIO_E.moder = 0x55555555; // 0101 0101 0101 0101 0101 0101 0101 0101
  208. }
  209.  
  210. void ascii_init(void)
  211. {
  212.   ascii_command(0x38);
  213.   ascii_command(0x0C);
  214.   ascii_command(0x01);
  215.   ascii_command(0x06);
  216. }
  217.  
  218. void main(void)
  219. {
  220.   char *s;
  221.   char test1[] = "Alfanumerisk ";
  222.   char test2[] = "Display - test";
  223.  
  224.   app_init();
  225.   ascii_init();
  226.  
  227.   ascii_gotoxy(1, 1);
  228.   s = test1;
  229.  
  230.   while (*s) {
  231.     ascii_write_char(*s++);
  232.   }
  233.  
  234.   ascii_gotoxy(1, 2);
  235.   s = test2;
  236.  
  237.   while (*s) {
  238.     ascii_write_char(*s++);
  239.   }
  240.  
  241.   return 0;
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement