![](/media/cache/profiles/f0fcf351df4eb6786e9bb6fc4e2dee02.jpg.50x50_q85.jpg)
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/
main.cpp@9:ac5faab540da, 2020-01-13 (annotated)
- 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?
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: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 | } |