ARM Embedded Tutorial - Raspberry Pi Pico saying Hello via UART

From Lazarus wiki
Revision as of 18:55, 31 January 2021 by MiR (talk | contribs) (Created page with "Next peripheral on the list is the UART. You will now start to find a parttern, we add some objectfiles, implement a few dependencies that were defined as inline in the C-Cod...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Next peripheral on the list is the UART.

You will now start to find a parttern, we add some objectfiles, implement a few dependencies that were defined as inline in the C-Code and in the end we have our app that outputs test via UART0 to the Pins 0+1 of the Pico:

   program Blinky;
   {$L gpio.c.obj}
   {$L uart.c.obj}
   {$L clocks.c.obj}
   {$L xosc.c.obj}
   {$L pll.c.obj}
   {$L watchdog.c.obj}
   {$L platform.c.obj}
   {$LinkLib gcc,static}
   procedure clocks_init; external;
   procedure gpio_init(gpio : longWord); external;
   procedure gpio_set_function(gpio:longWord;fn:longWord); external;
   function uart_init(var uart : TUART_Registers; baudrate:longWord) : longWord; external;
   function uart_is_writable(var uart : TUART_Registers):boolean;
   begin
     result := (uart.fr and (1 shl 5)) = 0;
   end;
   procedure uart_puts(var uart : TUART_Registers; const s : string);
   var
     i : longWord;
   begin
     for i := 1 to length(s) do
     begin
       repeat
       until uart_is_writable(uart);
       uart.dr := longWord(s[i]);
     end;
   end;
   procedure runtime_init;
   const
     RESETS_SAFE_BITS=     %1111111111100110110111111;
     RESETS_PRECLOCK_BITS= %0001111000100110110111110;
     RESETS_POSTCLOCK_BITS=%1110000111000000000000001;
   begin
     resets.reset_set := RESETS_SAFE_BITS;
     resets.reset_clr := RESETS_PRECLOCK_BITS;
     repeat
     until (resets.reset_done and RESETS_PRECLOCK_BITS) = RESETS_PRECLOCK_BITS;
     clocks_init;
     resets.reset_clr := RESETS_POSTCLOCK_BITS;
     repeat
     until (resets.reset_done and RESETS_POSTCLOCK_BITS) = RESETS_POSTCLOCK_BITS;
   end;
   const
     BAUD_RATE=115200;
     UART_TX_PIN=0;
     UART_RX_PIN=1;
     GPIO_FUNC_UART=2;
   var
     i : longWord;
   begin
     runtime_init;
     uart_init(uart0, BAUD_RATE);
     gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);
     gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);
     repeat
       uart_puts(uart0, 'Hello, UART!'+#13+#10);
       for i := 0 to 300000 do ;
      until 1=0;
   end.

one notable change is that you may have seen that we do not provide __aeabi_uidiv anymore, instead we link to libgcc.a and get (hopefully) best possible performnce for the div....

This application is best tested with picoprobe, when you connect it to your development board as described in the Getting Started Guide chapter then the gpio pins 0 and 1 are connected to the debug probe which makes them visible as a serial interface on your computer.

Connect your terminal program to the UART port and enjoy the message from your pico...