Загрузка данных


#include "stm32f1xx.h"

void delay_ms(volatile uint32_t ms) {
    for (volatile uint32_t i = 0; i < ms * 2000; i++);
}

// 1. Базовое мигание одним светодиодом (PA0)
void task_blink_single(void) {
    GPIOA->CRL &= ~(0xF << 0);
    GPIOA->CRL |=  (0x2 << 0); // Push-pull, 2 MHz
    
    while (1) {
        GPIOA->BSRR = (1U << 0);        // Включить PA0
        delay_ms(500);
        GPIOA->BSRR = (1U << (0 + 16)); // Выключить PA0
        delay_ms(500);
    }
}

// 2. Бегущий огонь слева направо (PA0 -> PA7)
void task_running_forward(void) {
    GPIOA->CRL = 0x22222222UL; // PA0-PA7 на выход 2 МГц
    uint8_t pattern = 0x01;
    
    while (1) {
        GPIOA->ODR = (GPIOA->ODR & 0xFF00) | pattern;
        delay_ms(150);
        pattern <<= 1;
        if (pattern == 0) pattern = 0x01;
    }
}

// 3. Задание для СРС: Бегущий огонь в обратную сторону (PA7 -> PA0)
void task_running_backward(void) {
    GPIOA->CRL = 0x22222222UL;
    uint8_t pattern = 0x80;
    
    while (1) {
        GPIOA->ODR = (GPIOA->ODR & 0xFF00) | pattern;
        delay_ms(150);
        pattern >>= 1;
        if (pattern == 0) pattern = 0x80;
    }
}

// 4. Задание для СРС: От центра к краям и обратно
void task_running_center_edges(void) {
    GPIOA->CRL = 0x22222222UL;
    const uint8_t patterns[] = { 0x18, 0x24, 0x42, 0x81, 0x42, 0x24 };
    const uint8_t size = sizeof(patterns) / sizeof(patterns[0]);
    
    while (1) {
        for (int i = 0; i < size; i++) {
            GPIOA->ODR = (GPIOA->ODR & 0xFF00) | patterns[i];
            delay_ms(200);
        }
    }
}

int main(void) {
    // Включение тактирования GPIOA
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

    // Выбираем режим (для первой проверки пусть будет мигание PA0):
    task_blink_single();
    // task_running_forward();
    // task_running_backward();
    // task_running_center_edges();

    return 0;
}