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().
Diff: functions.s
- Revision:
- 0:5446675502f2
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