Simple frequency counter, run without modification on Nucleo board, Input pin PA0, PA1, PB3. Only for STM32F4 series (Tested on Nucleo-F401RE,-F411RE and F446RE)

Dependencies:   freq_counter_STM32F4xx

see /users/kenjiArai/notebook/frequency-counters/

Committer:
kenjiArai
Date:
Mon Jan 13 07:46:07 2020 +0000
Revision:
9:ac5faab540da
Parent:
8:651bfebc5f39
Modified only for STM32F series (Tested on Nucleo-F401RE,-F411RE and F446RE)

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:ac5faab540da 4 * Copyright (c) 2014,'15,'20 Kenji Arai / JH1PJL
kenjiArai 9:ac5faab540da 5 * http://www7b.biglobe.ne.jp/~kenjia/
kenjiArai 9:ac5faab540da 6 * https://os.mbed.com/users/kenjiArai/
kenjiArai 9:ac5faab540da 7 * Created: October 18th, 2014
kenjiArai 9:ac5faab540da 8 * Revised: January 13th, 2020
kenjiArai 5:af9fa3d0731c 9 *
kenjiArai 5:af9fa3d0731c 10 */
mio 0:c988614df67a 11
kenjiArai 9:ac5faab540da 12 /*
kenjiArai 9:ac5faab540da 13 checked on
kenjiArai 9:ac5faab540da 14 Nucleo-F401RE, F411RE & F446RE
kenjiArai 9:ac5faab540da 15 */
kenjiArai 6:44c2bcbdd77b 16
kenjiArai 9:ac5faab540da 17 // Include --------------------------------------------------------------------
mio 0:c988614df67a 18 #include "mbed.h"
kenjiArai 6:44c2bcbdd77b 19 #include "freq_counter.h"
mio 0:c988614df67a 20
kenjiArai 9:ac5faab540da 21 // Definition -----------------------------------------------------------------
kenjiArai 9:ac5faab540da 22 #define GATE_TIME 1.0f
kenjiArai 9:ac5faab540da 23 // Object ---------------------------------------------------------------------
kenjiArai 9:ac5faab540da 24 DigitalOut led(LED1);
kenjiArai 9:ac5faab540da 25 // PA_8 & PC_9 uses for MCO_1 % MCO_2 -> Clock output for checking
kenjiArai 9:ac5faab540da 26 DigitalOut osc1(PA_8);
kenjiArai 9:ac5faab540da 27 DigitalOut osc2(PC_9);
kenjiArai 5:af9fa3d0731c 28 Serial pc(USBTX, USBRX);
kenjiArai 9:ac5faab540da 29 F_COUNTER fc(PA_0, GATE_TIME);
kenjiArai 9:ac5faab540da 30 //F_COUNTER fc(PA_1, GATE_TIME);
kenjiArai 9:ac5faab540da 31 //F_COUNTER fc(PB_3, GATE_TIME);
kenjiArai 7:0c09d29c4cf3 32
kenjiArai 7:0c09d29c4cf3 33
kenjiArai 9:ac5faab540da 34 // RAM ------------------------------------------------------------------------
kenjiArai 6:44c2bcbdd77b 35
kenjiArai 9:ac5faab540da 36 // ROM / Constant data --------------------------------------------------------
kenjiArai 9:ac5faab540da 37 const float gate_time_select[] = {1.0f, 2.0f, 5.0f, 10.0f, 0.5f, 0.1f};
kenjiArai 6:44c2bcbdd77b 38
kenjiArai 9:ac5faab540da 39 // Function prototypes --------------------------------------------------------
kenjiArai 9:ac5faab540da 40 void port_mco1_mco2_set(void);
mio 1:2a347c40b1da 41
kenjiArai 9:ac5faab540da 42 //------------------------------------------------------------------------------
kenjiArai 5:af9fa3d0731c 43 // Control Program
kenjiArai 9:ac5faab540da 44 //------------------------------------------------------------------------------
kenjiArai 5:af9fa3d0731c 45 int main()
kenjiArai 5:af9fa3d0731c 46 {
kenjiArai 9:ac5faab540da 47 pc.printf("\r\nStart Frequency Counter\r\n");
kenjiArai 9:ac5faab540da 48 port_mco1_mco2_set(); // Set Internalclock for reference
kenjiArai 9:ac5faab540da 49 float t_gate = GATE_TIME;
kenjiArai 9:ac5faab540da 50 float freqency = 0;
kenjiArai 9:ac5faab540da 51 uint32_t pin = fc.read_pin();
kenjiArai 9:ac5faab540da 52 pc.printf("Signal input pin ");
kenjiArai 9:ac5faab540da 53 if (pin == PA_0) {
kenjiArai 9:ac5faab540da 54 pc.printf("= PA_0(A0)\r\n");
kenjiArai 9:ac5faab540da 55 } else if (pin == PA_1) {
kenjiArai 9:ac5faab540da 56 pc.printf("= PA_1(A1)\r\n");
kenjiArai 9:ac5faab540da 57 } else if (pin == PB_3) {
kenjiArai 9:ac5faab540da 58 pc.printf("= PB_3(D3)\r\n");
kenjiArai 9:ac5faab540da 59 } else {
kenjiArai 9:ac5faab540da 60 pc.printf("is NOT correct!!\r\n");
kenjiArai 9:ac5faab540da 61 }
kenjiArai 9:ac5faab540da 62 uint32_t size_of_table = sizeof(gate_time_select) / sizeof(float);
kenjiArai 9:ac5faab540da 63 pc.printf("# of parameter %d\r\n", size_of_table);
kenjiArai 5:af9fa3d0731c 64 while(true) {
kenjiArai 9:ac5faab540da 65 for (uint32_t i = 0; i < size_of_table; i++) {
kenjiArai 9:ac5faab540da 66 t_gate = gate_time_select[i];
kenjiArai 9:ac5faab540da 67 pc.printf("Change gate time : %5.2f [Sec]\r\n", t_gate);
kenjiArai 9:ac5faab540da 68 fc.set_gate_time(t_gate);
kenjiArai 9:ac5faab540da 69 for (uint32_t i = 0; i < 5; i++) {
kenjiArai 9:ac5faab540da 70 led = !led;
kenjiArai 9:ac5faab540da 71 freqency = (float)fc.read_frequency() / t_gate;
kenjiArai 9:ac5faab540da 72 pc.printf("f= %10.0f [Hz], gate= %5.2f [Sec]\r\n",
kenjiArai 9:ac5faab540da 73 freqency, t_gate);
kenjiArai 9:ac5faab540da 74 }
kenjiArai 5:af9fa3d0731c 75 }
mio 1:2a347c40b1da 76 }
mio 1:2a347c40b1da 77 }
kenjiArai 8:651bfebc5f39 78
kenjiArai 8:651bfebc5f39 79 void port_mco1_mco2_set(void)
kenjiArai 8:651bfebc5f39 80 {
kenjiArai 8:651bfebc5f39 81 uint32_t temp = 0x00;
kenjiArai 8:651bfebc5f39 82
kenjiArai 9:ac5faab540da 83 SystemCoreClockUpdate();
kenjiArai 9:ac5faab540da 84 // PA_8 -> MCO_1
kenjiArai 8:651bfebc5f39 85 temp = ((uint32_t)(GPIO_AF0_MCO) << (((uint32_t)8 & (uint32_t)0x07) * 4)) ;
kenjiArai 9:ac5faab540da 86 GPIOA->AFR[8 >> 3] &=
kenjiArai 9:ac5faab540da 87 ~((uint32_t)0xf << ((uint32_t)(8 & (uint32_t)0x07) * 4)) ;
kenjiArai 8:651bfebc5f39 88 GPIOA->AFR[8 >> 3] |= temp;
kenjiArai 8:651bfebc5f39 89 GPIOA->MODER &= ~(GPIO_MODER_MODER0 << (8 * 2));
kenjiArai 8:651bfebc5f39 90 GPIOA->MODER |= (0x2 << (8 * 2));
kenjiArai 8:651bfebc5f39 91 GPIOA->OSPEEDR |= (0x03 << (8 * 2)); // High speed
kenjiArai 9:ac5faab540da 92 // PC_9 -> MCO_2
kenjiArai 8:651bfebc5f39 93 temp = ((uint32_t)(GPIO_AF0_MCO) << (((uint32_t)9 & (uint32_t)0x07) * 4)) ;
kenjiArai 9:ac5faab540da 94 GPIOC->AFR[9 >> 3] &=
kenjiArai 9:ac5faab540da 95 ~((uint32_t)0xf << ((uint32_t)(9 & (uint32_t)0x07) * 4)) ;
kenjiArai 8:651bfebc5f39 96 GPIOC->AFR[9 >> 3] |= temp;
kenjiArai 8:651bfebc5f39 97 GPIOC->MODER &= ~(GPIO_MODER_MODER0 << (9 * 2));
kenjiArai 8:651bfebc5f39 98 GPIOC->MODER |= (0x2 << (9 * 2));
kenjiArai 8:651bfebc5f39 99 GPIOC->OSPEEDR |= (0x03 << (9 * 2)); // High speed
kenjiArai 8:651bfebc5f39 100 // Select output clock source
kenjiArai 8:651bfebc5f39 101 RCC->CFGR &= 0x009fffff;
kenjiArai 9:ac5faab540da 102 pc.printf("System clock = %d [Hz], HSE = %d [Hz]\r\n",
kenjiArai 9:ac5faab540da 103 SystemCoreClock, HSE_VALUE);
kenjiArai 9:ac5faab540da 104 #if 1
kenjiArai 9:ac5faab540da 105 // MCO_1 output HSE 1/4, MCO_2 output SYSCLK 1/4
kenjiArai 8:651bfebc5f39 106 // MCO2 MCO2PRE MCO1PRE MCO1
kenjiArai 8:651bfebc5f39 107 RCC->CFGR |= (0x0 << 30) + (0x6 << 27) + (0x6 << 24) + (0x3 << 22);
kenjiArai 9:ac5faab540da 108 pc.printf("PA_8(MCO_1) = %d [Hz], PC_9(MCO_2) = %d [Hz]\r\n",
kenjiArai 9:ac5faab540da 109 HSE_VALUE / 4, SystemCoreClock / 4);
kenjiArai 8:651bfebc5f39 110 #else
kenjiArai 9:ac5faab540da 111 // MCO_1 output HSE 1/1, MCO_2 output SYSCLK 1/2
kenjiArai 8:651bfebc5f39 112 // MCO2 MCO2PRE MCO1PRE MCO1
kenjiArai 8:651bfebc5f39 113 RCC->CFGR |= (0x0 << 30) + (0x4 << 27) + (0x0 << 24) + (0x3 << 22);
kenjiArai 9:ac5faab540da 114 pc.printf("PA_8(MCO_1) = %d [Hz], PC_9(MCO_2) = %d [Hz]\r\n",
kenjiArai 9:ac5faab540da 115 HSE_VALUE, SystemCoreClock / 2);
kenjiArai 8:651bfebc5f39 116 #endif
kenjiArai 8:651bfebc5f39 117 }