/**
******************************************************************************
* @file : main.c
* @author : Fernando Hermosillo Reynoso
* @brief : Main program body
******************************************************************************
*
* 2. Realice un programa para un cronómetro digital.
* a. El sistema cuenta con un botón que al
* presionarlo se iniciará el cronometro y
* si se vuelve a presionar el botón se detendrá.
* b. La base de tiempo del cronómetro será de 1ms y
* debe ser implementado por medio de un timer e
* interrupción.
* c. El valor del tiempo del cronometro se mostrará en
* una LCD16x2 y se actualizará cada 10ms con el
* formato mm:ss:millis
* d. El cronómetro se reinicia cada vez que se inicia
* la cuenta.
*
* La LCD esta conectada a
* D0-D7: PA1 - PA8
* RS: PA9
* RW: PA10
* E: PA11
*/
#include <stdint.h>
#include <stdio.h>
#include "stm32f103_hal.h"
#include "lcd.h"
//init variables
volatile uint32_t ms_contador = 0;
volatile uint8_t corriendo = 0;
uint8_t boton_bloqueo = 0;
uint32_t ultima_actualizacion = 0;
char buffer_lcd[16];
//parte de tamplet proporcionado [
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++);
}
}
void delay_us(uint16_t us)
{
for (volatile unsigned int cycles = 0; cycles < us; cycles++);
}
// ] fin de parte de template proporcionado
int main(void)
{
rcc_clock_enable(RCC_GPIOA);//enable de los clocks de a, b, tim3
rcc_clock_enable(RCC_GPIOB);
rcc_clock_enable(RCC_TIM3);
LCD_Init(); //init de lcd
gpio_set_input(GPIOB, GPIO_PIN_0, GPIO_INPUT_PD); //input boton
gpio_set_output(GPIOB, GPIO_PIN_1, GPIO_OUTPUT_PP, GPIO_SPEED_2MHZ); //output osciloscopio
timer_init(TIM3, TIMER_MODE_UP, 999, 7); //config timer 3
timer_set_interrupt(TIM3, TIMER_IRQ_UPDATE, IRQ_ENABLE);
NVIC_EnableIRQ(TIM3_IRQn);
timer_start(TIM3, TIMER_CONTINUOUS);
LCD_SetCursor(0, 0);
LCD_Print("Cronometro:"); // lcd inicio antes de que le piques al boton
//porque si inicia ya corriendo estaria raro
while (1)
{
if (gpio_read_pin(GPIOB, GPIO_PIN_0))
{
delay_ms(20);
if (gpio_read_pin(GPIOB, GPIO_PIN_0) && !boton_bloqueo)
{
corriendo = !corriendo;
if (corriendo)
{
ms_contador = 0; //logica de stop "corriendo" upon press del botón
}
boton_bloqueo = 1;
}
}
else
{
boton_bloqueo = 0;
}
if ((ms_contador - ultima_actualizacion) >= 10)
{
ultima_actualizacion = ms_contador;
uint32_t t_actual = ms_contador;
uint16_t min = t_actual / 60000; //esto es como lo que vimos en la de sistemas digitales
uint8_t seg = (t_actual % 60000) / 1000; //para sacar el tiempo más fácil/simple
uint16_t millis = t_actual % 1000;
sprintf(buffer_lcd, "%02d:%02d:%03d", min, seg, millis);
LCD_SetCursor(0, 1); // Columna 0, Fila 1 (segunda línea)
LCD_Print(buffer_lcd);
}
}
}
void TIM3_IRQHandler(void)
{
TIM3->SR &= ~TIM_SR_UIF;
// b1 para el osciloscopio
GPIOB->ODR ^= (1 << 1);
if (corriendo)
{
ms_contador++;
}
}Loading
stm32-bluepill
stm32-bluepill