#include "stm32f103xb.h"
#include <stdint.h>
#include "stm32f103_hal.h"
// Arreglo de retardos
uint16_t delay_levels[4] = {8332, 6249, 4166, 2083};
// Inicia en el indice 3 (retardo mas corto)
volatile uint8_t current_level = 3;
void delay_us(uint16_t us)
{
for (volatile unsigned int cycles = 0; cycles < us; cycles++);
}
void delay_ms(uint16_t ms)
{
for (volatile uint16_t i = 0; i < ms; i++) {
delay_us(1000);
}
}
int main(void)
{
rcc_clock_enable(RCC_GPIOA);
rcc_clock_enable(RCC_TIM3);
rcc_clock_enable(RCC_EXTI);
gpio_set_output(GPIOA, GPIO_PIN_1, GPIO_OUTPUT_PP, GPIO_SPEED_2MHZ);
gpio_set_input(GPIOA, GPIO_PIN_2, GPIO_INPUT_PU);
gpio_set_input(GPIOA, GPIO_PIN_3, GPIO_INPUT_PU);
timer_init(TIM3, TIMER_MODE_UP, delay_levels[current_level], 8);
timer_set_interrupt(TIM3, TIMER_IRQ_UPDATE, IRQ_ENABLE);
nvic_enable_irq(TIM3_IRQn);
exti_set_interrupt(PA0, EXTI_IRQ_RISING);
nvic_enable_irq(EXTI0_IRQn);
nvic_enable();
uint8_t btn_up_last = 1;
uint8_t btn_down_last = 1;
while (1)
{
uint8_t btn_up_now = gpio_read_pin(GPIOA, GPIO_PIN_2);
uint8_t btn_down_now = gpio_read_pin(GPIOA, GPIO_PIN_3);
if (btn_up_last == 1 && btn_up_now == 0)
{
if (current_level < 3)
{
current_level++;
}
delay_ms(50);
}
if (btn_down_last == 1 && btn_down_now == 0)
{
if (current_level > 0)
{
current_level--;
}
delay_ms(50);
}
btn_up_last = btn_up_now;
btn_down_last = btn_down_now;
}
}
void EXTI0_IRQHandler(void)
{
EXTI->PR = 1;
TIM3->CNT = 0;
TIM3->ARR = delay_levels[current_level];
timer_start(TIM3, TIMER_ONESHOT);
}
void TIM3_IRQHandler(void)
{
TIM3->SR &= ~1;
gpio_bitwise_set(GPIOA, 2);
delay_us(100);
gpio_bitwise_clear(GPIOA, 2);
}Loading
stm32-bluepill
stm32-bluepill
Tarea 3: Santiago Orozco F.