| E000 0000 … SCS, FPB, DWT, ITM | nRF52 Peripheral Addresses |

From armgcc/ruuvi_firmware.ld:
MEMORY
{
/* Leave room for SoftDevice RAM */
RAM (rwx) : ORIGIN = 0x20002450, LENGTH = 0xDBB0 /* ends at FFFF */
/* bootloader 75000 .. 7AB77 */
bootloader_settings_page (r) : ORIGIN = 0x0007F000, LENGTH = 0x1000 /* ends at 7FFFF */
mbr_params_page (r) : ORIGIN = 0x0007E000, LENGTH = 0x1000
FLASH (rx) : ORIGIN = 0x00026000, LENGTH = 0x4F000 /* through 0x75000 (i.e.FDS start) */
uicr_bootloader_start_address (r) : ORIGIN = 0x00000FF8, LENGTH = 4 /* contains 0x75000 */
uicr_mbr_params_page (r) : ORIGIN = 0x00000FFC, LENGTH = 4 /* contains 0x7E000 */
}
|
2001 0000 top o stack __StackTop = (ORIGIN (RAM) + LENGTH (RAM))
used for local variables
2000 E000 __StackLimit = (__StackTop - SIZEOF (.stack_dummy))
nRF52832 64KB RAM
2000 5FFF nRF52811 24KB RAM Doesn't fit
…
unused RAM for growth with debugging, No DPS310,TMP117,NTC or PHOTO
…
.bss. 10000 - 786C = 34707 aka 33KB
*(vtable)
*(.data*)
Lowest RAM address (above Soft Device RAM)
.data 20002450 43c load address4cd08
20002450 __data_start__ = .
.data.shtc1_cmd_measure Why are these few variables at the bottom of availale RAM?
20002450 2 shtc1
.data.adc_config
20002454 4 ruuvi_nrf5_sdk15_adc_mcu ./ruuvi.drivers.c/src/nrf5_sdk15_platform/adc/ruuvi_nrf5_sdk15_adc_mcu.c
static bool m_adc_is_init = false;
static nrf_drv_saadc_config_t adc_config = NRF_DRV_SAADC_DEFAULT_CONFIG;
static uint8_t bits_resolution[ADC_BITS_RESOLUTION_NUM] =
{ ADC_BITS_RESOLUTION_8, ADC_BITS_RESOLUTION_10, ADC_BITS_RESOLUTION_12, ADC_BITS_RESOLUTION_14,
.data.m_adv_uuids
2000245C 4 ruuvi_nrf5_sdk15_communication_ble_advertising
static ble_uuid_t m_adv_uuids[] = { {BLE_UUID_NUS_SERVICE, BLE_UUID_TYPE_VENDOR_BEGIN} };
.data.m_adv_handle
20002458 1 ruuvi_nrf5_sdk15_communication_ble_advertising
./ruuvi.drivers.c/src/nrf5_sdk15_platform/communication/ruuvi_nrf5_sdk15_communication_ble_advertising.c
static bool m_advertise_nus;
static ri_adv_type_t m_type; //!< Type, configured by user.
static ri_radio_channels_t m_radio_channels; //!< Enabled channels to send
/** @brief Advertising handle used to identify an advertising set. */
static uint8_t m_adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET;
/** @brief Flag for initialization **/
static bool m_advertisement_is_init = false;
/** @brief Flag for advertising in process **/
static bool m_advertising = false;
…
.data.timeout_us_per_byte
20002498 2 ruuvi_nrf5_sdk15_i2c ./ruuvi.drivers.c/src/nrf5_sdk15_platform/i2c/ruuvi_nrf5_sdk15_i2c.c
static uint16_t timeout_us_per_byte = 1000;
These variables are unexplainably allocated:
./ruuvi.drivers.c/src/nrf5_sdk15_platform/log/ruuvi_nrf5_sdk15_log.c
ri_log_severity_t m_log_level = APP_LOG_LEVEL occurs BEFORE lastChar in source!
bool m_log_show_times = true; // time/delta prefix
char m_log_lastChar = '\n'; // if previous message ended with \n add timestamp
uint64_t m_log_prior_ms = 0; // Time of last message for displaying delta
uint32_t s_log_calls[5]= {0}; // statistics
uint32_t s_log_calls_skipped[RI_LOG_LEVEL_DEBUG]= {0}; // statistics
ruuvi_nrf5_sdk15_log Not the order from the source!
.data.m_log_lastChar 2000249A 1 m_log_lastChar
.data.m_log_level 2000249B 1 m_log_level
.data.m_log_show_times 2000249C 1 m_log_show_times
…
xfer_status 20003C68 4 ruuvi_nrf5_sdk15_i2c
m_log_prior_ms 20003C70 8 m_log_prior_ms far away!!
s_log_calls 20003C78 14 s_log_calls
s_log_calls_skipped 20003c8C 10 s_log_calls_skipped
…
.data._impure_ptr
200026B0 _impure_ptr
.data.impure_data
.data.__global_locale
20002714 __global_locale
.data.__fdlib_version
20002880 __fdlib_version
20002884 PROVIDE (__preinit_array_start = .)
*(.preinit_array)
20002884 PROVIDE (__preinit_array_end = .)
20002884 PROVIDE (__init_array_start = .)
*(SORT_BY_NAME(.init_array.*))
*(.init_array)
20002888 PROVIDE (__init_array_end = .)
[!provide] PROVIDE (__fini_array_start = .)
*(SORT_BY_NAME(.fini_array.*))
*(.fini_array)
[!provide] PROVIDE (__fini_array_end = .)
*(.jcr*)
2000288C __data_end__ = .
.igot.plt 2000288C load address4d144
.mem_section_dummy_ram
.log_dynamic_data
2000288C
2000288C PROVIDE (__start_log_dynamic_data = .)
*(SORT_BY_NAME(.log_dynamic_data*))
[!provide] PROVIDE (__stop_log_dynamic_data = .)
.log_filter_data
2000288C
[!provide] PROVIDE (__start_log_filter_data = .)
*(SORT_BY_NAME(.log_filter_data*))
[!provide] PROVIDE (__stop_log_filter_data = .)
.fs_data 2000288C 14 load address4d144
2000288c PROVIDE (__start_fs_data = .)
*(.fs_data)
.fs_data 2000288C 14 fds
2000288C m_fs
200028A0 PROVIDE (__stop_fs_data = .)
.bss 200028A0 4e4c load address4d158
200028A0 __bss_start__ = .
*(.bss*)
fifo_int 200028BC 1 ruuvi_driver_sensor_test
level_int
200028BD 1 ruuvi_driver_sensor_test
m_channel
200028C0 14 ruuvi_interface_communication_ble_advertising_test
*(COMMON)
__bss_end__ (9/2/21) 3.30.3 tests +DEBUG see the .map
_SEGGER_RTT
COMMON
MISRA says dont use.
heap_end. (heap not used by Ruuvi 3.1.2 set to 64(x40) bytes (was 8,192)
m_t4t_active nfc_t4t_lib_al.c (last defined)
Interesting symbols
See .map for addresses
nfc_rx_buffer (256.) big?
_acUpBuffer (512. x200 SEGGER_RTT.c
~~~ look here if RTT not running
_acDownBuffer
m_log_data nrf_log_frontend.c (1,060) !
m_log_output_block fb4 app_log.c history BIG!! aka 1005 words
m_log_input_block fb4 app_log.c history BIG!! aka 1005 words don't copy to RAM !! use directly from flash (_)
m_log_config
m_pages
nfc_tx_buf
nfc_id_buf
nfc_fw_buf
nfc_addr_buf
rx_data e8(232) ruuvi_interface_communication_nfc_test.c
rx_data e8(232) ruuvi_interface_communication_ble_gatt_test.
m_adv
m_timeout
m_has_sent ruuvi_interface_communication_ble_gatt_test
m_has_received
m_has_disconnected
m_has_connected
m_channel ruuvi_interface_communication_ble_advertising_test.c
level_int ruuvi_driver_sensor_test.c
fifo_int
__bss_start__
m_fs fds.c .fs_data
__data_end__
These low adress areas won't change unless order of load changes.
2000 24a4 .data.m_conn_handle
2000 24a0 .data.m_adv_uuids
2000 249c .data.m_adv_handle
2000 2498 .data.adc_config
.data.singleton_ctx_spi
.data.shtc1_cmd_measure
__data_start__ defined in .ld. See map as of 9/01/21
2000 244F SoftDevice RAM
…
2000 0000 SoftDevice RAM
Code RAM
0080 0000 unused by Ruuvi Firmware
Some systems copy portions of the code from FLASH to RAM which is faster and requires less power (especially if this allows for the FLASH
to be powered off.
FLASHspecial FLASH
1000 10FC UICR->CUSTOMER[32]
1000 1080 UICR->CUSTOMER[0]
1000 1000 UICR
1000 0204 "
1000 0208 APPROTECT Access port protection blocks debugger access to all CPU registers and memory-mapped addresses.
1000 0200 Mapping of the nRESET
1000 0000 FICR
.sdh
4b88c _ruuvi_log
4B794 i_nrfx_clock
.log_const_data
.mem_section_dummy_rom
address vary
4b2xx .crypto_data
.rodata strings to initalize function's literals LOG("compiled...
.rodata._setlocale_r.str1.1 0004Af80 8 libc_nano.a(lib_a-locale.o)
0004AFxx 43 00 50 4F 53 49 58 00 2E 00 C.POSIX...
.rodata._printf_i.str1.1 0004Af9C 22 libc_nano.a(lib_a-nano-vfprintf_i.o)
0004AFxx 49 4E 46 00 69 6E INF.in
0004AFxx 66 00 4E 41 4E 00 6E 61 6E 00 30 00 30 31 32 33 f.NAN.nan.0.0123
0004AFxx 34 35 36 37 38 39 41 42 43 44 45 46 00 30 31 32 456789ABCDEF.012
0004AFxx 33 34 35 36 37 38 39 61 62 63 64 65 66 00 00 20 3456789abcdef..
0004 8D40 .rodata.setup.str1.4 main.c
00048D40 2E 2E 2F 2E 2E 2F 2E 2E 2F 6D 61 69 6E 2E 63 00 ../../../main.c.
00048D50 22 73 65 6E 73 6F 72 73 22 3A 20 7B 0D 0A 00 00 "sensors": {....
00048D60 7B 0D 0A 22 66 69 72 6D 77 61 72 65 22 3A 22 52 {.."firmware":"R
00048D70 75 75 76 69 20 46 57 20 76 33 2E 33 30 2E 33 22 uuvi FW v3.30.3"
00048D80 2C 0D 0A 00 22 63 6F 6D 70 69 6C 65 64 5F 6F 6E ,..."compiled_on
00048D90 22 3A 22 53 65 70 20 20 36 20 32 30 32 31 20 32 ":"Sep 6 2021 2
00048DA0 30 3A 33 35 3A 31 32 22 2C 0D 0A 00 22 62 6F 61 0:35:12",..."boa
00048EB0 69 20 46 57 00 00 00 00 76 33 2E 33 30 2E 33 00 i FW....v3.30.3.
00048EC0 2B 64 65 62 75 67 00 00 43 68 65 63 6B 20 50 43 +debug..C
47880
gatt_cache_manager.c
.text. Program code
47874 _fini
4785C __errno
Library routines412xx gcc_startup_nrf52.S IRQ Handlers 40Dxx nrfx_nfct_rx 3E1xx SEGGER_RTT_Init 3c2xx nrf_log_frontend_std_0 3B8xx is_busy 3B8xx 10 nrf_fstorage_sd.c SoftDevice 35Bxx app_log_process 3xxxx 00 BE BKPT #0 app_error.c DSB #15 DataSyncBarrier LDR R1, [PC, #+18] LDR R3, [PC, #+1C] LDR R2, [R1, #+0C] AND R2, R2, #700 ORRS R3, R2 STR R3, [R1, #+0C] store BX R3 MOVW R4, #FFC R4< LDR R0, [R4] MOV R6, #10001000 R60x removed i.e. all integersm are in hex. A80 execution starts here: A80 LDR R3,[PC, #+18] A82 BX R3 -> A84 LDR R2, [PC, #+18] A86 STR R0, [R2] A88 LDR R1, [R0] A8A 08 88 MSR MSP, R1 A8E LDR R0, [R0, #+04] A90 BX R0 75374 LDR R0, [PC, #+40] 416 MOVW R4, #FFC / 7E000 41A LDR R0,[R4] 41C MOV R6, #10001000 420 ADDS R0,R0,#1 7E001 422 BEQ #+46 -. 424 LDR R0, [R4] 426 ADDS R0, R0, #1 428 BEQ #+18 -. 42A LDR R0, [R4] 42C ADDS R0, R0, #1 42E BEQ #+3E -. 430 LDR R5, [R4] 432 LDR R0, [R4] 434 ADD R5, R5, #80 438 ADDS R0, R0, #1 43A BEQ #+36 -. 43C LDR R7, [R4] 43E LDRB R0, [R7, #+04] 440 CMP R0, #170 442 BEQ #+32 -. 444 MOVW R0, #FF8 448 LDR R1, [R0] 44A ADDS R1, R1, #1 44C BEQ #+84 -. 44E LDR R1, [R0] 450 ADDS R1, R1, #1 452 BEQ #+8A -. 454 LDR R1, [R0] 456 ADDS R1, R1, #1 458 BEQ #+7C -. 45A LDR R1, [R0] 45C LDR R1, [R1] 45E ADDS R1, R1, #1 460 BEQ #+7C -. 462 LDR R1, [R0] 464 ADDS R1, R1, #1 466 BEQ #+72 -. 468 LDR R0, [R0] 46A B #+7C A84 4EA BL #+596 ---> A84 ?? 4EE B #-04 .^ 4F0 DSB #15 4F4 LDR R0, [PC, #+98] 4F6 LDR R1, [R0] 4F8 LDR R2, [PC, #+98] 4FA AND R1, R1, #700 4FE ORRS R1, R2 500 STR R1, [R0] 502 DSB #15 ... A84 A8E LDR R0, [R0,#+4] A90 BX R0 75364 LDR R0., [PC, #+40]` |
Peripheral Instances
| ID Base Address Peripheral Instance 0 4000 0000 Clock control POWER Power control BPROT Block Protect 1 4000 1000 RADIO 2.4 GHz radio 2 4000 2000 UARTE0 with EasyDMA 3 4000 3000 SPI master/slave SPIM0 SPI master 0 SPIS0 SPI slave 0 TWIM0 Two-wire master 0 TWIS0 interface slave 4 4000 4000 SPIM1, SPIS1, SPI1 TWI1, TWIS1, TWIM1 5 4000 5000 NFCT 6 4000 6000 GPIOTE 7 4000 7000 SAADC 8 4000 8000 TIMER0 9 4000 9000 TIMER1 10 4000 A000 TIMER2 11 4000 B000 RTC0 12 4000 C000 TEMPerature sensor 13 4000 D000 RNG Random number generator 14 4000 E000 ECB AES Electronic Codebook (ECB) 15 4000 F000 CCM AES CCM mode encryption 15 4000 F000 ARR Accelerated address resolver | ID Base Address Peripheral Instance 16 4001 0000 WDT 17 4001 1000 RTC1 18 4001 2000 QDEC Quadrature decoder 19 4001 3000 LPCOMP, COMP 20 4001 4000 SWI0 Software interrupt EGU0 Event generator unit 21 4001 5000 EGU1, SWI1 22 4001 6000 EFU2, SWI2 23 4001 7000 EGU3, SWi3 24 4001 8000 EGU4, SWI4 25 4001 9000 EGU5, SWI4 26 4001 A000 TIMER3 27 4001 B000 TIMER4 28 4001 C000 PWM0 29 4001 D000 PDM Pulse-Density Modulation (digital microphone interface) 30 4001 E000 NVMC 31 4001 F000 PPI | ID Base Address Peripheral Instance 32 4002 0000 MWU 33 4002 1000 PWM1 34 4002 2000 PWM2 35 4002 3000 SPI2, SPIS2, SPIM2 36 4002 4000 RTC2 37 4002 5000 I2S 38 4002 6000 FPU 0 5000 0000 GPIO, P0 |
| Nordic RWS | ||
|---|---|---|
| mem32 40010400 1 | 1 running | Example 00000001 |
| 40010504 | Counter Reload Value | Example 012C0000 |
| 4001050C | 01 run while sleep 10 run while debugging | Example 00000001 Run while sleep, not while debugging |
| 40005404 | ERRORSTATUS Error Status register | |
| 40005504 | FRAMEDELAYMIN | Minimum frame delay |
| 40005590 | NFCID1_LAST Last NFCID1 part | (4, 7 or 10 bytes ID) |
| 40005594 | 7 or 10 bytes ID | |
| 40005598 | 10 bytes ID | |
| 40005FFC | power?? | nrfx_nfc |
IPSR 0 = Thread mode 2 = NMI 3 = HardFault 4 = MemManage 5 = BusFault 6 = UsageFault 11 = SVCall 14 = PendSV 15 = SysTick 16 = IRQ0 . n+15 = IRQ(n-1)[a].
nRF52.h
mem32 26000 40
26000 = 20010000 427A5 427CD 427CF
26010 = 427D1 427D3 427D5 ....0
26020 = ....0 ....0 ....0 427D7
26030 = 427D9 ....0 427DB 427DD
26040 = 3FE21 427DF 41B79 409DD
26050 = 41239 425A5 3FAA5 40125
26060 = 427DF 40FA1 427DF 427DF
26070 = 427DF 427DF 427DF 427DF
26080 = 31585 3DB95 427DF 427DF
26090 = 3DC35 36B6D 3E4E5 427DF
260A0 = 427DF 427DF 427DF 40FF9
260B0 = 3FEA1 427DF ....0 ....0
260C0 = 427DF 427DF 427DF 427DF
260D0 = 40071 427DF 31A75 ....0
260E0 = ....0 ....0 ....0 ....0
260F0 = ....0 ....0 ....0 ....0
427a4 Reset_
427cc NMI_
427ce HardFault_
427d0 MemoryManagement_
427d2 BusFault_
427d4 UsageFault_
427d6 SVC_
427d8 DebugMon_
427da PendSV_
427dc SysTick_
all IRQ go to 427DE: B B B very bad
TIMER0 PWM2 ECB
Default_
CCM_AAR SWI5_EGU5 RNG SWI3_EGU3 SPIM2_SPIS2_SPI2 MWU TIMER2 COMP_LPCOMP RTC0 PWM1 RADIO PDM TEMP QDEC
TIMER3 I2S SWI4_EGU4
SystemInit
427e0 3c0 system_nrf52
427e0 SystemInit
nRF52 has no means of detecting stack overflow.
Use Memory Watch Unit (MWU) to implement stack overflow detection.
0007 E000 = 4F0507F6 00000002 00000001 00000001 mbr_params_page 0007 E010 = 0______0 0______0 00020890 EC9BBA09 0007 E020 = 00000001 0______0 0______0 0______0 0007 E030 = 0______0 0______0 0______0 0______0 0007 E040 = 0______0 0______0 0______0 0______0 0007 E050 = 0______0 0______0 0______0 FFFFFFFF 0007 E060 = FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF Large block of unused (usable?) 0007 E250 = FF FF FF FF FF FF FF FF FF FF FF FF 92 AF 43 D1 0007 E260 = 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0007 E270 = FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0007 E280 = FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0007 E290 = FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0007 E2A0 = FF 01 09 BA 9B EC FF FF FF FF FF FF FF FF FF FF ..... 0007 E2B0 = FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0007 E2C0 = FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0007 E2D0 = FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0007 E2E0 = FF FF 00 FF FF FF FF FF FF FF FF FF FF FF FF FF ... 0007 EFFF
Master Boot Record Param Page0007 F000 = 4F0507F6 00000002 00000001 00000001 0007 F010 = 00000000 00000000 00020890 EC9BBA09 or 0007 F000 = 699C5732 00000002 00000001 00000001 0007 F010 = 00000000 00000000 000262A0 4CA0A93F 0 0 _start ? 0007 F020 = 00000001 00000000 00000000 00000000 0007 F030 = 00000000 00000000 00000000 00000000 0007 F040 = 00000000 00000000 00000000 00000000 0007 F050 = 00000000 00000000 00000000 FFFFFFFF … 0007 F250 = FFFFFFFF FFFFFFFF FFFFFFFF 0F25ED9A 0007 F260 = FFFFFF00 FFFFFFFF FFFFFFFF FFFFFFFF 0007 F270 = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0007 F280 = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0007 F290 = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0007 F2A0 = A93F01FF FFFF4CA0 FFFFFFFF FFFFFFFF 0007 F2B0 = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0007 F2C0 = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0007 F2D0 = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0007 F2E0 = FF00FFFF FFFFFFFF FFFFFFFF FFFFFFFF 0007 E000 - duplicate of 0007 F000 - 0007 FFFF |