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 fuyuno sakura

Please refer following page.
http://developer.mbed.org/users/kenjiArai/notebook/simple-frequency-counter/
/users/kenjiArai/notebook/frequency-counters/

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?

UserRevisionLine numberNew 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