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.
main.cpp@1:67ac582483f9, 2015-05-19 (annotated)
- Committer:
- kenjiArai
- Date:
- Tue May 19 12:05:25 2015 +0000
- Revision:
- 1:67ac582483f9
- Parent:
- 0:325fcc4dca89
- Child:
- 2:8b82f7b0639a
Added detail information.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kenjiArai | 0:325fcc4dca89 | 1 | /* |
| kenjiArai | 0:325fcc4dca89 | 2 | * mbed Application program |
| kenjiArai | 0:325fcc4dca89 | 3 | * Check "System clock" frequency |
| kenjiArai | 0:325fcc4dca89 | 4 | * |
| kenjiArai | 0:325fcc4dca89 | 5 | * Copyright (c) 2015 Kenji Arai / JH1PJL |
| kenjiArai | 0:325fcc4dca89 | 6 | * http://www.page.sannet.ne.jp/kenjia/index.html |
| kenjiArai | 0:325fcc4dca89 | 7 | * http://mbed.org/users/kenjiArai/ |
| kenjiArai | 0:325fcc4dca89 | 8 | * Created: may 18th, 2015 |
| kenjiArai | 0:325fcc4dca89 | 9 | * Revised: may 18th, 2015 |
| kenjiArai | 0:325fcc4dca89 | 10 | * |
| kenjiArai | 0:325fcc4dca89 | 11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
| kenjiArai | 0:325fcc4dca89 | 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE |
| kenjiArai | 0:325fcc4dca89 | 13 | * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| kenjiArai | 0:325fcc4dca89 | 14 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| kenjiArai | 0:325fcc4dca89 | 15 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| kenjiArai | 0:325fcc4dca89 | 16 | */ |
| kenjiArai | 0:325fcc4dca89 | 17 | |
| kenjiArai | 0:325fcc4dca89 | 18 | #include "mbed.h" |
| kenjiArai | 0:325fcc4dca89 | 19 | |
| kenjiArai | 0:325fcc4dca89 | 20 | DigitalOut myled(LED1); |
| kenjiArai | 0:325fcc4dca89 | 21 | |
| kenjiArai | 1:67ac582483f9 | 22 | void put_rn(void); |
| kenjiArai | 1:67ac582483f9 | 23 | void detail_info_if_available(void); |
| kenjiArai | 1:67ac582483f9 | 24 | |
| kenjiArai | 1:67ac582483f9 | 25 | int main() |
| kenjiArai | 1:67ac582483f9 | 26 | { |
| kenjiArai | 1:67ac582483f9 | 27 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 28 | printf("Your mbed SysClock is %u Hz.", SystemCoreClock); |
| kenjiArai | 1:67ac582483f9 | 29 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 30 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 31 | detail_info_if_available(); |
| kenjiArai | 0:325fcc4dca89 | 32 | while(true) { |
| kenjiArai | 0:325fcc4dca89 | 33 | myled = !myled; |
| kenjiArai | 0:325fcc4dca89 | 34 | wait(1.0); |
| kenjiArai | 0:325fcc4dca89 | 35 | } |
| kenjiArai | 0:325fcc4dca89 | 36 | } |
| kenjiArai | 0:325fcc4dca89 | 37 | |
| kenjiArai | 1:67ac582483f9 | 38 | /* measured by JH1PJL on May 18th & 19th, 2015 |
| kenjiArai | 0:325fcc4dca89 | 39 | |
| kenjiArai | 0:325fcc4dca89 | 40 | Check old revision |
| kenjiArai | 1:67ac582483f9 | 41 | Case L152 (C-01 old ver with internal RC clock) |
| kenjiArai | 1:67ac582483f9 | 42 | before and rev.81 20140319 -> 16000000Hz |
| kenjiArai | 1:67ac582483f9 | 43 | rev.82 and after 20140407 -> 32000000Hz |
| kenjiArai | 1:67ac582483f9 | 44 | Case L152 (C-02 new ver) |
| kenjiArai | 0:325fcc4dca89 | 45 | before and rev.81 20140319 -> 16000000Hz |
| kenjiArai | 0:325fcc4dca89 | 46 | rev.82 and after 20140407 -> 24000000Hz |
| kenjiArai | 0:325fcc4dca89 | 47 | Case F401 |
| kenjiArai | 0:325fcc4dca89 | 48 | all rev.(?) -> 84000000Hz |
| kenjiArai | 0:325fcc4dca89 | 49 | Case F411 |
| kenjiArai | 0:325fcc4dca89 | 50 | befoe and rev.97 20150414 -> 100000000Hz |
| kenjiArai | 0:325fcc4dca89 | 51 | rev.98& 99 (as of 20150518) -> 96000000Hz |
| kenjiArai | 0:325fcc4dca89 | 52 | Case LPC1768 |
| kenjiArai | 0:325fcc4dca89 | 53 | rev.99 -> 96000000Hz |
| kenjiArai | 0:325fcc4dca89 | 54 | Case GR-PEACH |
| kenjiArai | 0:325fcc4dca89 | 55 | error "SystemCoreClock" is undefined |
| kenjiArai | 0:325fcc4dca89 | 56 | Case LPC1114FN28 |
| kenjiArai | 0:325fcc4dca89 | 57 | rev.99 -> 48000000Hz |
| kenjiArai | 1:67ac582483f9 | 58 | Case FRDM-K64F |
| kenjiArai | 1:67ac582483f9 | 59 | rev.99 -> 120000000Hz |
| kenjiArai | 1:67ac582483f9 | 60 | */ |
| kenjiArai | 0:325fcc4dca89 | 61 | |
| kenjiArai | 1:67ac582483f9 | 62 | /* ------ History L152RE Clock value ---------------- |
| kenjiArai | 1:67ac582483f9 | 63 | ------------------------------------------------- |
| kenjiArai | 1:67ac582483f9 | 64 | Ver C-02 (NEW) mbed (Rev.99) |
| kenjiArai | 1:67ac582483f9 | 65 | ------------------------------------------------- |
| kenjiArai | 1:67ac582483f9 | 66 | Your mbed SysClock is 24000000 Hz. |
| kenjiArai | 1:67ac582483f9 | 67 | Use PLL with Mul=6, Div=2 |
| kenjiArai | 1:67ac582483f9 | 68 | Use HSE(not Xtal but External Clock)=8000000Hz |
| kenjiArai | 1:67ac582483f9 | 69 | PLL freq=24000000Hz |
| kenjiArai | 1:67ac582483f9 | 70 | SYSCLK clock freq. =24000000Hz |
| kenjiArai | 1:67ac582483f9 | 71 | HCLK clock freq. =24000000Hz |
| kenjiArai | 1:67ac582483f9 | 72 | PCLK1 clock freq. =24000000Hz |
| kenjiArai | 1:67ac582483f9 | 73 | PCLK2 clock freq. =24000000Hz |
| kenjiArai | 1:67ac582483f9 | 74 | RTC/LCD Clock |
| kenjiArai | 1:67ac582483f9 | 75 | No clock |
| kenjiArai | 1:67ac582483f9 | 76 | ------------------------------------------------- |
| kenjiArai | 1:67ac582483f9 | 77 | Ver C-01 (OLD) mbed (Rev.99) |
| kenjiArai | 1:67ac582483f9 | 78 | ------------------------------------------------- |
| kenjiArai | 1:67ac582483f9 | 79 | Your mbed SysClock is 32000000 Hz. |
| kenjiArai | 1:67ac582483f9 | 80 | Use PLL with Mul=4, Div=2 |
| kenjiArai | 1:67ac582483f9 | 81 | Use HSI(internal RC/High speed), RC=16000000Hz |
| kenjiArai | 1:67ac582483f9 | 82 | PLL freq=32000000Hz |
| kenjiArai | 1:67ac582483f9 | 83 | SYSCLK clock freq. =32000000Hz |
| kenjiArai | 1:67ac582483f9 | 84 | HCLK clock freq. =32000000Hz |
| kenjiArai | 1:67ac582483f9 | 85 | PCLK1 clock freq. =32000000Hz |
| kenjiArai | 1:67ac582483f9 | 86 | PCLK2 clock freq. =32000000Hz |
| kenjiArai | 1:67ac582483f9 | 87 | RTC/LCD Clock |
| kenjiArai | 1:67ac582483f9 | 88 | No clock |
| kenjiArai | 1:67ac582483f9 | 89 | ------------------------------------------------- |
| kenjiArai | 1:67ac582483f9 | 90 | Ver C-02 (NEW) mbed (Rev.81) |
| kenjiArai | 1:67ac582483f9 | 91 | ------------------------------------------------- |
| kenjiArai | 1:67ac582483f9 | 92 | Your mbed SysClock is 16000000 Hz. |
| kenjiArai | 1:67ac582483f9 | 93 | Use HSI(internal RC/High speed), freq=16000000Hz |
| kenjiArai | 1:67ac582483f9 | 94 | ------------------------------------------------- |
| kenjiArai | 1:67ac582483f9 | 95 | Ver C-01 (OLD) mbed (Rev.81) |
| kenjiArai | 1:67ac582483f9 | 96 | ------------------------------------------------- |
| kenjiArai | 1:67ac582483f9 | 97 | Your mbed SysClock is 16000000 Hz. |
| kenjiArai | 1:67ac582483f9 | 98 | Use HSI(internal RC/High speed), freq=16000000Hz |
| kenjiArai | 0:325fcc4dca89 | 99 | */ |
| kenjiArai | 1:67ac582483f9 | 100 | |
| kenjiArai | 1:67ac582483f9 | 101 | /////////////////////////////////////////////////////////////////////////////////////////////////// |
| kenjiArai | 1:67ac582483f9 | 102 | #if \ |
| kenjiArai | 1:67ac582483f9 | 103 | defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_L152RE) |
| kenjiArai | 1:67ac582483f9 | 104 | |
| kenjiArai | 1:67ac582483f9 | 105 | // USB Frequency |
| kenjiArai | 1:67ac582483f9 | 106 | #define USB_FREQ_H 48100000 |
| kenjiArai | 1:67ac582483f9 | 107 | #define USB_FREQ_L 47900000 |
| kenjiArai | 1:67ac582483f9 | 108 | |
| kenjiArai | 1:67ac582483f9 | 109 | char *const cmsg0 = "Use MSI(internal RC)"; |
| kenjiArai | 1:67ac582483f9 | 110 | char *const cmsg1 = "freq="; |
| kenjiArai | 1:67ac582483f9 | 111 | char *const cmsg2 = "Use HSI(internal RC/High speed)"; |
| kenjiArai | 1:67ac582483f9 | 112 | char *const cmsg3 = "Use HSE(External Xtal)"; |
| kenjiArai | 1:67ac582483f9 | 113 | char *const cmsg4 = "Use PLL with"; |
| kenjiArai | 1:67ac582483f9 | 114 | char *const cmsg5 = "??? following infromation is not valid !"; |
| kenjiArai | 1:67ac582483f9 | 115 | char *const cmsg6 = "clock freq. ="; |
| kenjiArai | 1:67ac582483f9 | 116 | char *const cmsg7 = "No clock"; |
| kenjiArai | 1:67ac582483f9 | 117 | char *const cmsg8 = "Use LSE(external Xtal)=32768Hz"; |
| kenjiArai | 1:67ac582483f9 | 118 | char *const cmsg9 = "Use LSI(internal RC/Low speed), RC="; |
| kenjiArai | 1:67ac582483f9 | 119 | char *const cmsg10= "Use HSE(external Xtal & prescaler)"; |
| kenjiArai | 1:67ac582483f9 | 120 | //char *const cmsg11= "Power Control"; |
| kenjiArai | 1:67ac582483f9 | 121 | |
| kenjiArai | 1:67ac582483f9 | 122 | #endif |
| kenjiArai | 1:67ac582483f9 | 123 | |
| kenjiArai | 1:67ac582483f9 | 124 | #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) |
| kenjiArai | 1:67ac582483f9 | 125 | |
| kenjiArai | 1:67ac582483f9 | 126 | |
| kenjiArai | 1:67ac582483f9 | 127 | void detail_info_if_available(void) |
| kenjiArai | 1:67ac582483f9 | 128 | { |
| kenjiArai | 1:67ac582483f9 | 129 | uint32_t m1 = 0, m2 = 0, m3 = 0, m4 = 0, m5 = 0; |
| kenjiArai | 1:67ac582483f9 | 130 | |
| kenjiArai | 1:67ac582483f9 | 131 | m1 = RCC->CFGR & RCC_CFGR_SWS; /* Get SYSCLK source */ |
| kenjiArai | 1:67ac582483f9 | 132 | switch (m1) { |
| kenjiArai | 1:67ac582483f9 | 133 | case 0x00: // HSI used as system clock |
| kenjiArai | 1:67ac582483f9 | 134 | printf( "%s, %s%dHz", cmsg2, cmsg1,HSI_VALUE ); |
| kenjiArai | 1:67ac582483f9 | 135 | m2 = HSI_VALUE; |
| kenjiArai | 1:67ac582483f9 | 136 | break; |
| kenjiArai | 1:67ac582483f9 | 137 | case 0x04: // HSE used as system clock |
| kenjiArai | 1:67ac582483f9 | 138 | printf( "%s, %s%dHz", cmsg3, cmsg1, HSE_VALUE ); |
| kenjiArai | 1:67ac582483f9 | 139 | m2 = HSE_VALUE; |
| kenjiArai | 1:67ac582483f9 | 140 | break; |
| kenjiArai | 1:67ac582483f9 | 141 | case 0x08: // PLL used as system clock |
| kenjiArai | 1:67ac582483f9 | 142 | printf("fVCO = fPLL-in x (PLLN/PLLM), fPLL-out = fVCO/PLLP, fUSB-out = fVCO/PLLQ"); |
| kenjiArai | 1:67ac582483f9 | 143 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 144 | m5 = (RCC->PLLCFGR >> 6) & 0x1ff; // PLLN |
| kenjiArai | 1:67ac582483f9 | 145 | m1 = RCC->PLLCFGR & 0x3f; // PLLM |
| kenjiArai | 1:67ac582483f9 | 146 | printf( "%s PLLN=%d, PLLM=%d", cmsg4, m5, m1 ); |
| kenjiArai | 1:67ac582483f9 | 147 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 148 | m3 = (RCC->PLLCFGR >> 22) & 0x1; // Clock source |
| kenjiArai | 1:67ac582483f9 | 149 | if (m3 == 0) { |
| kenjiArai | 1:67ac582483f9 | 150 | // HSI oscillator clock selected as PLL clock source |
| kenjiArai | 1:67ac582483f9 | 151 | m2 = (HSI_VALUE * (m5 / m1)); |
| kenjiArai | 1:67ac582483f9 | 152 | printf( "%s, RC=%dHz", cmsg2, HSI_VALUE ); |
| kenjiArai | 1:67ac582483f9 | 153 | } else { |
| kenjiArai | 1:67ac582483f9 | 154 | // HSE selected |
| kenjiArai | 1:67ac582483f9 | 155 | m2 = (((HSE_VALUE) * m5) / m1); |
| kenjiArai | 1:67ac582483f9 | 156 | if ((RCC->CR >> 18) & 0x01) { // check HSEBYP bit |
| kenjiArai | 1:67ac582483f9 | 157 | // HSE(not Xtal) selected as PLL clock source |
| kenjiArai | 1:67ac582483f9 | 158 | printf( "Use HSE(not Xtal but External Clock)=%dHz", HSE_VALUE ); |
| kenjiArai | 1:67ac582483f9 | 159 | } else { |
| kenjiArai | 1:67ac582483f9 | 160 | // HSE(Xtal) selected as PLL clock source |
| kenjiArai | 1:67ac582483f9 | 161 | printf( "%s, Xtal=%dHz", cmsg3, HSE_VALUE ); |
| kenjiArai | 1:67ac582483f9 | 162 | } |
| kenjiArai | 1:67ac582483f9 | 163 | } |
| kenjiArai | 1:67ac582483f9 | 164 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 165 | printf("PLL/Base %s%dHz", cmsg1, m2); |
| kenjiArai | 1:67ac582483f9 | 166 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 167 | m3 = (RCC->PLLCFGR >> 16) & 0x03; // PLLP |
| kenjiArai | 1:67ac582483f9 | 168 | switch (m3) { |
| kenjiArai | 1:67ac582483f9 | 169 | case 0: |
| kenjiArai | 1:67ac582483f9 | 170 | m3 = 2; |
| kenjiArai | 1:67ac582483f9 | 171 | break; |
| kenjiArai | 1:67ac582483f9 | 172 | case 1: |
| kenjiArai | 1:67ac582483f9 | 173 | m3 = 4; |
| kenjiArai | 1:67ac582483f9 | 174 | break; |
| kenjiArai | 1:67ac582483f9 | 175 | case 2: |
| kenjiArai | 1:67ac582483f9 | 176 | m3 = 6; |
| kenjiArai | 1:67ac582483f9 | 177 | break; |
| kenjiArai | 1:67ac582483f9 | 178 | case 3: |
| kenjiArai | 1:67ac582483f9 | 179 | m3 = 8; |
| kenjiArai | 1:67ac582483f9 | 180 | break; |
| kenjiArai | 1:67ac582483f9 | 181 | } |
| kenjiArai | 1:67ac582483f9 | 182 | m4 = (RCC->PLLCFGR >> 24) & 0x0f; // PLLQ |
| kenjiArai | 1:67ac582483f9 | 183 | printf("%s PLLP=%d, PLLQ=%d", cmsg4, m3, m4); |
| kenjiArai | 1:67ac582483f9 | 184 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 185 | printf("PLL/System %s%dHz", cmsg1, m2/m3); |
| kenjiArai | 1:67ac582483f9 | 186 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 187 | printf("PLL/USB %s%dHz", cmsg1, m2/m4); |
| kenjiArai | 1:67ac582483f9 | 188 | m2 = m2/m4; |
| kenjiArai | 1:67ac582483f9 | 189 | if ((m2 > USB_FREQ_H) || (m2 <USB_FREQ_L)) { |
| kenjiArai | 1:67ac582483f9 | 190 | printf(" -> USB Freq. is out of range!"); |
| kenjiArai | 1:67ac582483f9 | 191 | } |
| kenjiArai | 1:67ac582483f9 | 192 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 193 | break; |
| kenjiArai | 1:67ac582483f9 | 194 | default: // Not come here |
| kenjiArai | 1:67ac582483f9 | 195 | printf( cmsg5 ); |
| kenjiArai | 1:67ac582483f9 | 196 | break; |
| kenjiArai | 1:67ac582483f9 | 197 | } |
| kenjiArai | 1:67ac582483f9 | 198 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 199 | printf( "SYSCLK %s%dHz", cmsg6, HAL_RCC_GetSysClockFreq()); |
| kenjiArai | 1:67ac582483f9 | 200 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 201 | printf( "HCLK %s%dHz", cmsg6, HAL_RCC_GetHCLKFreq()); |
| kenjiArai | 1:67ac582483f9 | 202 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 203 | printf( "PCLK1 %s%dHz", cmsg6, HAL_RCC_GetPCLK1Freq()); |
| kenjiArai | 1:67ac582483f9 | 204 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 205 | printf( "PCLK2 %s%dHz", cmsg6, HAL_RCC_GetPCLK2Freq()); |
| kenjiArai | 1:67ac582483f9 | 206 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 207 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 208 | // Check RTC Clock |
| kenjiArai | 1:67ac582483f9 | 209 | printf("RTC Clock"); |
| kenjiArai | 1:67ac582483f9 | 210 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 211 | m1 = (RCC->BDCR >> 8) & 0x03; |
| kenjiArai | 1:67ac582483f9 | 212 | switch (m1) { |
| kenjiArai | 1:67ac582483f9 | 213 | case 0: // no clock |
| kenjiArai | 1:67ac582483f9 | 214 | printf(cmsg7); |
| kenjiArai | 1:67ac582483f9 | 215 | break; |
| kenjiArai | 1:67ac582483f9 | 216 | case 1: // LSE |
| kenjiArai | 1:67ac582483f9 | 217 | printf(cmsg8); |
| kenjiArai | 1:67ac582483f9 | 218 | break; |
| kenjiArai | 1:67ac582483f9 | 219 | case 2: // LSI |
| kenjiArai | 1:67ac582483f9 | 220 | printf("%s 17 to 47, typ.32KHz", cmsg9); |
| kenjiArai | 1:67ac582483f9 | 221 | break; |
| kenjiArai | 1:67ac582483f9 | 222 | case 3: // HSE |
| kenjiArai | 1:67ac582483f9 | 223 | printf( cmsg10 ); |
| kenjiArai | 1:67ac582483f9 | 224 | m2 = (RCC->PLLCFGR >> 16) & 0x1f; // RTCPRE |
| kenjiArai | 1:67ac582483f9 | 225 | m3 = HSE_VALUE / m2; |
| kenjiArai | 1:67ac582483f9 | 226 | printf("%s%dHz", cmsg6, m3); |
| kenjiArai | 1:67ac582483f9 | 227 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 228 | break; |
| kenjiArai | 1:67ac582483f9 | 229 | default: // Not come here |
| kenjiArai | 1:67ac582483f9 | 230 | printf(cmsg5); |
| kenjiArai | 1:67ac582483f9 | 231 | break; |
| kenjiArai | 1:67ac582483f9 | 232 | } |
| kenjiArai | 1:67ac582483f9 | 233 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 234 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 235 | } |
| kenjiArai | 1:67ac582483f9 | 236 | #elif defined(TARGET_NUCLEO_L152RE) |
| kenjiArai | 1:67ac582483f9 | 237 | |
| kenjiArai | 1:67ac582483f9 | 238 | static __I uint8_t PLLMulTable[9] = {3, 4, 6, 8, 12, 16, 24, 32, 48}; |
| kenjiArai | 1:67ac582483f9 | 239 | |
| kenjiArai | 1:67ac582483f9 | 240 | void detail_info_if_available(void) |
| kenjiArai | 1:67ac582483f9 | 241 | { |
| kenjiArai | 1:67ac582483f9 | 242 | uint32_t m1, m2, m3, m4, m5; |
| kenjiArai | 1:67ac582483f9 | 243 | |
| kenjiArai | 1:67ac582483f9 | 244 | m1 = RCC->CFGR & RCC_CFGR_SWS; /* Get SYSCLK source */ |
| kenjiArai | 1:67ac582483f9 | 245 | switch (m1) { |
| kenjiArai | 1:67ac582483f9 | 246 | case 0x00: // MSI used as system clock |
| kenjiArai | 1:67ac582483f9 | 247 | m4 = ( RCC->ICSCR & RCC_ICSCR_MSIRANGE ) >> 13; |
| kenjiArai | 1:67ac582483f9 | 248 | m2 = (32768 * (1 << (m4 + 1))); |
| kenjiArai | 1:67ac582483f9 | 249 | printf( "%s, %s%dHz", cmsg0, cmsg1, m2); |
| kenjiArai | 1:67ac582483f9 | 250 | break; |
| kenjiArai | 1:67ac582483f9 | 251 | case 0x04: // HSI used as system clock |
| kenjiArai | 1:67ac582483f9 | 252 | printf( "%s, %s%dHz", cmsg2, cmsg1,HSI_VALUE ); |
| kenjiArai | 1:67ac582483f9 | 253 | m2 = HSI_VALUE; |
| kenjiArai | 1:67ac582483f9 | 254 | break; |
| kenjiArai | 1:67ac582483f9 | 255 | case 0x08: // HSE used as system clock |
| kenjiArai | 1:67ac582483f9 | 256 | printf( "%s, %s%dHz", cmsg3, cmsg1, HSE_VALUE ); |
| kenjiArai | 1:67ac582483f9 | 257 | m2 = HSE_VALUE; |
| kenjiArai | 1:67ac582483f9 | 258 | break; |
| kenjiArai | 1:67ac582483f9 | 259 | case 0x0C: // PLL used as system clock |
| kenjiArai | 1:67ac582483f9 | 260 | // Get PLL clock source and multiplication factor |
| kenjiArai | 1:67ac582483f9 | 261 | m5 = RCC->CFGR & RCC_CFGR_PLLMUL; |
| kenjiArai | 1:67ac582483f9 | 262 | m1 = RCC->CFGR & RCC_CFGR_PLLDIV; |
| kenjiArai | 1:67ac582483f9 | 263 | m5 = PLLMulTable[(m5 >> 18)]; |
| kenjiArai | 1:67ac582483f9 | 264 | m1 = (m1 >> 22) + 1; |
| kenjiArai | 1:67ac582483f9 | 265 | printf( "%s Mul=%d, Div=%d", cmsg4, m5, m1 ); |
| kenjiArai | 1:67ac582483f9 | 266 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 267 | m3 = RCC->CFGR & RCC_CFGR_PLLSRC; |
| kenjiArai | 1:67ac582483f9 | 268 | if ( m3 == 0x00 ) { |
| kenjiArai | 1:67ac582483f9 | 269 | // HSI oscillator clock selected as PLL clock source |
| kenjiArai | 1:67ac582483f9 | 270 | m2 = (((HSI_VALUE) * m5) / m1); |
| kenjiArai | 1:67ac582483f9 | 271 | printf( "%s, RC=%dHz", cmsg2, HSI_VALUE ); |
| kenjiArai | 1:67ac582483f9 | 272 | } else { |
| kenjiArai | 1:67ac582483f9 | 273 | // HSE selected |
| kenjiArai | 1:67ac582483f9 | 274 | m2 = (((HSE_VALUE) * m5) / m1); |
| kenjiArai | 1:67ac582483f9 | 275 | if ((RCC->CR >> 18) & 0x01) { // check HSEBYP bit |
| kenjiArai | 1:67ac582483f9 | 276 | // HSE(not Xtal) selected as PLL clock source |
| kenjiArai | 1:67ac582483f9 | 277 | printf( "Use HSE(not Xtal but External Clock)=%dHz", HSE_VALUE ); |
| kenjiArai | 1:67ac582483f9 | 278 | } else { |
| kenjiArai | 1:67ac582483f9 | 279 | // HSE(Xtal) selected as PLL clock source |
| kenjiArai | 1:67ac582483f9 | 280 | printf( "%s, Xtal=%dHz", cmsg3, HSE_VALUE ); |
| kenjiArai | 1:67ac582483f9 | 281 | } |
| kenjiArai | 1:67ac582483f9 | 282 | } |
| kenjiArai | 1:67ac582483f9 | 283 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 284 | printf( "PLL %s%dHz", cmsg1, m2 ); |
| kenjiArai | 1:67ac582483f9 | 285 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 286 | break; |
| kenjiArai | 1:67ac582483f9 | 287 | default: // Not come here |
| kenjiArai | 1:67ac582483f9 | 288 | printf( cmsg5 ); |
| kenjiArai | 1:67ac582483f9 | 289 | break; |
| kenjiArai | 1:67ac582483f9 | 290 | } |
| kenjiArai | 1:67ac582483f9 | 291 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 292 | #if 1 // Nucleo L152RE does NOT support folloing function call (Please set #if 0) |
| kenjiArai | 1:67ac582483f9 | 293 | printf( "SYSCLK %s%dHz", cmsg6, HAL_RCC_GetSysClockFreq() ); |
| kenjiArai | 1:67ac582483f9 | 294 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 295 | printf( "HCLK %s%dHz", cmsg6, HAL_RCC_GetHCLKFreq() ); |
| kenjiArai | 1:67ac582483f9 | 296 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 297 | printf( "PCLK1 %s%dHz", cmsg6, HAL_RCC_GetPCLK1Freq() ); |
| kenjiArai | 1:67ac582483f9 | 298 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 299 | printf( "PCLK2 %s%dHz", cmsg6, HAL_RCC_GetPCLK2Freq() ); |
| kenjiArai | 1:67ac582483f9 | 300 | #endif |
| kenjiArai | 1:67ac582483f9 | 301 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 302 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 303 | m1 = RCC->CSR & RCC_CSR_RTCSEL; |
| kenjiArai | 1:67ac582483f9 | 304 | // Check RTC & LCD Clock |
| kenjiArai | 1:67ac582483f9 | 305 | printf("RTC/LCD Clock"); |
| kenjiArai | 1:67ac582483f9 | 306 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 307 | switch (m1) { |
| kenjiArai | 1:67ac582483f9 | 308 | case RCC_CSR_RTCSEL_NOCLOCK: |
| kenjiArai | 1:67ac582483f9 | 309 | printf( cmsg7 ); |
| kenjiArai | 1:67ac582483f9 | 310 | break; |
| kenjiArai | 1:67ac582483f9 | 311 | case RCC_CSR_RTCSEL_LSE: |
| kenjiArai | 1:67ac582483f9 | 312 | printf( cmsg8 ); |
| kenjiArai | 1:67ac582483f9 | 313 | break; |
| kenjiArai | 1:67ac582483f9 | 314 | case RCC_CSR_RTCSEL_LSI: |
| kenjiArai | 1:67ac582483f9 | 315 | printf("%s 26 to 56, typ.38KHz", cmsg9); |
| kenjiArai | 1:67ac582483f9 | 316 | break; |
| kenjiArai | 1:67ac582483f9 | 317 | case RCC_CSR_RTCSEL_HSE: |
| kenjiArai | 1:67ac582483f9 | 318 | printf( cmsg10 ); |
| kenjiArai | 1:67ac582483f9 | 319 | break; |
| kenjiArai | 1:67ac582483f9 | 320 | default: // Not come here |
| kenjiArai | 1:67ac582483f9 | 321 | printf( cmsg5 ); |
| kenjiArai | 1:67ac582483f9 | 322 | break; |
| kenjiArai | 1:67ac582483f9 | 323 | } |
| kenjiArai | 1:67ac582483f9 | 324 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 325 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 326 | } |
| kenjiArai | 1:67ac582483f9 | 327 | |
| kenjiArai | 1:67ac582483f9 | 328 | #elif defined(TARGET_LPC1768) |
| kenjiArai | 1:67ac582483f9 | 329 | |
| kenjiArai | 1:67ac582483f9 | 330 | #define XTAL (12000000UL) // Oscillator frequency |
| kenjiArai | 1:67ac582483f9 | 331 | #define OSC_CLK ( XTAL) // Main oscillator frequency |
| kenjiArai | 1:67ac582483f9 | 332 | #define RTC_CLK ( 32000UL) // RTC oscillator frequency |
| kenjiArai | 1:67ac582483f9 | 333 | #define IRC_OSC ( 4000000UL) // Internal RC oscillator frequency |
| kenjiArai | 1:67ac582483f9 | 334 | |
| kenjiArai | 1:67ac582483f9 | 335 | void detail_info_if_available(void) |
| kenjiArai | 1:67ac582483f9 | 336 | { |
| kenjiArai | 1:67ac582483f9 | 337 | uint32_t sys_freq = 0; |
| kenjiArai | 1:67ac582483f9 | 338 | |
| kenjiArai | 1:67ac582483f9 | 339 | if (((LPC_SC->PLL0STAT >> 24) & 3) == 3) {/* If PLL0 enabled and connected */ |
| kenjiArai | 1:67ac582483f9 | 340 | printf("PLL0 enabled"); |
| kenjiArai | 1:67ac582483f9 | 341 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 342 | switch (LPC_SC->CLKSRCSEL & 0x03) { |
| kenjiArai | 1:67ac582483f9 | 343 | case 0: /* Internal RC oscillator => PLL0 */ |
| kenjiArai | 1:67ac582483f9 | 344 | case 3: /* Reserved, default to Internal RC */ |
| kenjiArai | 1:67ac582483f9 | 345 | printf("Internal RC Oscillator"); |
| kenjiArai | 1:67ac582483f9 | 346 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 347 | sys_freq = (IRC_OSC * |
| kenjiArai | 1:67ac582483f9 | 348 | (((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / |
| kenjiArai | 1:67ac582483f9 | 349 | (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)) / |
| kenjiArai | 1:67ac582483f9 | 350 | ((LPC_SC->CCLKCFG & 0xFF)+ 1)); |
| kenjiArai | 1:67ac582483f9 | 351 | break; |
| kenjiArai | 1:67ac582483f9 | 352 | case 1: /* Main oscillator => PLL0 */ |
| kenjiArai | 1:67ac582483f9 | 353 | printf("Xtal Osc Clock = %dHz",XTAL ); |
| kenjiArai | 1:67ac582483f9 | 354 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 355 | sys_freq = (OSC_CLK * |
| kenjiArai | 1:67ac582483f9 | 356 | (((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / |
| kenjiArai | 1:67ac582483f9 | 357 | (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)) / |
| kenjiArai | 1:67ac582483f9 | 358 | ((LPC_SC->CCLKCFG & 0xFF)+ 1)); |
| kenjiArai | 1:67ac582483f9 | 359 | break; |
| kenjiArai | 1:67ac582483f9 | 360 | case 2: /* RTC oscillator => PLL0 */ |
| kenjiArai | 1:67ac582483f9 | 361 | printf("RTC Xtal Oscillator f = %dHz", RTC_CLK ); |
| kenjiArai | 1:67ac582483f9 | 362 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 363 | sys_freq = (RTC_CLK * |
| kenjiArai | 1:67ac582483f9 | 364 | (((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / |
| kenjiArai | 1:67ac582483f9 | 365 | (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)) / |
| kenjiArai | 1:67ac582483f9 | 366 | ((LPC_SC->CCLKCFG & 0xFF)+ 1)); |
| kenjiArai | 1:67ac582483f9 | 367 | break; |
| kenjiArai | 1:67ac582483f9 | 368 | } |
| kenjiArai | 1:67ac582483f9 | 369 | } else { |
| kenjiArai | 1:67ac582483f9 | 370 | printf("PLL0 disabled"); |
| kenjiArai | 1:67ac582483f9 | 371 | switch (LPC_SC->CLKSRCSEL & 0x03) { |
| kenjiArai | 1:67ac582483f9 | 372 | case 0: /* Internal RC oscillator => PLL0 */ |
| kenjiArai | 1:67ac582483f9 | 373 | case 3: /* Reserved, default to Internal RC */ |
| kenjiArai | 1:67ac582483f9 | 374 | printf("Internal RC Oscillator"); |
| kenjiArai | 1:67ac582483f9 | 375 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 376 | sys_freq = IRC_OSC / ((LPC_SC->CCLKCFG & 0xFF)+ 1); |
| kenjiArai | 1:67ac582483f9 | 377 | break; |
| kenjiArai | 1:67ac582483f9 | 378 | case 1: /* Main oscillator => PLL0 */ |
| kenjiArai | 1:67ac582483f9 | 379 | printf("Xtal Osc Clock = %dHz",XTAL ); |
| kenjiArai | 1:67ac582483f9 | 380 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 381 | sys_freq = OSC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1); |
| kenjiArai | 1:67ac582483f9 | 382 | break; |
| kenjiArai | 1:67ac582483f9 | 383 | case 2: /* RTC oscillator => PLL0 */ |
| kenjiArai | 1:67ac582483f9 | 384 | printf("RTC Xtal Oscillator f = %dHz", RTC_CLK ); |
| kenjiArai | 1:67ac582483f9 | 385 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 386 | sys_freq = RTC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1); |
| kenjiArai | 1:67ac582483f9 | 387 | break; |
| kenjiArai | 1:67ac582483f9 | 388 | } |
| kenjiArai | 1:67ac582483f9 | 389 | } |
| kenjiArai | 1:67ac582483f9 | 390 | printf("System Clock = %dHz", sys_freq); |
| kenjiArai | 1:67ac582483f9 | 391 | } |
| kenjiArai | 1:67ac582483f9 | 392 | |
| kenjiArai | 1:67ac582483f9 | 393 | #else |
| kenjiArai | 1:67ac582483f9 | 394 | |
| kenjiArai | 1:67ac582483f9 | 395 | void detail_info_if_available(void) |
| kenjiArai | 1:67ac582483f9 | 396 | { |
| kenjiArai | 1:67ac582483f9 | 397 | printf("Detail information -> No support"); |
| kenjiArai | 1:67ac582483f9 | 398 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 399 | put_rn(); |
| kenjiArai | 1:67ac582483f9 | 400 | } |
| kenjiArai | 1:67ac582483f9 | 401 | |
| kenjiArai | 1:67ac582483f9 | 402 | #endif |
| kenjiArai | 1:67ac582483f9 | 403 | |
| kenjiArai | 1:67ac582483f9 | 404 | void put_rn(void) |
| kenjiArai | 1:67ac582483f9 | 405 | { |
| kenjiArai | 1:67ac582483f9 | 406 | printf("\r\n"); |
| kenjiArai | 1:67ac582483f9 | 407 | } |