#include <stdint.h>
#include <stdio.h>
#include "stm32f103_hal.h"
#include "lcd.h"
volatile uint32_t last_capture = 0;
volatile uint32_t period_ticks = 0;
volatile uint8_t capture_flag = 0;
volatile uint32_t update_ms = 0;
void TIM3_IRQHandler(void) {
if (TIM3->SR & TIM_SR_CC1IF) {
uint32_t current_capture = TIM3->CCR1;
if (current_capture >= last_capture) {
period_ticks = current_capture - last_capture;
} else {
period_ticks = (0xFFFF - last_capture) + current_capture + 1;
}
last_capture = current_capture;
capture_flag = 1;
}
}
void TIM2_IRQHandler(void) {
if (TIM2->SR & TIM_SR_UIF) {
TIM2->SR &= ~TIM_SR_UIF;
update_ms++;
}
}
void delay_ms(uint16_t ms) {
volatile unsigned long t = 0;
for(uint16_t i = 0; i < ms; i++) {
for(t = 0; t < 800; t++);
}
}
int main(void) {
rcc_clock_enable(RCC_GPIOA);
rcc_clock_enable(RCC_TIM2);
rcc_clock_enable(RCC_TIM3);
GPIOA->CRL &= ~(0xF << (6 * 4));
GPIOA->CRL |= (0x4 << (6 * 4));
LCD_Init();
LCD_Send(LCD_CMD_CLEAR, LCD_MODE_CMD);
delay_ms(20);
LCD_SetCursor(0, 0);
LCD_Print("Frecuencimetro");
TIM3->PSC = 71;
TIM3->CCMR1 |= TIM_CCMR1_CC1S_0;
TIM3->CCER &= ~TIM_CCER_CC1P;
TIM3->CCER |= TIM_CCER_CC1E;
TIM3->DIER |= TIM_DIER_CC1IE;
nvic_enable_irq(TIM3_IRQn);
TIM3->CR1 |= TIM_CR1_CEN;
TIM2->PSC = 7199;
TIM2->ARR = 9;
TIM2->DIER |= TIM_DIER_UIE;
nvic_enable_irq(TIM2_IRQn);
nvic_enable();
TIM2->CR1 |= TIM_CR1_CEN;
uint32_t freq = 0;
char buffer[17];
while (1) {
if (update_ms >= 100) {
update_ms = 0;
if (period_ticks > 0) {
freq = 1000000 / period_ticks;
} else {
freq = 0;
}
LCD_SetCursor(0, 1);
if (freq >= 1000) {
sprintf(buffer, "F: %lu.%02lu kHz ", freq / 1000, (freq % 1000) / 10);
} else {
sprintf(buffer, "F: %lu Hz ", freq);
}
LCD_Print(buffer);
}
}
}Loading
stm32-bluepill
stm32-bluepill