Hi all,
I am fairly new to ASM and I need to write a bunch of values from SRAM to flash during the startup of the device. Thus, the code needs to be ASM and is part of Startup.s.
The TRM (page 487) states the following procedure to write to flash:
- Write source data to FMD register
- Write target address to FMA register
- write key and WRITE bit (0xA442001) to FMC register
- poll FMC register until the WRITE bit is cleared
I implemented the steps 1-3. However, there are several issues:
- How can I write the WRITEKEY and bit from step (3) to FMC? Using the key directly leads to a complaint:
Immediate 0x0A442001 cannot be represented by 0-255 shifted left by 0-23 or duplicated in all, odd or even bytes
2. How do I implement step 4? I guess be loading the byte into a register and comparing it to value 1?
This is my code so far (startup.s):
; UART2TestMain.s ; Runs on LM4F120 at 50 MHz ; Tests the UART0 to implement bidirectional data transfer to and from a ; computer running PuTTY. This time, interrupts and FIFOs ; are used. ; This file is named "UART2" because it is the second UART example. ; It is not related to the UART2 module on the microcontroller. ; Daniel Valvano ; May 15, 2013 ; This example accompanies the book ; "Embedded Systems: Real Time Interfacing to Arm Cortex M Microcontrollers", ; ISBN: 978-1463590154, Jonathan Valvano, copyright (c) 2013 ; Program 5.11 Section 5.6, Program 3.10 ; ;Copyright 2013 by Jonathan W. Valvano, valvano@mail.utexas.edu ; You may use, edit, run or distribute this file ; as long as the above copyright notice remains ;THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED ;OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF ;MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. ;VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, ;OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. ;For more information about my classes, my research, and my books, see ;http://users.ece.utexas.edu/~valvano/ ; U0Rx (VCP receive) connected to PA0 ; U0Tx (VCP transmit) connected to PA1 ; standard ASCII symbols CR EQU 0x0D LF EQU 0x0A BS EQU 0x08 ESC EQU 0x1B SPA EQU 0x20 DEL EQU 0x7F UART0 EQU 0x10000001 ROM EQU 0x01000014 GPIOA EQU 0x20000001 PCTLA EQU 0x4000452C UART0D EQU 0x4000C000 FMA EQU 0x400FD000 FMD EQU 0x400FD004 FMC EQU 0x400FD008 WRITEKEY EQU 0xA4420000 WRITE_C EQU 0x00000001 AREA DATA, ALIGN=2 AREA |.text|, CODE, READONLY, ALIGN=2 THUMB EXPORT Start ALIGN ; make sure the end of this section is aligned Start LDR R5, =0x016FFFFF ; 0x016FFFFF ~ 4 sec, 0x00AFFFFF ~2 sec, 0x006FFFFF ~ 1 sec ;LDR R5, =0x00AFFFFF ;LDR R5, =0x006FFFFF delay SUBS R5, #1 BNE delay startinit LDR R0, =UART0 LDR R4, =ROM LDR R5, [R4, #0x30] LDR R6, [R5, #0x18] BLX R6 ;Enable uart0 LDR R0, =GPIOA BLX R6 ;Enable gpioA MOV.W R0, #0x40004000 ;baseA MOVS R1, #0x03 ;bit1 +bit0 LDR R6, [R4, #0x0C] LDR R6, [R6, #0x54] BLX R6 ;pin type LDR R6, [R5, #0x60] BLX R6 ;get clock frequency MOV R1, R0 LDR R0, =UART0D MOV R2, #115200 MOV R3, #0x60 LDR R5, [R4] MOV R4, R0 LDR R6, [R5, #0x14] BLX R6 ;115200, 8N1 LDR R6, [R5, #0x38] LDR R5, [R5] MOV R7, #0x8000 ; Size = Length (32K) MOV R3, #0x20000000 ; Mem = RAM Address MOV R11,#0x00001000 ; Flash Address MOV R12,#0 ; Flash Offset LDR R8, =FMD LDR R9, =FMA LDR R10,=FMC main LDRB R1, [R3], #1 STRB R1, [R8] STRB R11, [R9] MOV R0, #0xA442001 STR R0, [R10] ADDS R9, R9, #1 ; Flash Offset++ SUBS R7, R7, #1 ; Size-- BNE main END