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


#include "MDR32Fx.h"
#include "MDR32F9Qx_port.h"
#include "MDR32F9Qx_uart.h"
#include "MDR32F9Qx_rst_clk.h"

// Кольцевой буфер для приема (из учебника)
uint8_t Rx_Buff[256];
volatile uint8_t Rx_Wr = 0, Rx_Rd = 0, Rx_Cnt = 0;

// Обработчик прерывания UART1
void UART1_IRQHandler(void) {
    if (UART_GetITStatus(MDR_UART1, UART_IT_RX) != RESET) {
        UART_ClearITPendingBit(MDR_UART1, UART_IT_RX);
        Rx_Buff[Rx_Wr++] = (uint8_t)UART_ReceiveData(MDR_UART1);
        Rx_Cnt++;
    }
}

void Init_System(void) {
    PORT_InitTypeDef PortInit;
    UART_InitTypeDef UART_InitStructure;

    // Включаем тактирование (UART1, PORTA - светодиоды, PORTB - пины UART)
    RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTB | RST_CLK_PCLK_UART1, ENABLE);

    // Настройка PORTA (LED1-LED8)
    PORT_StructInit(&PortInit);
    PortInit.PORT_Pin = PORT_Pin_All;
    PortInit.PORT_OE = PORT_OE_OUT;
    PortInit.PORT_FUNC = PORT_FUNC_PORT;
    PortInit.PORT_MODE = PORT_MODE_DIGITAL;
    PortInit.PORT_SPEED = PORT_SPEED_SLOW;
    PORT_Init(MDR_PORTA, &PortInit);

    // Настройка PORTB (RX - Pin 6, TX - Pin 5)
    PortInit.PORT_Pin = PORT_Pin_5; // TX
    PortInit.PORT_FUNC = PORT_FUNC_ALTER;
    PORT_Init(MDR_PORTB, &PortInit);
    
    PortInit.PORT_Pin = PORT_Pin_6; // RX
    PortInit.PORT_OE = PORT_OE_IN;
    PORT_Init(MDR_PORTB, &PortInit);

    // Настройка UART1: 9600 бод для варианта 9
    UART_BRGInit(MDR_UART1, UART_HCLKdiv1);
    UART_InitStructure.UART_BaudRate = 9600;
    UART_InitStructure.UART_WordLength = UART_WordLength8b;
    UART_InitStructure.UART_StopBits = UART_StopBits1;
    UART_InitStructure.UART_Parity = UART_Parity_No;
    UART_InitStructure.UART_FIFOMode = UART_FIFO_OFF;
    UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE;
    
    UART_Init(MDR_UART1, &UART_InitStructure);
    
    // Включаем прерывания по приему
    UART_ITConfig(MDR_UART1, UART_IT_RX, ENABLE);
    NVIC_EnableIRQ(UART1_IRQn);
    UART_Cmd(MDR_UART1, ENABLE);
}

int main(void) {
    Init_System();
    uint8_t packet[9]; // Пакет для вар. 9: 6 заголовок + 1 данные + 1 маркер + 1 CRC

    while (1) {
        // Ждем, пока в буфере будет 9 байт
        if (Rx_Cnt >= 9) {
            uint16_t sum = 0;
            
            // Забираем пакет и считаем сумму
            for (int i = 0; i < 9; i++) {
                packet[i] = Rx_Buff[Rx_Rd++];
                Rx_Cnt--;
                if (i < 8) sum += packet[i]; // Суммируем всё, кроме CRC
            }

            // 1. Проверка заголовка (AC AD AE 32 44 54)
            if (packet[0] == 0xAC && packet[1] == 0xAD && packet[2] == 0xAE && 
                packet[3] == 0x32 && packet[4] == 0x44 && packet[5] == 0x54) 
            {
                // 2. Проверка управляющего байта (8-й байт равен 0x44)
                if (packet[7] == 0x44) {
                    
                    // 3. Расчет CRC (дополнение до 0x100)
                    uint8_t calc_crc = (uint8_t)(0x100 - (sum & 0xFF));
                    
                    // 4. Если CRC совпал - зажигаем диоды
                    if (packet[8] == calc_crc) {
                        PORT_Write(MDR_PORTA, packet[6]); // Байт Data
                    }
                }
            }
        }
    }
}