Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
check_TYBLE16.cpp@0:5b88d5760320, 2019-12-17 (annotated)
- Committer:
- kenjiArai
- Date:
- Tue Dec 17 23:23:45 2019 +0000
- Revision:
- 0:5b88d5760320
mbed-os5 only for TYBLE16
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:5b88d5760320 | 1 | /* |
kenjiArai | 0:5b88d5760320 | 2 | * Mbed Application program for TYBLE-16 |
kenjiArai | 0:5b88d5760320 | 3 | * |
kenjiArai | 0:5b88d5760320 | 4 | * Copyright (c) 2018,'19 Kenji Arai / JH1PJL |
kenjiArai | 0:5b88d5760320 | 5 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:5b88d5760320 | 6 | * https://os.mbed.com/users/kenjiArai/ |
kenjiArai | 0:5b88d5760320 | 7 | * Created: Feburary 16th, 2018 |
kenjiArai | 0:5b88d5760320 | 8 | * Revised: December 15th, 2019 |
kenjiArai | 0:5b88d5760320 | 9 | */ |
kenjiArai | 0:5b88d5760320 | 10 | |
kenjiArai | 0:5b88d5760320 | 11 | #include "mbed.h" |
kenjiArai | 0:5b88d5760320 | 12 | |
kenjiArai | 0:5b88d5760320 | 13 | static uint32_t mem_range[][2] = { // Memory access range |
kenjiArai | 0:5b88d5760320 | 14 | { 0x00000000, 0x0003ffff }, // On-chip non-volatile memory //128 or 256KB |
kenjiArai | 0:5b88d5760320 | 15 | { 0x20000000, 0x20007fff }, // On-chip SRAM //16 or 32KB |
kenjiArai | 0:5b88d5760320 | 16 | { 0x10000000, 0x1000007f }, // FICR |
kenjiArai | 0:5b88d5760320 | 17 | { 0x10001000, 0x100010ff }, // UICR |
kenjiArai | 0:5b88d5760320 | 18 | { 0x40000000, 0x400245ff }, // Peripheral |
kenjiArai | 0:5b88d5760320 | 19 | { 0x50000500, 0x500007ff } // GPIO |
kenjiArai | 0:5b88d5760320 | 20 | }; |
kenjiArai | 0:5b88d5760320 | 21 | |
kenjiArai | 0:5b88d5760320 | 22 | static void mem_cnfg_init( uint8_t print ) |
kenjiArai | 0:5b88d5760320 | 23 | { |
kenjiArai | 0:5b88d5760320 | 24 | uint32_t a, b, c; |
kenjiArai | 0:5b88d5760320 | 25 | |
kenjiArai | 0:5b88d5760320 | 26 | a = NRF_FICR->CODEPAGESIZE; |
kenjiArai | 0:5b88d5760320 | 27 | b = NRF_FICR->CODESIZE; |
kenjiArai | 0:5b88d5760320 | 28 | c = a * b; |
kenjiArai | 0:5b88d5760320 | 29 | mem_range[0][1] = mem_range[0][0] + c -1; |
kenjiArai | 0:5b88d5760320 | 30 | if (print) { |
kenjiArai | 0:5b88d5760320 | 31 | printf("CODEPAGESIZE:%d, CODESIZE:%d\r\nFLASH:0x%08x-0x%08x\r\n", |
kenjiArai | 0:5b88d5760320 | 32 | a, b, mem_range[0][0], mem_range[0][1]); |
kenjiArai | 0:5b88d5760320 | 33 | } |
kenjiArai | 0:5b88d5760320 | 34 | a = NRF_FICR->NUMRAMBLOCK; |
kenjiArai | 0:5b88d5760320 | 35 | b = NRF_FICR->SIZERAMBLOCKS; |
kenjiArai | 0:5b88d5760320 | 36 | c = a * b; |
kenjiArai | 0:5b88d5760320 | 37 | mem_range[1][1] = mem_range[1][0] + c -1; |
kenjiArai | 0:5b88d5760320 | 38 | if (print) { |
kenjiArai | 0:5b88d5760320 | 39 | printf("NUMRAMBLOCK:%d, SIZERAMBLOCKS:%d\r\nRAM: 0x%08x-0x%08x\r\n", |
kenjiArai | 0:5b88d5760320 | 40 | a, b, mem_range[1][0], mem_range[1][1]); |
kenjiArai | 0:5b88d5760320 | 41 | } |
kenjiArai | 0:5b88d5760320 | 42 | } |
kenjiArai | 0:5b88d5760320 | 43 | |
kenjiArai | 0:5b88d5760320 | 44 | void cpu_sys(void) |
kenjiArai | 0:5b88d5760320 | 45 | { |
kenjiArai | 0:5b88d5760320 | 46 | uint32_t m1 = 0, m2 = 0; |
kenjiArai | 0:5b88d5760320 | 47 | |
kenjiArai | 0:5b88d5760320 | 48 | //printf("line:%d\r\n", __LINE__); |
kenjiArai | 0:5b88d5760320 | 49 | wait(0.1f); |
kenjiArai | 0:5b88d5760320 | 50 | m1 = SCB->CPUID; |
kenjiArai | 0:5b88d5760320 | 51 | m2 = ( m1 >> 24 ); |
kenjiArai | 0:5b88d5760320 | 52 | if ( m2 == 0x41 ) { |
kenjiArai | 0:5b88d5760320 | 53 | printf( "CPU = ARM " ); |
kenjiArai | 0:5b88d5760320 | 54 | wait(0.1f); |
kenjiArai | 0:5b88d5760320 | 55 | } else { |
kenjiArai | 0:5b88d5760320 | 56 | printf( "CPU = NOT ARM " ); |
kenjiArai | 0:5b88d5760320 | 57 | } |
kenjiArai | 0:5b88d5760320 | 58 | m2 = ( m1 >> 4 ) & 0xfff; |
kenjiArai | 0:5b88d5760320 | 59 | if ( m2 == 0xc20 ) { |
kenjiArai | 0:5b88d5760320 | 60 | printf( "Cortex-M0" ); |
kenjiArai | 0:5b88d5760320 | 61 | wait(0.1f); |
kenjiArai | 0:5b88d5760320 | 62 | } else { |
kenjiArai | 0:5b88d5760320 | 63 | printf( "NOT Cortex-M0" ); |
kenjiArai | 0:5b88d5760320 | 64 | } |
kenjiArai | 0:5b88d5760320 | 65 | m2 = ( m1 >> 20 ) & 0x0f; |
kenjiArai | 0:5b88d5760320 | 66 | printf( " Variant:%x ", m2 ); |
kenjiArai | 0:5b88d5760320 | 67 | m2 = m1 & 0x7; |
kenjiArai | 0:5b88d5760320 | 68 | printf( "Revision:%x\r\n", m2 ); |
kenjiArai | 0:5b88d5760320 | 69 | printf( "CPU ID: 0x%08x\r\n", m1 ); |
kenjiArai | 0:5b88d5760320 | 70 | // nRF Chip revision |
kenjiArai | 0:5b88d5760320 | 71 | m1 = (((*((uint32_t volatile *)0xF0000FE8)) & 0x000000F0) >> 4); |
kenjiArai | 0:5b88d5760320 | 72 | switch (m1) { |
kenjiArai | 0:5b88d5760320 | 73 | case 1: // revision 1 |
kenjiArai | 0:5b88d5760320 | 74 | m2 = 1; |
kenjiArai | 0:5b88d5760320 | 75 | break; |
kenjiArai | 0:5b88d5760320 | 76 | case 4: // revision 2 |
kenjiArai | 0:5b88d5760320 | 77 | m2 = 2; |
kenjiArai | 0:5b88d5760320 | 78 | break; |
kenjiArai | 0:5b88d5760320 | 79 | case 7: |
kenjiArai | 0:5b88d5760320 | 80 | case 8: |
kenjiArai | 0:5b88d5760320 | 81 | case 9: // revision 3 |
kenjiArai | 0:5b88d5760320 | 82 | m2 = 3; |
kenjiArai | 0:5b88d5760320 | 83 | break; |
kenjiArai | 0:5b88d5760320 | 84 | default: |
kenjiArai | 0:5b88d5760320 | 85 | m2 = 0; |
kenjiArai | 0:5b88d5760320 | 86 | break; |
kenjiArai | 0:5b88d5760320 | 87 | } |
kenjiArai | 0:5b88d5760320 | 88 | if (m2) { |
kenjiArai | 0:5b88d5760320 | 89 | printf( "nRF Revision: %d\r\n", m2 ); |
kenjiArai | 0:5b88d5760320 | 90 | } else { |
kenjiArai | 0:5b88d5760320 | 91 | printf( "nRF Revision: Unknown\r\n" ); |
kenjiArai | 0:5b88d5760320 | 92 | } |
kenjiArai | 0:5b88d5760320 | 93 | // Firmware |
kenjiArai | 0:5b88d5760320 | 94 | m1 = NRF_UICR->FWID & 0xffff; |
kenjiArai | 0:5b88d5760320 | 95 | printf( "Firmware ID: 0x%04x\r\n", m1 ); |
kenjiArai | 0:5b88d5760320 | 96 | // System Clock |
kenjiArai | 0:5b88d5760320 | 97 | m1 = NRF_UICR->XTALFREQ & 0xff; |
kenjiArai | 0:5b88d5760320 | 98 | printf( "System clock by " ); |
kenjiArai | 0:5b88d5760320 | 99 | if (m1) { |
kenjiArai | 0:5b88d5760320 | 100 | printf( "XTAL:16MHz\r\n" ); |
kenjiArai | 0:5b88d5760320 | 101 | } else { |
kenjiArai | 0:5b88d5760320 | 102 | printf( "XTAL:32MHz\r\n" ); |
kenjiArai | 0:5b88d5760320 | 103 | } |
kenjiArai | 0:5b88d5760320 | 104 | m1 = NRF_CLOCK->LFCLKSRCCOPY & 0x3; |
kenjiArai | 0:5b88d5760320 | 105 | printf( "LFCLK Source=32.768 kHz " ); |
kenjiArai | 0:5b88d5760320 | 106 | switch (m1) { |
kenjiArai | 0:5b88d5760320 | 107 | case 0: // revision 1 |
kenjiArai | 0:5b88d5760320 | 108 | printf( "RC oscillator" ); |
kenjiArai | 0:5b88d5760320 | 109 | break; |
kenjiArai | 0:5b88d5760320 | 110 | case 1: // revision 1 |
kenjiArai | 0:5b88d5760320 | 111 | printf( "crystal oscillator" ); |
kenjiArai | 0:5b88d5760320 | 112 | break; |
kenjiArai | 0:5b88d5760320 | 113 | case 2: // revision 1 |
kenjiArai | 0:5b88d5760320 | 114 | printf( "synthesized from HFCLK" ); |
kenjiArai | 0:5b88d5760320 | 115 | break; |
kenjiArai | 0:5b88d5760320 | 116 | default: |
kenjiArai | 0:5b88d5760320 | 117 | printf( "unknown" ); |
kenjiArai | 0:5b88d5760320 | 118 | break; |
kenjiArai | 0:5b88d5760320 | 119 | } |
kenjiArai | 0:5b88d5760320 | 120 | printf("\r\n"); |
kenjiArai | 0:5b88d5760320 | 121 | // FLASH & RAM |
kenjiArai | 0:5b88d5760320 | 122 | mem_cnfg_init(1); |
kenjiArai | 0:5b88d5760320 | 123 | } |
kenjiArai | 0:5b88d5760320 | 124 | |
kenjiArai | 0:5b88d5760320 | 125 | bool compile_condition(void) |
kenjiArai | 0:5b88d5760320 | 126 | { |
kenjiArai | 0:5b88d5760320 | 127 | uint32_t m1 = 0, m2 = 0; |
kenjiArai | 0:5b88d5760320 | 128 | |
kenjiArai | 0:5b88d5760320 | 129 | // ARM |
kenjiArai | 0:5b88d5760320 | 130 | m1 = SCB->CPUID; |
kenjiArai | 0:5b88d5760320 | 131 | m2 = ( m1 >> 24 ); |
kenjiArai | 0:5b88d5760320 | 132 | if ( m2 != 0x41 ) { |
kenjiArai | 0:5b88d5760320 | 133 | return false; |
kenjiArai | 0:5b88d5760320 | 134 | } |
kenjiArai | 0:5b88d5760320 | 135 | // M0 |
kenjiArai | 0:5b88d5760320 | 136 | m2 = ( m1 >> 4 ) & 0xfff; |
kenjiArai | 0:5b88d5760320 | 137 | if ( m2 != 0xc20 ) { |
kenjiArai | 0:5b88d5760320 | 138 | return false; |
kenjiArai | 0:5b88d5760320 | 139 | } |
kenjiArai | 0:5b88d5760320 | 140 | // FLASH |
kenjiArai | 0:5b88d5760320 | 141 | m1 = NRF_FICR->CODEPAGESIZE; |
kenjiArai | 0:5b88d5760320 | 142 | if (m1 != 1024) { |
kenjiArai | 0:5b88d5760320 | 143 | return false; |
kenjiArai | 0:5b88d5760320 | 144 | } |
kenjiArai | 0:5b88d5760320 | 145 | m1 = NRF_FICR->CODESIZE; |
kenjiArai | 0:5b88d5760320 | 146 | if (m1 != 256) { |
kenjiArai | 0:5b88d5760320 | 147 | return false; |
kenjiArai | 0:5b88d5760320 | 148 | } |
kenjiArai | 0:5b88d5760320 | 149 | // RAM |
kenjiArai | 0:5b88d5760320 | 150 | m1 = NRF_FICR->NUMRAMBLOCK; |
kenjiArai | 0:5b88d5760320 | 151 | if (m1 != 4) { |
kenjiArai | 0:5b88d5760320 | 152 | return false; |
kenjiArai | 0:5b88d5760320 | 153 | } |
kenjiArai | 0:5b88d5760320 | 154 | m1 = NRF_FICR->SIZERAMBLOCKS; |
kenjiArai | 0:5b88d5760320 | 155 | if (m1 != 8192) { |
kenjiArai | 0:5b88d5760320 | 156 | return false; |
kenjiArai | 0:5b88d5760320 | 157 | } |
kenjiArai | 0:5b88d5760320 | 158 | // 32MHz Xtal |
kenjiArai | 0:5b88d5760320 | 159 | m1 = NRF_UICR->XTALFREQ & 0xff; |
kenjiArai | 0:5b88d5760320 | 160 | if (m1) { |
kenjiArai | 0:5b88d5760320 | 161 | return false; // Not 32MHz XTAL |
kenjiArai | 0:5b88d5760320 | 162 | } |
kenjiArai | 0:5b88d5760320 | 163 | // LF = internal RC |
kenjiArai | 0:5b88d5760320 | 164 | m1 = NRF_CLOCK->LFCLKSRCCOPY & 0x3; |
kenjiArai | 0:5b88d5760320 | 165 | if (m1 != 0) { |
kenjiArai | 0:5b88d5760320 | 166 | printf("Looks TY51822r3 board\r\n"); |
kenjiArai | 0:5b88d5760320 | 167 | return false; // Not RC |
kenjiArai | 0:5b88d5760320 | 168 | } |
kenjiArai | 0:5b88d5760320 | 169 | printf("Looks TYBLE16 board\r\n"); |
kenjiArai | 0:5b88d5760320 | 170 | return true; |
kenjiArai | 0:5b88d5760320 | 171 | } |