Only for mbed LPC1768, mbed LPC1114FN28, Nucleo-F401 and Nucleo-F411. No way to change pin assign.
Dependencies: freq_counter TextLCD
Fork of 5MHzOSC by
Please refer following page.
http://developer.mbed.org/users/kenjiArai/notebook/simple-frequency-counter/
/users/kenjiArai/notebook/frequency-counters/
main.cpp@9:0b84a8ce225a, 2020-08-04 (annotated)
- Committer:
- kenjiArai
- Date:
- Tue Aug 04 03:59:57 2020 +0000
- Revision:
- 9:0b84a8ce225a
- Parent:
- 8:651bfebc5f39
modified for running on mbed-os-6.2.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 5:af9fa3d0731c | 1 | /* |
kenjiArai | 5:af9fa3d0731c | 2 | * mbed Application program / Frequency Counter |
kenjiArai | 5:af9fa3d0731c | 3 | * |
kenjiArai | 9:0b84a8ce225a | 4 | * Copyright (c) 2014,'15,'20 Kenji Arai / JH1PJL |
kenjiArai | 9:0b84a8ce225a | 5 | * http://www7b.biglobe.ne.jp/~kenjia/ |
kenjiArai | 9:0b84a8ce225a | 6 | * https://os.mbed.com/users/kenjiArai/ |
kenjiArai | 5:af9fa3d0731c | 7 | * Created: October 18th, 2014 |
kenjiArai | 9:0b84a8ce225a | 8 | * Revised: August 4th, 2020 |
kenjiArai | 5:af9fa3d0731c | 9 | */ |
mio | 0:c988614df67a | 10 | |
kenjiArai | 8:651bfebc5f39 | 11 | //#define USE_TEXT_LCD // use Text LCD/I2C Interface |
kenjiArai | 6:44c2bcbdd77b | 12 | |
mio | 0:c988614df67a | 13 | #include "mbed.h" |
kenjiArai | 6:44c2bcbdd77b | 14 | #include "freq_counter.h" |
kenjiArai | 9:0b84a8ce225a | 15 | |
kenjiArai | 9:0b84a8ce225a | 16 | #define GATE_TIME_10SEC 10000000 |
kenjiArai | 9:0b84a8ce225a | 17 | #define GATE_TIME_1SEC 1000000 |
kenjiArai | 9:0b84a8ce225a | 18 | #define GATE_TIME_100MS 100000 |
kenjiArai | 9:0b84a8ce225a | 19 | #define GATE_TIME_10MS 10000 |
mio | 0:c988614df67a | 20 | |
kenjiArai | 9:0b84a8ce225a | 21 | #define GATE_TIME GATE_TIME_1SEC |
mio | 1:2a347c40b1da | 22 | |
kenjiArai | 9:0b84a8ce225a | 23 | extern void print_revision(void); |
kenjiArai | 9:0b84a8ce225a | 24 | |
kenjiArai | 9:0b84a8ce225a | 25 | // LPC1768 --------------------------------------------------------------------- |
kenjiArai | 6:44c2bcbdd77b | 26 | #if defined(TARGET_LPC1768) |
kenjiArai | 8:651bfebc5f39 | 27 | |
kenjiArai | 5:af9fa3d0731c | 28 | // LPC1768 Frequency example |
kenjiArai | 9:0b84a8ce225a | 29 | // Ref Clock output -> "PWM6" pin to 96MHZ/19 = 5.052MHz (Approx) |
kenjiArai | 9:0b84a8ce225a | 30 | # define CLK_REFRENCE() PWM6_SETCLK(19) |
kenjiArai | 5:af9fa3d0731c | 31 | // Outout mbed's "PWM6" pin to 96MHZ/96 = 1.000MHz (Approx) |
kenjiArai | 7:0c09d29c4cf3 | 32 | //#define CLK_REFRENCE() PWM6_SETCLK(96) |
kenjiArai | 8:651bfebc5f39 | 33 | |
kenjiArai | 9:0b84a8ce225a | 34 | DigitalOut led_gate(LED1); |
kenjiArai | 9:0b84a8ce225a | 35 | I2C i2cBus(p9, p10); // SDA, SCL |
kenjiArai | 9:0b84a8ce225a | 36 | PwmOut fmclck(p21); // for RESERVE pin21 as PWM1[6] |
kenjiArai | 9:0b84a8ce225a | 37 | F_COUNTER fc(p30); |
kenjiArai | 9:0b84a8ce225a | 38 | |
kenjiArai | 9:0b84a8ce225a | 39 | void PWM6_SETCLK(int div); |
kenjiArai | 9:0b84a8ce225a | 40 | |
kenjiArai | 9:0b84a8ce225a | 41 | |
kenjiArai | 9:0b84a8ce225a | 42 | // LPC1114 --------------------------------------------------------------------- |
kenjiArai | 7:0c09d29c4cf3 | 43 | #elif defined(TARGET_LPC1114) |
kenjiArai | 8:651bfebc5f39 | 44 | |
kenjiArai | 9:0b84a8ce225a | 45 | // LPC1114 Frequency example |
kenjiArai | 9:0b84a8ce225a | 46 | // Ref Clock output -> "dp24" pin as CLOCKOUT |
kenjiArai | 7:0c09d29c4cf3 | 47 | |
kenjiArai | 7:0c09d29c4cf3 | 48 | DigitalOut led_gate(LED2); |
kenjiArai | 9:0b84a8ce225a | 49 | I2C i2cBus(dp5,dp27); // SDA, SCL |
kenjiArai | 7:0c09d29c4cf3 | 50 | F_COUNTER fc(dp14); |
kenjiArai | 9:0b84a8ce225a | 51 | |
kenjiArai | 9:0b84a8ce225a | 52 | void clock_out(void); |
kenjiArai | 9:0b84a8ce225a | 53 | # define CLK_REFRENCE() clock_out() |
kenjiArai | 9:0b84a8ce225a | 54 | # warning "Don't forget LPC1114 runs with internal clock." |
kenjiArai | 9:0b84a8ce225a | 55 | # warning "Measurement data is not accurate!!" |
kenjiArai | 7:0c09d29c4cf3 | 56 | |
kenjiArai | 9:0b84a8ce225a | 57 | // STM32 / Nucleo -------------------------------------------------------------- |
kenjiArai | 9:0b84a8ce225a | 58 | #elif defined(TARGET_NUCLEO_F401RE)\ |
kenjiArai | 9:0b84a8ce225a | 59 | || defined(TARGET_NUCLEO_F411RE)\ |
kenjiArai | 9:0b84a8ce225a | 60 | || defined(TARGET_NUCLEO_F446RE) |
kenjiArai | 9:0b84a8ce225a | 61 | |
kenjiArai | 9:0b84a8ce225a | 62 | // STM32 Frequency example |
kenjiArai | 9:0b84a8ce225a | 63 | // Ref Clock output -> "PC_9" pin as MCO2 System clock / 4 |
kenjiArai | 6:44c2bcbdd77b | 64 | |
kenjiArai | 6:44c2bcbdd77b | 65 | DigitalOut led_gate(LED1); |
kenjiArai | 6:44c2bcbdd77b | 66 | I2C i2cBus(PB_9,PB_8); // SDA, SCL |
kenjiArai | 6:44c2bcbdd77b | 67 | F_COUNTER fc(PA_0); |
kenjiArai | 9:0b84a8ce225a | 68 | |
kenjiArai | 9:0b84a8ce225a | 69 | void port_mco2_set(void); |
kenjiArai | 9:0b84a8ce225a | 70 | # define CLK_REFRENCE() port_mco2_set() |
kenjiArai | 6:44c2bcbdd77b | 71 | |
kenjiArai | 9:0b84a8ce225a | 72 | // Other CPU's ----------------------------------------------------------------- |
kenjiArai | 6:44c2bcbdd77b | 73 | #else |
kenjiArai | 9:0b84a8ce225a | 74 | # error "No support for your CPU" |
kenjiArai | 6:44c2bcbdd77b | 75 | #endif |
kenjiArai | 6:44c2bcbdd77b | 76 | |
kenjiArai | 9:0b84a8ce225a | 77 | // Only for LCD control ------------------------------------------------------- |
kenjiArai | 9:0b84a8ce225a | 78 | #if defined(USE_TEXT_LCD) |
kenjiArai | 9:0b84a8ce225a | 79 | #include "TextLCD.h" // Std. lib./ LCD control |
kenjiArai | 9:0b84a8ce225a | 80 | // LCD(Akizuki AQM0802A) |
kenjiArai | 9:0b84a8ce225a | 81 | TextLCD_I2C_N lcd(&i2cBus, 0x7c, TextLCD::LCD8x2); |
kenjiArai | 9:0b84a8ce225a | 82 | void lcd_onotialize(void); |
kenjiArai | 9:0b84a8ce225a | 83 | void display_on_lcd(float freqency, uint32_t t_gate); |
kenjiArai | 9:0b84a8ce225a | 84 | # define LCD_INITIALIZE() lcd_onotialize() |
kenjiArai | 9:0b84a8ce225a | 85 | # define DISPLAY_ON_LCD(x,y) display_on_lcd(x,y) |
kenjiArai | 9:0b84a8ce225a | 86 | #else |
kenjiArai | 9:0b84a8ce225a | 87 | # define LCD_INITIALIZE() {;} |
kenjiArai | 9:0b84a8ce225a | 88 | # define DISPLAY_ON_LCD(x,y) {;} |
kenjiArai | 8:651bfebc5f39 | 89 | #endif |
kenjiArai | 5:af9fa3d0731c | 90 | |
kenjiArai | 9:0b84a8ce225a | 91 | //------------------------------------------------------------------------------ |
kenjiArai | 5:af9fa3d0731c | 92 | // Control Program |
kenjiArai | 9:0b84a8ce225a | 93 | //------------------------------------------------------------------------------ |
kenjiArai | 5:af9fa3d0731c | 94 | int main() |
kenjiArai | 5:af9fa3d0731c | 95 | { |
kenjiArai | 9:0b84a8ce225a | 96 | float freqency; |
kenjiArai | 9:0b84a8ce225a | 97 | uint32_t t_gate; |
kenjiArai | 9:0b84a8ce225a | 98 | |
kenjiArai | 9:0b84a8ce225a | 99 | print_revision(); |
kenjiArai | 9:0b84a8ce225a | 100 | printf("\r\nFrequency Counter by JH1PJL created on " __DATE__ "\r\n"); |
kenjiArai | 9:0b84a8ce225a | 101 | // lcd |
kenjiArai | 9:0b84a8ce225a | 102 | LCD_INITIALIZE(); |
kenjiArai | 7:0c09d29c4cf3 | 103 | // Set Internalclock for reference |
kenjiArai | 7:0c09d29c4cf3 | 104 | CLK_REFRENCE(); |
kenjiArai | 5:af9fa3d0731c | 105 | while(true) { |
kenjiArai | 5:af9fa3d0731c | 106 | led_gate = 1; |
kenjiArai | 9:0b84a8ce225a | 107 | t_gate = GATE_TIME; |
kenjiArai | 5:af9fa3d0731c | 108 | freqency = (float)fc.read_frequency(t_gate); |
kenjiArai | 5:af9fa3d0731c | 109 | led_gate = 0; |
kenjiArai | 9:0b84a8ce225a | 110 | printf("f= %9.0f [Hz], gate= %4.3f [Sec]\r\n", |
kenjiArai | 9:0b84a8ce225a | 111 | freqency, (float)t_gate / 1e6); |
kenjiArai | 9:0b84a8ce225a | 112 | DISPLAY_ON_LCD(freqency, t_gate); |
kenjiArai | 8:651bfebc5f39 | 113 | } |
kenjiArai | 8:651bfebc5f39 | 114 | } |
kenjiArai | 8:651bfebc5f39 | 115 | |
kenjiArai | 8:651bfebc5f39 | 116 | #if defined(TARGET_LPC1768) |
kenjiArai | 8:651bfebc5f39 | 117 | |
kenjiArai | 8:651bfebc5f39 | 118 | // Clock Output From pin21(PWM6) |
kenjiArai | 8:651bfebc5f39 | 119 | // Set Clock Freq with div. |
kenjiArai | 8:651bfebc5f39 | 120 | // if mbed is running at 96MHz, div is set 96 to Get 1MHz. |
kenjiArai | 8:651bfebc5f39 | 121 | void PWM6_SETCLK(int div) |
kenjiArai | 8:651bfebc5f39 | 122 | { |
kenjiArai | 9:0b84a8ce225a | 123 | // 1)Reset counter, disable PWM |
kenjiArai | 9:0b84a8ce225a | 124 | LPC_PWM1->TCR = (1 << 1); |
kenjiArai | 8:651bfebc5f39 | 125 | LPC_SC->PCLKSEL0 &= ~(0x3 << 12); |
kenjiArai | 9:0b84a8ce225a | 126 | // 2)Set peripheral clock divider to /1, i.e. system clock |
kenjiArai | 9:0b84a8ce225a | 127 | LPC_SC->PCLKSEL0 |= (1 << 12); |
kenjiArai | 9:0b84a8ce225a | 128 | // 3)Match Register 0 is shared period counter for all PWM1 |
kenjiArai | 9:0b84a8ce225a | 129 | LPC_PWM1->MR0 = div - 1; |
kenjiArai | 9:0b84a8ce225a | 130 | LPC_PWM1->MR6 = (div + 1)>> 1; |
kenjiArai | 9:0b84a8ce225a | 131 | // 4)Start updating at next period start |
kenjiArai | 9:0b84a8ce225a | 132 | LPC_PWM1->LER |= 1; |
kenjiArai | 9:0b84a8ce225a | 133 | // 5)Enable counter and PWM |
kenjiArai | 9:0b84a8ce225a | 134 | LPC_PWM1->TCR = (1 << 0) + (1 << 3); |
kenjiArai | 9:0b84a8ce225a | 135 | printf("Set pin21(PWM6) for clock output\r\n"); |
kenjiArai | 8:651bfebc5f39 | 136 | } |
kenjiArai | 8:651bfebc5f39 | 137 | |
kenjiArai | 8:651bfebc5f39 | 138 | #elif defined(TARGET_LPC1114) |
kenjiArai | 8:651bfebc5f39 | 139 | |
kenjiArai | 8:651bfebc5f39 | 140 | // CLOCKOUT from pin24(dp18) |
kenjiArai | 8:651bfebc5f39 | 141 | // Freq = 48MHz/4 = 12MHz |
kenjiArai | 8:651bfebc5f39 | 142 | void clock_out(void) |
kenjiArai | 8:651bfebc5f39 | 143 | { |
kenjiArai | 8:651bfebc5f39 | 144 | LPC_SYSCON->CLKOUTCLKSEL = 3; // System clock |
kenjiArai | 8:651bfebc5f39 | 145 | LPC_SYSCON->CLKOUTDIV = 4; // div 1/4 |
kenjiArai | 8:651bfebc5f39 | 146 | LPC_IOCON->PIO0_1 = 1; // select CLKOUT to P0_1(pin24)/dp18 |
kenjiArai | 8:651bfebc5f39 | 147 | LPC_SYSCON->CLKOUTUEN = 1; // enable output |
kenjiArai | 9:0b84a8ce225a | 148 | printf("Set P0_1(pin24)/dp18 for clock output\r\n"); |
kenjiArai | 8:651bfebc5f39 | 149 | } |
kenjiArai | 8:651bfebc5f39 | 150 | |
kenjiArai | 9:0b84a8ce225a | 151 | #elif defined(TARGET_NUCLEO_F401RE)\ |
kenjiArai | 9:0b84a8ce225a | 152 | || defined(TARGET_NUCLEO_F411RE)\ |
kenjiArai | 9:0b84a8ce225a | 153 | || defined(TARGET_NUCLEO_F446RE) |
kenjiArai | 8:651bfebc5f39 | 154 | |
kenjiArai | 9:0b84a8ce225a | 155 | void port_mco2_set(void) |
kenjiArai | 9:0b84a8ce225a | 156 | { |
kenjiArai | 8:651bfebc5f39 | 157 | // PC9 -> MCO_2 |
kenjiArai | 9:0b84a8ce225a | 158 | DigitalOut dumy1(PC_9); |
kenjiArai | 9:0b84a8ce225a | 159 | uint32_t temp = |
kenjiArai | 9:0b84a8ce225a | 160 | ((uint32_t)(GPIO_AF0_MCO) << (((uint32_t)9 & (uint32_t)0x07) * 4)) ; |
kenjiArai | 9:0b84a8ce225a | 161 | GPIOC->AFR[9 >> 3] &= |
kenjiArai | 9:0b84a8ce225a | 162 | ~((uint32_t)0xf << ((uint32_t)(9 & (uint32_t)0x07) * 4)) ; |
kenjiArai | 8:651bfebc5f39 | 163 | GPIOC->AFR[9 >> 3] |= temp; |
kenjiArai | 8:651bfebc5f39 | 164 | GPIOC->MODER &= ~(GPIO_MODER_MODER0 << (9 * 2)); |
kenjiArai | 8:651bfebc5f39 | 165 | GPIOC->MODER |= (0x2 << (9 * 2)); |
kenjiArai | 8:651bfebc5f39 | 166 | GPIOC->OSPEEDR |= (0x03 << (9 * 2)); // High speed |
kenjiArai | 8:651bfebc5f39 | 167 | // Select output clock source |
kenjiArai | 8:651bfebc5f39 | 168 | RCC->CFGR &= 0x009fffff; |
kenjiArai | 9:0b84a8ce225a | 169 | // MCO_2 output SYSCLK 1/4 |
kenjiArai | 9:0b84a8ce225a | 170 | // MCO2 MCO2PRE |
kenjiArai | 9:0b84a8ce225a | 171 | RCC->CFGR |= (0x0 << 30) + (0x6 << 27); |
kenjiArai | 9:0b84a8ce225a | 172 | printf("Set PC9 for clock output\r\n"); |
kenjiArai | 8:651bfebc5f39 | 173 | } |
kenjiArai | 8:651bfebc5f39 | 174 | |
kenjiArai | 8:651bfebc5f39 | 175 | #else |
kenjiArai | 9:0b84a8ce225a | 176 | # error "No support for your CPU" |
kenjiArai | 9:0b84a8ce225a | 177 | #endif |
kenjiArai | 9:0b84a8ce225a | 178 | |
kenjiArai | 9:0b84a8ce225a | 179 | #if defined(USE_TEXT_LCD) |
kenjiArai | 9:0b84a8ce225a | 180 | void lcd_onotialize(void) |
kenjiArai | 9:0b84a8ce225a | 181 | { |
kenjiArai | 9:0b84a8ce225a | 182 | // Initialize LCD |
kenjiArai | 9:0b84a8ce225a | 183 | lcd.locate(0, 0); // 1st line top |
kenjiArai | 9:0b84a8ce225a | 184 | // 12345678 |
kenjiArai | 9:0b84a8ce225a | 185 | lcd.printf("Fre-Cntr"); |
kenjiArai | 9:0b84a8ce225a | 186 | lcd.locate(0, 1); // 2nd line top |
kenjiArai | 9:0b84a8ce225a | 187 | // 12345678 |
kenjiArai | 9:0b84a8ce225a | 188 | lcd.puts(" JH1PJL "); |
kenjiArai | 9:0b84a8ce225a | 189 | lcd.setCursor(TextLCD::CurOff_BlkOff); |
kenjiArai | 9:0b84a8ce225a | 190 | lcd.setContrast(0x16); |
kenjiArai | 9:0b84a8ce225a | 191 | thread_sleep_for(5000); |
kenjiArai | 9:0b84a8ce225a | 192 | lcd.locate(0, 1); // 2nd line top |
kenjiArai | 9:0b84a8ce225a | 193 | // 12345678 |
kenjiArai | 9:0b84a8ce225a | 194 | lcd.puts(" "); |
kenjiArai | 9:0b84a8ce225a | 195 | } |
kenjiArai | 9:0b84a8ce225a | 196 | |
kenjiArai | 9:0b84a8ce225a | 197 | void display_on_lcd(float freqency, uint32_t t_gate) |
kenjiArai | 9:0b84a8ce225a | 198 | { |
kenjiArai | 9:0b84a8ce225a | 199 | lcd.locate(0, 0); // 1st line top |
kenjiArai | 9:0b84a8ce225a | 200 | lcd.printf("%8.0f", freqency); |
kenjiArai | 9:0b84a8ce225a | 201 | lcd.locate(0, 1); // 2nd line top |
kenjiArai | 9:0b84a8ce225a | 202 | switch (t_gate) { |
kenjiArai | 9:0b84a8ce225a | 203 | case GATE_TIME_10SEC: |
kenjiArai | 9:0b84a8ce225a | 204 | // 12345678 |
kenjiArai | 9:0b84a8ce225a | 205 | lcd.printf("Hz x0.1"); |
kenjiArai | 9:0b84a8ce225a | 206 | break; |
kenjiArai | 9:0b84a8ce225a | 207 | case GATE_TIME_1SEC: |
kenjiArai | 9:0b84a8ce225a | 208 | // 12345678 |
kenjiArai | 9:0b84a8ce225a | 209 | lcd.printf("Hz x1"); |
kenjiArai | 9:0b84a8ce225a | 210 | break; |
kenjiArai | 9:0b84a8ce225a | 211 | case GATE_TIME_100MS: |
kenjiArai | 9:0b84a8ce225a | 212 | // 12345678 |
kenjiArai | 9:0b84a8ce225a | 213 | lcd.printf("Hz x10"); |
kenjiArai | 9:0b84a8ce225a | 214 | break; |
kenjiArai | 9:0b84a8ce225a | 215 | case GATE_TIME_10MS: |
kenjiArai | 9:0b84a8ce225a | 216 | // 12345678 |
kenjiArai | 9:0b84a8ce225a | 217 | lcd.printf("Hz x100"); |
kenjiArai | 9:0b84a8ce225a | 218 | break; |
kenjiArai | 9:0b84a8ce225a | 219 | default: |
kenjiArai | 9:0b84a8ce225a | 220 | // 12345678 |
kenjiArai | 9:0b84a8ce225a | 221 | lcd.printf("Hz gate?"); |
kenjiArai | 9:0b84a8ce225a | 222 | break; |
kenjiArai | 9:0b84a8ce225a | 223 | } |
kenjiArai | 9:0b84a8ce225a | 224 | } |
kenjiArai | 8:651bfebc5f39 | 225 | #endif |