This is a simple example of assembly-language programming inside of an MBED program. It is just a blink program with two functions: setup() and loop().

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
ghsalazar
Date:
Wed Apr 22 15:14:54 2020 +0000
Commit message:
Initial commit

Changed in this revision

functions.s Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 5446675502f2 functions.s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/functions.s	Wed Apr 22 15:14:54 2020 +0000
@@ -0,0 +1,83 @@
+;   @file   main.S
+;   @author Gastón SALAZAR  <gaston_salazar@yahoo.com>
+;
+;   @brief  A blink program for the STM32F446re in assembly.
+;           It implements a state machine. It requires a basic
+;           C++ main function.
+;
+;   This example is used as a didactical resource.
+
+    AREA    functions_asm, CODE, READONLY
+
+;   Interface
+
+;   @def    LED
+;   @brief  The bit address of pin 5 on port A.
+LED     EQU (1 << 5)
+
+;    @def    DELAY
+;    @brief  The number of loops to execute before changing th state of LED.
+DELAY   EQU 5000000
+
+RCC_AHB1ENR EQU 0x40023830  ; Register for enabling the AHB1 clock for GPIOA
+GPIOAEN     EQU (1 << 0)
+
+GPIOA       EQU 0x40020000  ; Base address of port-A registers
+
+
+GPIO_MODER  EQU 0x00    ; Offsets of the registers for port X,
+GPIO_PUPDR  EQU 0x0c    ; using as base the port address
+GPIO_ODR    EQU 0x14
+
+RESET_MODER5    EQU (3 << 10)   ; Bit addresses in the port registers, in order to configure the behaviour of the output pin
+SET_MODER5      EQU (1 << 10)
+RESET_PUPDR5    EQU (3 << 10)
+
+    EXPORT setup
+
+setup   ; Machine setup
+
+    ; Enable port A
+    LDR R0, =RCC_AHB1ENR    ; R0 = RCC_AHB1ENR
+    LDR R1, [R0]            ; R1 = *R0
+    ORR R1, R1, #GPIOAEN     ; R1 = R1 | GPIOAEN
+    STR R1, [R0]            ; *R0 = R1
+
+    ; A minimal initialization for PA5 as output (LED) on the STM32F446re
+    LDR R3, =GPIOA
+
+    LDR R1, [R3, #GPIO_MODER]    ; R1 = R3[GPIO_MODER]
+    BIC R1, R1, #RESET_MODER5    ; R1 = R1 & ~RESET_MODER5
+    ORR R1, R1, #SET_MODER5
+    STR R1, [R3, #GPIO_MODER]    ; R3[GPIO_MODER] = R1
+
+    LDR R1, [R3, #GPIO_PUPDR]
+    BIC R1, R1, #RESET_PUPDR5
+    STR R1, [R3, #GPIO_PUPDR]
+
+;    State initilization
+    ; LED = 0
+    LDR R1, [R3, #GPIO_ODR]
+    BIC R1, R1,#LED
+    STR R1, [R3, #GPIO_ODR]
+
+    BX      LR
+    
+    ALIGN
+    EXPORT loop
+loop
+;    State update
+    LDR R3, =GPIOA
+    LDR R0, =DELAY
+loop1
+    CBNZ    R0, wait           ; if (R0!=0) goto wait
+    LDR     R1, [R3, #GPIO_ODR]
+    EOR     R1, R1, #LED        ; R1 = R1 ^ LED
+    STR     R1, [R3, #GPIO_ODR]
+    LDR     R0, =DELAY
+wait
+    SUB     R0, R0, #1           ; R0 = R0 - 1
+    B       loop1                ; goto loop
+
+    BX      LR  ; end of function main, to never be reached
+    END
\ No newline at end of file
diff -r 000000000000 -r 5446675502f2 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Apr 22 15:14:54 2020 +0000
@@ -0,0 +1,9 @@
+#include "mbed.h"
+
+extern "C" void setup(void);
+extern "C" void loop(void);
+
+int main() {
+    setup();
+    loop();
+}
\ No newline at end of file
diff -r 000000000000 -r 5446675502f2 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Apr 22 15:14:54 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file