Frequency counter library only for DISCO-F746NG & NucleoF411RE +F446RE
Dependents: FreqCntr_GPS1PPS_F746F4xx_w_recipro Freq_Cntr_GPS1PPS_F746NG_GUI
Fork of Frq_cuntr_full by
fc_hw_f746.h@6:be7123d400ae, 2016-11-16 (annotated)
- Committer:
- kenjiArai
- Date:
- Wed Nov 16 13:15:35 2016 +0000
- Revision:
- 6:be7123d400ae
- Parent:
- 5:783b039f9119
Frequency counter library using GPS 1PPS signal
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 5:783b039f9119 | 1 | /* |
kenjiArai | 5:783b039f9119 | 2 | * mbed Library / Frequency Counter using GPS 1PPS gate pulse |
kenjiArai | 5:783b039f9119 | 3 | * Frequency Counter Hardware relataed program |
kenjiArai | 5:783b039f9119 | 4 | * Only for ST DISCO-F746NG |
kenjiArai | 5:783b039f9119 | 5 | * |
kenjiArai | 5:783b039f9119 | 6 | * Re-started: October 5th, 2016 Change board -> DISCO-F746NG |
kenjiArai | 5:783b039f9119 | 7 | * Re-started: October 17th, 2016 Separate common & HW related part |
kenjiArai | 5:783b039f9119 | 8 | * Revised: November 13th, 2016 |
kenjiArai | 5:783b039f9119 | 9 | * |
kenjiArai | 5:783b039f9119 | 10 | */ |
kenjiArai | 5:783b039f9119 | 11 | |
kenjiArai | 5:783b039f9119 | 12 | #if defined(TARGET_STM32F746NG) |
kenjiArai | 5:783b039f9119 | 13 | |
kenjiArai | 5:783b039f9119 | 14 | // Following ring buffers are very big!! 4096 x 8(bytes) x 2(buff) = 64KB |
kenjiArai | 5:783b039f9119 | 15 | RingBuff<uint64_t> fdt_buffer; // RinBuffer for TIM8+4 |
kenjiArai | 5:783b039f9119 | 16 | freq_one fdt; // frequency data in pack (interrupt) |
kenjiArai | 5:783b039f9119 | 17 | RingBuff<uint64_t> onepps_buf; // RinBuffer for TIM2 |
kenjiArai | 5:783b039f9119 | 18 | freq_one onepps_dt; // frequency data in pack (interrupt) |
kenjiArai | 5:783b039f9119 | 19 | |
kenjiArai | 5:783b039f9119 | 20 | //------------------------------------------------------------------------------ |
kenjiArai | 5:783b039f9119 | 21 | // Initialize TIM2 and TIM8+4 |
kenjiArai | 5:783b039f9119 | 22 | //------------------------------------------------------------------------------ |
kenjiArai | 5:783b039f9119 | 23 | // Initialize TIM8 & TIM4 as 32bit counter (TIM8(Low 16bit) + TIM4(High 16bit)) |
kenjiArai | 5:783b039f9119 | 24 | // TIM8 clock input is unkown freq.(measuring freq.) and TIM4 is slave counter |
kenjiArai | 5:783b039f9119 | 25 | // 1PPS gate signal connected both TIM8 IC2, TIM4 IC3 (& TIM2 IC3) |
kenjiArai | 5:783b039f9119 | 26 | void FRQ_CUNTR::initialize_TIMxPy(void) |
kenjiArai | 5:783b039f9119 | 27 | { |
kenjiArai | 5:783b039f9119 | 28 | // Timer8 input max freq.= 108MHz (@SystemCoreClock = 216MHz) |
kenjiArai | 5:783b039f9119 | 29 | // PC6 -> Unkown frequency input pin as Timer8 CH1/TI1 |
kenjiArai | 5:783b039f9119 | 30 | RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOCEN); |
kenjiArai | 5:783b039f9119 | 31 | GPIOC->AFR[0] &= 0xf0ffffff; |
kenjiArai | 5:783b039f9119 | 32 | GPIOC->AFR[0] |= GPIO_AF3_TIM8 << 24; // 6bit x 4 |
kenjiArai | 5:783b039f9119 | 33 | GPIOC->MODER &= ~(GPIO_MODER_MODER6); // AF |
kenjiArai | 5:783b039f9119 | 34 | GPIOC->MODER |= GPIO_MODER_MODER6_1; // alternate function mode |
kenjiArai | 5:783b039f9119 | 35 | GPIOC->PUPDR &= ~(GPIO_PUPDR_PUPDR6); // PU |
kenjiArai | 5:783b039f9119 | 36 | GPIOC->PUPDR |= GPIO_PUPDR_PUPDR6_0; // Pull-up mode |
kenjiArai | 5:783b039f9119 | 37 | // Initialize Timer8(16bit) for an external up counter mode |
kenjiArai | 5:783b039f9119 | 38 | RCC->APB2ENR |= RCC_APB2ENR_TIM8EN; |
kenjiArai | 5:783b039f9119 | 39 | // count_up + div by 1 |
kenjiArai | 5:783b039f9119 | 40 | TIM8->CR1 &= (uint16_t)(~(TIM_CR1_DIR | TIM_CR1_CMS | TIM_CR1_CKD)); |
kenjiArai | 5:783b039f9119 | 41 | // update request only by overflow |
kenjiArai | 5:783b039f9119 | 42 | TIM8->CR1 |= (uint16_t)TIM_CR1_URS; |
kenjiArai | 5:783b039f9119 | 43 | TIM8->ARR = 0xffff; // Use 16bit full |
kenjiArai | 5:783b039f9119 | 44 | TIM8->CCER = 0; // Reset all |
kenjiArai | 5:783b039f9119 | 45 | // input filter + input select |
kenjiArai | 5:783b039f9119 | 46 | TIM8->CCMR1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_CC1S); |
kenjiArai | 5:783b039f9119 | 47 | TIM8->CCMR1 |= TIM_CCMR1_CC1S_0; // CC1 channel = TI1 |
kenjiArai | 5:783b039f9119 | 48 | // external mode 1 |
kenjiArai | 5:783b039f9119 | 49 | TIM8->SMCR &= ~(TIM_SMCR_ECE | TIM_SMCR_TS | TIM_SMCR_SMS); |
kenjiArai | 5:783b039f9119 | 50 | // ECE must be ZERO!!!! |
kenjiArai | 5:783b039f9119 | 51 | TIM8->SMCR |= ( TIM_TS_TI1FP1 | TIM_SLAVEMODE_EXTERNAL1); |
kenjiArai | 5:783b039f9119 | 52 | TIM8->CR2 &= (uint16_t)~(TIM_CR2_TI1S | TIM_CR2_MMS); |
kenjiArai | 5:783b039f9119 | 53 | TIM8->CR2 |= (uint16_t)TIM_CR2_MMS_1; // TRGO update |
kenjiArai | 5:783b039f9119 | 54 | TIM8->CR1 |= (uint16_t)TIM_CR1_CEN; // Enable the TIM Counter |
kenjiArai | 5:783b039f9119 | 55 | // PC7 -> Input Capture pin as Timer8 IC2 |
kenjiArai | 5:783b039f9119 | 56 | GPIOC->AFR[0] &= 0x0fffffff; |
kenjiArai | 5:783b039f9119 | 57 | GPIOC->AFR[0] |= GPIO_AF3_TIM8 << 28; // 7bit x 4 |
kenjiArai | 5:783b039f9119 | 58 | GPIOC->MODER &= ~(GPIO_MODER_MODER7); // AF |
kenjiArai | 5:783b039f9119 | 59 | GPIOC->MODER |= GPIO_MODER_MODER7_1; // alternate function mode |
kenjiArai | 5:783b039f9119 | 60 | GPIOC->PUPDR &= ~(GPIO_PUPDR_PUPDR7); // PU |
kenjiArai | 5:783b039f9119 | 61 | GPIOC->PUPDR |= GPIO_PUPDR_PUPDR7_0; // Pull-up mode |
kenjiArai | 5:783b039f9119 | 62 | // Initialize Timer8 IC2 |
kenjiArai | 5:783b039f9119 | 63 | TIM8->CCER &= (uint16_t)~TIM_CCER_CC2E; // Disable the CC2 |
kenjiArai | 5:783b039f9119 | 64 | // input filter + input select |
kenjiArai | 5:783b039f9119 | 65 | TIM8->CCMR1 &= ~(TIM_CCMR1_IC2F | TIM_CCMR1_CC2S); |
kenjiArai | 5:783b039f9119 | 66 | TIM8->CCMR1 |= TIM_CCMR1_CC2S_0; |
kenjiArai | 5:783b039f9119 | 67 | // positive edge |
kenjiArai | 5:783b039f9119 | 68 | TIM8->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP); |
kenjiArai | 5:783b039f9119 | 69 | TIM8->CCER |= (uint16_t)TIM_CCER_CC2E; // enable capture |
kenjiArai | 5:783b039f9119 | 70 | // Initialize Timer4(16bit) as slave counter of TIM8 |
kenjiArai | 5:783b039f9119 | 71 | // TIM8 overflow event -> ITR3 as Timer4 clock |
kenjiArai | 5:783b039f9119 | 72 | RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; |
kenjiArai | 5:783b039f9119 | 73 | TIM4->CR1 &= (uint16_t)(~(TIM_CR1_DIR | TIM_CR1_CMS | TIM_CR1_CKD)); |
kenjiArai | 5:783b039f9119 | 74 | // only counter overflow for interrupt |
kenjiArai | 5:783b039f9119 | 75 | TIM4->CR1 |= (uint16_t)TIM_CR1_URS; |
kenjiArai | 5:783b039f9119 | 76 | // Up counter uses from 0 to max(32bit) |
kenjiArai | 5:783b039f9119 | 77 | TIM4->ARR = 0xffff; // Use 16bit full |
kenjiArai | 5:783b039f9119 | 78 | TIM4->CCER = 0; // Reset all |
kenjiArai | 5:783b039f9119 | 79 | // external mode 1 |
kenjiArai | 5:783b039f9119 | 80 | TIM4->SMCR &= ~(TIM_SMCR_ECE | TIM_SMCR_TS | TIM_SMCR_SMS); |
kenjiArai | 5:783b039f9119 | 81 | TIM4->SMCR |= (TIM_TS_ITR3); // Set Internal Triger 3 (ITR3) |
kenjiArai | 5:783b039f9119 | 82 | TIM4->SMCR |= (TIM_SLAVEMODE_EXTERNAL1); // ECE must be ZERO!!!! |
kenjiArai | 5:783b039f9119 | 83 | TIM4->CR2 &= (uint16_t)~(TIM_CR2_TI1S | TIM_CR2_MMS); |
kenjiArai | 5:783b039f9119 | 84 | TIM4->CR2 |= (uint16_t)TIM_CR2_MMS_1; // TRGO update |
kenjiArai | 5:783b039f9119 | 85 | TIM4->CR1 |= (uint16_t)TIM_CR1_CEN; // Enable the TIM Counter |
kenjiArai | 5:783b039f9119 | 86 | // PB8 -> Input Capture pin as Timer4 IC3 |
kenjiArai | 5:783b039f9119 | 87 | GPIOB->AFR[1] &= 0xfffffff0; |
kenjiArai | 5:783b039f9119 | 88 | GPIOB->AFR[1] |= GPIO_AF2_TIM4 << 0; // (8-8)bit x 4 |
kenjiArai | 5:783b039f9119 | 89 | GPIOB->MODER &= ~(GPIO_MODER_MODER8); // AF |
kenjiArai | 5:783b039f9119 | 90 | GPIOB->MODER |= GPIO_MODER_MODER8_1; // alternate function mode |
kenjiArai | 5:783b039f9119 | 91 | GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPDR8); // PU |
kenjiArai | 5:783b039f9119 | 92 | GPIOB->PUPDR |= GPIO_PUPDR_PUPDR8_0; // Pull-up mode |
kenjiArai | 5:783b039f9119 | 93 | // Initialize Timer4 IC3 |
kenjiArai | 5:783b039f9119 | 94 | TIM4->CCER &= (uint16_t)~TIM_CCER_CC3E; |
kenjiArai | 5:783b039f9119 | 95 | TIM4->CCMR2 &= ~(TIM_CCMR2_CC3S | TIM_CCMR2_IC3F); |
kenjiArai | 5:783b039f9119 | 96 | TIM4->CCMR2 |= TIM_CCMR2_CC3S_0; |
kenjiArai | 5:783b039f9119 | 97 | // positive edge |
kenjiArai | 5:783b039f9119 | 98 | TIM4->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP); |
kenjiArai | 5:783b039f9119 | 99 | TIM4->CCER |= (uint16_t)TIM_CCER_CC3E; // enable capture |
kenjiArai | 5:783b039f9119 | 100 | // Up counter based on gate time period |
kenjiArai | 5:783b039f9119 | 101 | time_count = 0; |
kenjiArai | 5:783b039f9119 | 102 | // Only for Debug purpose |
kenjiArai | 5:783b039f9119 | 103 | PRINTF("\r\n// Timer8(16bit high(max106MHz) clock)\r\n"); |
kenjiArai | 5:783b039f9119 | 104 | PRINTF("// and Timer4(16bit low clock) combined up counter\r\n"); |
kenjiArai | 5:783b039f9119 | 105 | PRINTF("// Set GPIO for Timer8&4\r\n"); |
kenjiArai | 5:783b039f9119 | 106 | // PB |
kenjiArai | 5:783b039f9119 | 107 | PRINTF("// PB8 -> Input Capture pin as Timer4 CH3/TI3\r\n"); |
kenjiArai | 5:783b039f9119 | 108 | PRINTF("GPIOB->AFRL 0x%08x:0x%08x\r\n",&GPIOB->AFR[0], GPIOB->AFR[0]); |
kenjiArai | 5:783b039f9119 | 109 | PRINTF("GPIOB->AFRH 0x%08x:0x%08x\r\n",&GPIOB->AFR[1], GPIOB->AFR[1]); |
kenjiArai | 5:783b039f9119 | 110 | PRINTF("GPIOB->MODER 0x%08x:0x%08x\r\n",&GPIOB->MODER, GPIOB->MODER); |
kenjiArai | 5:783b039f9119 | 111 | PRINTF("GPIOB->PUPDR 0x%08x:0x%08x\r\n",&GPIOB->PUPDR, GPIOB->PUPDR); |
kenjiArai | 5:783b039f9119 | 112 | PRINTF("GPIOB->OTYPER 0x%08x:0x%08x\r\n",&GPIOB->OTYPER, GPIOB->OTYPER); |
kenjiArai | 5:783b039f9119 | 113 | PRINTF("GPIOB->OSPEEDR 0x%08x:0x%08x\r\n",&GPIOB->OSPEEDR, GPIOB->OSPEEDR); |
kenjiArai | 5:783b039f9119 | 114 | // PC |
kenjiArai | 5:783b039f9119 | 115 | PRINTF("// PC6 -> unkown frequency input pin as Timer8 CH1/TI1\r\n"); |
kenjiArai | 5:783b039f9119 | 116 | PRINTF("// PC7 -> Input Capture pin as Timer8 CH2/TI2\r\n"); |
kenjiArai | 5:783b039f9119 | 117 | PRINTF("GPIOC->AFRL 0x%08x:0x%08x\r\n",&GPIOC->AFR[0], GPIOC->AFR[0]); |
kenjiArai | 5:783b039f9119 | 118 | PRINTF("GPIOC->AFRH 0x%08x:0x%08x\r\n",&GPIOC->AFR[1], GPIOC->AFR[1]); |
kenjiArai | 5:783b039f9119 | 119 | PRINTF("GPIOC->MODER 0x%08x:0x%08x\r\n",&GPIOC->MODER, GPIOC->MODER); |
kenjiArai | 5:783b039f9119 | 120 | PRINTF("GPIOC->PUPDR 0x%08x:0x%08x\r\n",&GPIOC->PUPDR, GPIOC->PUPDR); |
kenjiArai | 5:783b039f9119 | 121 | PRINTF("GPIOC->OTYPER 0x%08x:0x%08x\r\n",&GPIOC->OTYPER, GPIOC->OTYPER); |
kenjiArai | 5:783b039f9119 | 122 | PRINTF("GPIOC->OSPEEDR 0x%08x:0x%08x\r\n",&GPIOC->OSPEEDR, GPIOC->OSPEEDR); |
kenjiArai | 5:783b039f9119 | 123 | // TIM8 |
kenjiArai | 5:783b039f9119 | 124 | PRINTF("// PC6 -> Timer8(16bit) for an external up counter mode\r\n"); |
kenjiArai | 5:783b039f9119 | 125 | PRINTF("// PC7 -> Timer8 IC2\r\n"); |
kenjiArai | 5:783b039f9119 | 126 | PRINTF("TIM8->CR1 0x%08x:0x%08x\r\n",&TIM8->CR1, TIM8->CR1); |
kenjiArai | 5:783b039f9119 | 127 | PRINTF("TIM8->CR2 0x%08x:0x%08x\r\n",&TIM8->CR2, TIM8->CR2); |
kenjiArai | 5:783b039f9119 | 128 | PRINTF("TIM8->ARR 0x%08x:0x%08x\r\n",&TIM8->ARR, TIM8->ARR); |
kenjiArai | 5:783b039f9119 | 129 | PRINTF("TIM8->PSC 0x%08x:0x%08x\r\n",&TIM8->PSC, TIM8->PSC); |
kenjiArai | 5:783b039f9119 | 130 | PRINTF("TIM8->CCMR1 0x%08x:0x%08x\r\n",&TIM8->CCMR1, TIM8->CCMR1); |
kenjiArai | 5:783b039f9119 | 131 | PRINTF("TIM8->CCMR2 0x%08x:0x%08x\r\n",&TIM8->CCMR2, TIM8->CCMR2); |
kenjiArai | 5:783b039f9119 | 132 | PRINTF("TIM8->CCER 0x%08x:0x%08x\r\n",&TIM8->CCER, TIM8->CCER); |
kenjiArai | 5:783b039f9119 | 133 | PRINTF("TIM8->SMCR 0x%08x:0x%08x\r\n",&TIM8->SMCR, TIM8->SMCR); |
kenjiArai | 5:783b039f9119 | 134 | PRINTF("TIM8->DIER 0x%08x:0x%08x\r\n",&TIM8->DIER, TIM8->DIER); |
kenjiArai | 5:783b039f9119 | 135 | // TIM4 |
kenjiArai | 5:783b039f9119 | 136 | PRINTF("// PB8 -> Timer4 IC3\r\n"); |
kenjiArai | 5:783b039f9119 | 137 | PRINTF("TIM4->CR1 0x%08x:0x%08x\r\n",&TIM4->CR1, TIM4->CR1); |
kenjiArai | 5:783b039f9119 | 138 | PRINTF("TIM4->CR2 0x%08x:0x%08x\r\n",&TIM4->CR2, TIM4->CR2); |
kenjiArai | 5:783b039f9119 | 139 | PRINTF("TIM4->ARR 0x%08x:0x%08x\r\n",&TIM4->ARR, TIM4->ARR); |
kenjiArai | 5:783b039f9119 | 140 | PRINTF("TIM4->PSC 0x%08x:0x%08x\r\n",&TIM4->PSC, TIM4->PSC); |
kenjiArai | 5:783b039f9119 | 141 | PRINTF("TIM4->CCMR1 0x%08x:0x%08x\r\n",&TIM4->CCMR1, TIM4->CCMR1); |
kenjiArai | 5:783b039f9119 | 142 | PRINTF("TIM4->CCMR2 0x%08x:0x%08x\r\n",&TIM4->CCMR2, TIM4->CCMR2); |
kenjiArai | 5:783b039f9119 | 143 | PRINTF("TIM4->CCER 0x%08x:0x%08x\r\n",&TIM4->CCER, TIM4->CCER); |
kenjiArai | 5:783b039f9119 | 144 | PRINTF("TIM4->SMCR 0x%08x:0x%08x\r\n",&TIM4->SMCR, TIM4->SMCR); |
kenjiArai | 5:783b039f9119 | 145 | // Interrupt Timer4 IC3 (NOT Timer8 IC2) & Overflow |
kenjiArai | 5:783b039f9119 | 146 | timxpy_ready_flg = 0; |
kenjiArai | 5:783b039f9119 | 147 | timxpy_cnt_data = 0; |
kenjiArai | 5:783b039f9119 | 148 | sw_ovrflw_timxpy = 0; |
kenjiArai | 5:783b039f9119 | 149 | TIM8->SR = 0; // clear all IC/OC flag |
kenjiArai | 5:783b039f9119 | 150 | TIM4->SR = 0; // clear all IC/OC flag |
kenjiArai | 5:783b039f9119 | 151 | TIM4->DIER = 0; // Reset all interrupt flag |
kenjiArai | 5:783b039f9119 | 152 | TIM4->DIER = TIM_DIER_CC3IE + TIM_DIER_UIE; |
kenjiArai | 5:783b039f9119 | 153 | NVIC_SetVector(TIM4_IRQn, (uint32_t)irq_ic_TIMxPy); |
kenjiArai | 5:783b039f9119 | 154 | NVIC_ClearPendingIRQ(TIM4_IRQn); |
kenjiArai | 5:783b039f9119 | 155 | NVIC_EnableIRQ(TIM4_IRQn); |
kenjiArai | 5:783b039f9119 | 156 | PRINTF("TIM4->DIER 0x%08x:0x%08x\r\n\r\n",&TIM4->DIER, TIM4->DIER); |
kenjiArai | 5:783b039f9119 | 157 | PRINTF("RCC->APB1ENR 0x%08x:0x%08x\r\n\r\n",&RCC->APB1ENR, RCC->APB1ENR); |
kenjiArai | 5:783b039f9119 | 158 | } |
kenjiArai | 5:783b039f9119 | 159 | |
kenjiArai | 5:783b039f9119 | 160 | // Initialize TIM2 |
kenjiArai | 5:783b039f9119 | 161 | // IC3->PB10 for GPS 1pps signal |
kenjiArai | 5:783b039f9119 | 162 | // IC1->PA15 for Reciprocal frequency counting mode (Interrupt) |
kenjiArai | 5:783b039f9119 | 163 | void FRQ_CUNTR::initialize_TIMz(void) |
kenjiArai | 5:783b039f9119 | 164 | { |
kenjiArai | 5:783b039f9119 | 165 | // Initialize Timer2(32bit) for an internal(108MHz) up counter mode |
kenjiArai | 5:783b039f9119 | 166 | RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; |
kenjiArai | 5:783b039f9119 | 167 | // count_up + div by 1 |
kenjiArai | 5:783b039f9119 | 168 | TIM2->CR1 &= (uint16_t)(~(TIM_CR1_DIR | TIM_CR1_CMS | TIM_CR1_CKD)); |
kenjiArai | 5:783b039f9119 | 169 | // only counter overflow for interrupt |
kenjiArai | 5:783b039f9119 | 170 | TIM2->CR1 |= (uint16_t)TIM_CR1_URS; |
kenjiArai | 5:783b039f9119 | 171 | // Up counter uses from 0 to max(32bit) |
kenjiArai | 5:783b039f9119 | 172 | TIM2->ARR = 0xffffffff; |
kenjiArai | 5:783b039f9119 | 173 | TIM2->PSC = 0x0000; // 1/1 |
kenjiArai | 5:783b039f9119 | 174 | TIM2->CCER = 0; // Reset all |
kenjiArai | 5:783b039f9119 | 175 | // input filter + input select |
kenjiArai | 5:783b039f9119 | 176 | TIM2->CCMR1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_CC1S); |
kenjiArai | 5:783b039f9119 | 177 | TIM2->CCMR1 |= TIM_CCMR1_CC1S_0; |
kenjiArai | 5:783b039f9119 | 178 | TIM2->SMCR = 0; // Internal clock |
kenjiArai | 5:783b039f9119 | 179 | TIM2->CR1 |= (uint16_t)TIM_CR1_CEN; // Enable the TIM Counter |
kenjiArai | 5:783b039f9119 | 180 | // PA15 -> Input Capture pin as Timer2 IC1 |
kenjiArai | 5:783b039f9119 | 181 | GPIOA->AFR[1] &= 0x0fffffff; |
kenjiArai | 5:783b039f9119 | 182 | GPIOA->AFR[1] |= GPIO_AF1_TIM2 << 28; // 15-8 = 7bit x 4 |
kenjiArai | 5:783b039f9119 | 183 | GPIOA->MODER &= ~(GPIO_MODER_MODER15); // AF |
kenjiArai | 5:783b039f9119 | 184 | GPIOA->MODER |= GPIO_MODER_MODER15_1; // alternate function mode |
kenjiArai | 5:783b039f9119 | 185 | GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR15); // PU |
kenjiArai | 5:783b039f9119 | 186 | GPIOA->PUPDR |= GPIO_PUPDR_PUPDR15_0; // Pull-up mode |
kenjiArai | 5:783b039f9119 | 187 | // Initialize Timer2 IC1 |
kenjiArai | 5:783b039f9119 | 188 | // input filter + input select |
kenjiArai | 5:783b039f9119 | 189 | TIM2->CCMR1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_CC1S); |
kenjiArai | 5:783b039f9119 | 190 | TIM2->CCMR1 |= (TIM_CCMR1_CC1S_0 + TIM_CCMR1_IC1F_1); // filter = fCLK/4 |
kenjiArai | 5:783b039f9119 | 191 | // positive edge |
kenjiArai | 5:783b039f9119 | 192 | TIM2->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP); |
kenjiArai | 5:783b039f9119 | 193 | TIM2->CCER |= (uint16_t)TIM_CCER_CC1E; // enable capture |
kenjiArai | 5:783b039f9119 | 194 | // PB10 -> Input Capture pin as Timer2 IC3 for Reciprocal |
kenjiArai | 5:783b039f9119 | 195 | GPIOB->AFR[1] &= 0xfffff0ff; |
kenjiArai | 5:783b039f9119 | 196 | GPIOB->AFR[1] |= GPIO_AF1_TIM2 << 8; // 10-8 = 2bit x 4 |
kenjiArai | 5:783b039f9119 | 197 | GPIOB->MODER &= ~(GPIO_MODER_MODER10); // AF |
kenjiArai | 5:783b039f9119 | 198 | GPIOB->MODER |= GPIO_MODER_MODER10_1; // alternate function mode |
kenjiArai | 5:783b039f9119 | 199 | GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPDR10); // PU |
kenjiArai | 5:783b039f9119 | 200 | GPIOB->PUPDR |= GPIO_PUPDR_PUPDR10_0; // Pull-up mode |
kenjiArai | 5:783b039f9119 | 201 | // Initialize Timer2 IC3 |
kenjiArai | 5:783b039f9119 | 202 | TIM2->CCER &= (uint16_t)~TIM_CCER_CC3E; // Disable the CC |
kenjiArai | 5:783b039f9119 | 203 | TIM2->CCMR2 &= ~(TIM_CCMR2_IC3F | TIM_CCMR2_CC3S); |
kenjiArai | 5:783b039f9119 | 204 | //TIM2->CCMR2 |= TIM_CCMR2_CC3S_0; // filter none |
kenjiArai | 5:783b039f9119 | 205 | TIM2->CCMR2 |= (TIM_CCMR2_CC3S_0 + TIM_CCMR2_IC3F_1); // filter = fCLK/4 |
kenjiArai | 5:783b039f9119 | 206 | // positive edge |
kenjiArai | 5:783b039f9119 | 207 | TIM2->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP); |
kenjiArai | 5:783b039f9119 | 208 | TIM2->CCER |= (uint16_t)TIM_CCER_CC3E; // enable capture |
kenjiArai | 5:783b039f9119 | 209 | // Up counter based on gate time period |
kenjiArai | 5:783b039f9119 | 210 | time_count_onepps = 0; |
kenjiArai | 5:783b039f9119 | 211 | // Only for Debug purpose |
kenjiArai | 5:783b039f9119 | 212 | // PA |
kenjiArai | 5:783b039f9119 | 213 | PRINTF("\r\n// Timer2(32bit) for an internal up counter mode\r\n"); |
kenjiArai | 5:783b039f9119 | 214 | PRINTF("// Set GPIO for Timer2\r\n"); |
kenjiArai | 5:783b039f9119 | 215 | PRINTF("// PA15 -> Input Capture pin as Timer2 CH1/TI1\r\n"); |
kenjiArai | 5:783b039f9119 | 216 | PRINTF("GPIOA->AFRL 0x%08x:0x%08x\r\n",&GPIOA->AFR[0], GPIOA->AFR[0]); |
kenjiArai | 5:783b039f9119 | 217 | PRINTF("GPIOA->AFRH 0x%08x:0x%08x\r\n",&GPIOA->AFR[1], GPIOA->AFR[1]); |
kenjiArai | 5:783b039f9119 | 218 | PRINTF("GPIOA->MODER 0x%08x:0x%08x\r\n",&GPIOA->MODER, GPIOA->MODER); |
kenjiArai | 5:783b039f9119 | 219 | PRINTF("GPIOA->PUPDR 0x%08x:0x%08x\r\n",&GPIOA->PUPDR, GPIOA->PUPDR); |
kenjiArai | 5:783b039f9119 | 220 | // PB |
kenjiArai | 5:783b039f9119 | 221 | PRINTF("// PB10 -> Input Capture pin as Timer2 CH3/TI3\r\n"); |
kenjiArai | 5:783b039f9119 | 222 | PRINTF("GPIOB->AFRL 0x%08x:0x%08x\r\n",&GPIOB->AFR[0], GPIOB->AFR[0]); |
kenjiArai | 5:783b039f9119 | 223 | PRINTF("GPIOB->AFRH 0x%08x:0x%08x\r\n",&GPIOB->AFR[1], GPIOB->AFR[1]); |
kenjiArai | 5:783b039f9119 | 224 | PRINTF("GPIOB->MODER 0x%08x:0x%08x\r\n",&GPIOB->MODER, GPIOB->MODER); |
kenjiArai | 5:783b039f9119 | 225 | PRINTF("GPIOB->PUPDR 0x%08x:0x%08x\r\n",&GPIOB->PUPDR, GPIOB->PUPDR); |
kenjiArai | 5:783b039f9119 | 226 | // TIM2 |
kenjiArai | 5:783b039f9119 | 227 | PRINTF("// PA15 -> Timer2 IC1\r\n"); |
kenjiArai | 5:783b039f9119 | 228 | PRINTF("// PB10 -> Timer2 IC3\r\n"); |
kenjiArai | 5:783b039f9119 | 229 | PRINTF("TIM2->CR1 0x%08x:0x%08x\r\n",&TIM2->CR1, TIM2->CR1); |
kenjiArai | 5:783b039f9119 | 230 | PRINTF("TIM2->CR2 0x%08x:0x%08x\r\n",&TIM2->CR2, TIM2->CR2); |
kenjiArai | 5:783b039f9119 | 231 | PRINTF("TIM2->ARR 0x%08x:0x%08x\r\n",&TIM2->ARR, TIM2->ARR); |
kenjiArai | 5:783b039f9119 | 232 | PRINTF("TIM2->PSC 0x%08x:0x%08x\r\n",&TIM2->PSC, TIM2->PSC); |
kenjiArai | 5:783b039f9119 | 233 | PRINTF("TIM2->CCMR1 0x%08x:0x%08x\r\n",&TIM2->CCMR1, TIM2->CCMR1); |
kenjiArai | 5:783b039f9119 | 234 | PRINTF("TIM2->CCMR2 0x%08x:0x%08x\r\n",&TIM2->CCMR2, TIM2->CCMR2); |
kenjiArai | 5:783b039f9119 | 235 | PRINTF("TIM2->CCER 0x%08x:0x%08x\r\n",&TIM2->CCER, TIM2->CCER); |
kenjiArai | 5:783b039f9119 | 236 | PRINTF("TIM2->SMCR 0x%08x:0x%08x\r\n",&TIM2->SMCR, TIM2->SMCR); |
kenjiArai | 5:783b039f9119 | 237 | // Interrupt Timer2 IC4(disable at this moment) & Overflow |
kenjiArai | 5:783b039f9119 | 238 | timz_cnt_data = 0; |
kenjiArai | 5:783b039f9119 | 239 | sw_ovrflw_timz = 0; |
kenjiArai | 5:783b039f9119 | 240 | TIM2->SR = 0; // clear all IC/OC flag |
kenjiArai | 5:783b039f9119 | 241 | TIM2->DIER = 0; // Disable all interrupt |
kenjiArai | 5:783b039f9119 | 242 | TIM2->DIER = TIM_DIER_UIE; // set only overflow |
kenjiArai | 5:783b039f9119 | 243 | NVIC_SetVector(TIM2_IRQn, (uint32_t)irq_ic_TIMz); |
kenjiArai | 5:783b039f9119 | 244 | NVIC_ClearPendingIRQ(TIM2_IRQn); |
kenjiArai | 5:783b039f9119 | 245 | NVIC_EnableIRQ(TIM2_IRQn); |
kenjiArai | 5:783b039f9119 | 246 | PRINTF("TIM2->DIER 0x%08x:0x%08x\r\n\r\n",&TIM2->DIER, TIM2->DIER); |
kenjiArai | 5:783b039f9119 | 247 | } |
kenjiArai | 5:783b039f9119 | 248 | |
kenjiArai | 5:783b039f9119 | 249 | //------------------------------------------------------------------------------ |
kenjiArai | 5:783b039f9119 | 250 | // Reciprocal measuremt |
kenjiArai | 5:783b039f9119 | 251 | //------------------------------------------------------------------------------ |
kenjiArai | 5:783b039f9119 | 252 | void FRQ_CUNTR::start_action(void) |
kenjiArai | 5:783b039f9119 | 253 | { |
kenjiArai | 5:783b039f9119 | 254 | __disable_irq(); |
kenjiArai | 5:783b039f9119 | 255 | TIM2->SR &= ~TIM_SR_CC1IF; // clear IC flag |
kenjiArai | 5:783b039f9119 | 256 | TIM2->DIER |= TIM_DIER_CC1IE; // Enable IC1 |
kenjiArai | 5:783b039f9119 | 257 | __enable_irq(); |
kenjiArai | 5:783b039f9119 | 258 | } |
kenjiArai | 5:783b039f9119 | 259 | |
kenjiArai | 5:783b039f9119 | 260 | //------------------------------------------------------------------------------ |
kenjiArai | 5:783b039f9119 | 261 | // Frequency check for test & debug purpose |
kenjiArai | 5:783b039f9119 | 262 | //------------------------------------------------------------------------------ |
kenjiArai | 5:783b039f9119 | 263 | // Read TIM8(+TIM4) Input frequency |
kenjiArai | 5:783b039f9119 | 264 | uint32_t FRQ_CUNTR::debug_read_input_frequency(double gatetime) |
kenjiArai | 5:783b039f9119 | 265 | { |
kenjiArai | 5:783b039f9119 | 266 | TIM8->CR1 &= ~(uint16_t)TIM_CR1_CEN; // disable the TIM8 Counter |
kenjiArai | 5:783b039f9119 | 267 | TIM4->CNT = 0; |
kenjiArai | 5:783b039f9119 | 268 | TIM8->CNT = 0; |
kenjiArai | 5:783b039f9119 | 269 | TIM8->CR1 |= (uint16_t)TIM_CR1_CEN; // Enable the TIM8 Counter |
kenjiArai | 5:783b039f9119 | 270 | wait(gatetime); // Gate time for count |
kenjiArai | 5:783b039f9119 | 271 | TIM8->CR1 &= ~(uint16_t)TIM_CR1_CEN; // disable the TIM8 Counter |
kenjiArai | 5:783b039f9119 | 272 | uint32_t freq = (TIM4->CNT << 16) + TIM8->CNT; |
kenjiArai | 5:783b039f9119 | 273 | TIM8->CR1 |= (uint16_t)TIM_CR1_CEN; // Enable the TIM8 Counter |
kenjiArai | 5:783b039f9119 | 274 | PRINTF("Input freq.=%10d [Hz], gate= %4.2f [Sec]\r\n", freq, gatetime); |
kenjiArai | 5:783b039f9119 | 275 | return freq; // read counter |
kenjiArai | 5:783b039f9119 | 276 | } |
kenjiArai | 5:783b039f9119 | 277 | |
kenjiArai | 5:783b039f9119 | 278 | // Read TIM2 Clock frequency |
kenjiArai | 5:783b039f9119 | 279 | uint32_t FRQ_CUNTR::debug_read_base_clock_frequency(double gatetime) |
kenjiArai | 5:783b039f9119 | 280 | { |
kenjiArai | 5:783b039f9119 | 281 | TIM2->CNT = 0; |
kenjiArai | 5:783b039f9119 | 282 | wait(gatetime); // Gate time for count |
kenjiArai | 5:783b039f9119 | 283 | uint32_t freq = TIM2->CNT; // read counter |
kenjiArai | 5:783b039f9119 | 284 | PRINTF("Clock Counter=%10d, gate= %4.2f [Sec]\r\n", freq, gatetime); |
kenjiArai | 5:783b039f9119 | 285 | return freq; // return counter data |
kenjiArai | 5:783b039f9119 | 286 | } |
kenjiArai | 5:783b039f9119 | 287 | |
kenjiArai | 5:783b039f9119 | 288 | // Dump all buffered data |
kenjiArai | 5:783b039f9119 | 289 | void FRQ_CUNTR::debug_printf_all_buffer(void) |
kenjiArai | 5:783b039f9119 | 290 | { |
kenjiArai | 5:783b039f9119 | 291 | fdt_buffer.debug_print_all_buffer(); |
kenjiArai | 5:783b039f9119 | 292 | } |
kenjiArai | 5:783b039f9119 | 293 | |
kenjiArai | 5:783b039f9119 | 294 | //------------------------------------------------------------------------------ |
kenjiArai | 5:783b039f9119 | 295 | // Interrupt Handlers |
kenjiArai | 5:783b039f9119 | 296 | //------------------------------------------------------------------------------ |
kenjiArai | 5:783b039f9119 | 297 | // GPS 1PPS signal interrupt (connected to TIM4 IC3, TIM8 IC2 and TIM2 IC3) |
kenjiArai | 5:783b039f9119 | 298 | // TIM4 IC3 Interrupt control |
kenjiArai | 5:783b039f9119 | 299 | void irq_ic_TIMxPy(void) |
kenjiArai | 5:783b039f9119 | 300 | { |
kenjiArai | 5:783b039f9119 | 301 | // IC3 (GPS 1PPS) |
kenjiArai | 5:783b039f9119 | 302 | if (TIM4->SR & TIM_SR_CC3IF){ |
kenjiArai | 5:783b039f9119 | 303 | TIM8->SR &= ~TIM_SR_CC2IF; // clear IC flag |
kenjiArai | 5:783b039f9119 | 304 | TIM4->SR &= ~TIM_SR_CC3IF; // clear IC flag |
kenjiArai | 5:783b039f9119 | 305 | TIM2->SR &= ~TIM_SR_CC3IF; // clear IC flag |
kenjiArai | 5:783b039f9119 | 306 | timxpy_cnt_data = (TIM4->CCR3 << 16) + TIM8->CCR2; // 16+16 bit |
kenjiArai | 5:783b039f9119 | 307 | timxpy_ready_flg = 1; |
kenjiArai | 5:783b039f9119 | 308 | timz_cnt_data = TIM2->CCR3; // 32 bit |
kenjiArai | 5:783b039f9119 | 309 | // data saves into the ring buffer / Unknown Freq. |
kenjiArai | 5:783b039f9119 | 310 | fdt.freq_dt = timxpy_cnt_data; |
kenjiArai | 5:783b039f9119 | 311 | fdt.f_sw_dt = sw_ovrflw_timxpy; |
kenjiArai | 5:783b039f9119 | 312 | fdt.t_cnt = ++time_count; |
kenjiArai | 5:783b039f9119 | 313 | fdt_buffer.ring_put_dt(fdt.f_1sec_dt); |
kenjiArai | 5:783b039f9119 | 314 | // data saves into the ring buffer / F746 internal clock |
kenjiArai | 5:783b039f9119 | 315 | onepps_dt.freq_dt = timz_cnt_data; |
kenjiArai | 5:783b039f9119 | 316 | onepps_dt.f_sw_dt = sw_ovrflw_timz; |
kenjiArai | 5:783b039f9119 | 317 | onepps_dt.t_cnt = ++time_count_onepps; |
kenjiArai | 5:783b039f9119 | 318 | onepps_buf.ring_put_dt(onepps_dt.f_1sec_dt); |
kenjiArai | 5:783b039f9119 | 319 | #if ACTIVE_LED_TIMX |
kenjiArai | 5:783b039f9119 | 320 | irq_led1 = !irq_led1; |
kenjiArai | 5:783b039f9119 | 321 | #endif // ACTIVE_LED |
kenjiArai | 5:783b039f9119 | 322 | } |
kenjiArai | 5:783b039f9119 | 323 | // TIM4 overflow |
kenjiArai | 5:783b039f9119 | 324 | if (TIM4->SR & TIM_SR_UIF){ |
kenjiArai | 5:783b039f9119 | 325 | TIM4->SR &= ~TIM_SR_UIF; |
kenjiArai | 5:783b039f9119 | 326 | ++sw_ovrflw_timxpy; |
kenjiArai | 5:783b039f9119 | 327 | } |
kenjiArai | 5:783b039f9119 | 328 | } |
kenjiArai | 5:783b039f9119 | 329 | |
kenjiArai | 5:783b039f9119 | 330 | // Reciprocal data (TIM2 IC1) |
kenjiArai | 5:783b039f9119 | 331 | void irq_ic_TIMz(void) |
kenjiArai | 5:783b039f9119 | 332 | { |
kenjiArai | 5:783b039f9119 | 333 | // IC1 (for reciprocal measurement) |
kenjiArai | 5:783b039f9119 | 334 | if (TIM2->SR & TIM_SR_CC1IF){ |
kenjiArai | 5:783b039f9119 | 335 | TIM2->SR &= ~TIM_SR_CC1IF; // clear IC flag |
kenjiArai | 5:783b039f9119 | 336 | uint32_t data = TIM2->CCR1; |
kenjiArai | 5:783b039f9119 | 337 | if (recipro_step == 0){ // start measuring |
kenjiArai | 5:783b039f9119 | 338 | recipro_start = data; |
kenjiArai | 5:783b039f9119 | 339 | recipro_step = 1; |
kenjiArai | 5:783b039f9119 | 340 | } else if (recipro_step == 1){ // stop |
kenjiArai | 5:783b039f9119 | 341 | TIM2->DIER &= ~TIM_DIER_CC1IE; // disable IC4 interrupt |
kenjiArai | 5:783b039f9119 | 342 | recipro_stop = data; |
kenjiArai | 5:783b039f9119 | 343 | recipro_step = 2; |
kenjiArai | 5:783b039f9119 | 344 | } else { // jsut in case |
kenjiArai | 5:783b039f9119 | 345 | TIM2->DIER &= ~TIM_DIER_CC1IE; // disable IC4 interrupt |
kenjiArai | 5:783b039f9119 | 346 | recipro_step = 0; |
kenjiArai | 5:783b039f9119 | 347 | } |
kenjiArai | 5:783b039f9119 | 348 | #if ACTIVE_LED_TIMZ |
kenjiArai | 5:783b039f9119 | 349 | irq_led1 = !irq_led1; |
kenjiArai | 5:783b039f9119 | 350 | #endif // ACTIVE_LED |
kenjiArai | 5:783b039f9119 | 351 | } |
kenjiArai | 5:783b039f9119 | 352 | // TIM2 overflow |
kenjiArai | 5:783b039f9119 | 353 | if (TIM2->SR & TIM_SR_UIF){ // 32bit counter overflow |
kenjiArai | 5:783b039f9119 | 354 | TIM2->SR &= ~TIM_SR_UIF; |
kenjiArai | 5:783b039f9119 | 355 | ++sw_ovrflw_timz; |
kenjiArai | 5:783b039f9119 | 356 | } |
kenjiArai | 5:783b039f9119 | 357 | } |
kenjiArai | 5:783b039f9119 | 358 | |
kenjiArai | 5:783b039f9119 | 359 | #endif // defined(TARGET_STM32F746NG) |