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


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

static PORT_InitTypeDef PortInit;
static UART_InitTypeDef UART_InitStructure;

// Буфер для приема данных
uint8_t Recieve_buff[256];
volatile uint8_t Recieve_Wr = 0, Recieve_Rd = 0, Recieve_Cnt = 0;

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

void init_leds(void) {
    RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA, ENABLE);
    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);
    PORT_Write(MDR_PORTA, 0xFF); // Выключаем все светодиоды при старте
}

void init_UART(void) {
    RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTB | RST_CLK_PCLK_UART1, ENABLE);
    
    // Настройка PORTB для UART (PB5 - TX, PB6 - RX)
    PortInit.PORT_Pin   = PORT_Pin_5 | PORT_Pin_6;
    PortInit.PORT_FUNC  = PORT_FUNC_ALTER; 
    PortInit.PORT_MODE  = PORT_MODE_DIGITAL;
    PORT_Init(MDR_PORTB, &PortInit);
    
    // Настройка UART (Скорость 9600 для Варианта 9)
    UART_StructInit(&UART_InitStructure);
    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_BRGInit(MDR_UART1, UART_HCLKdiv1);
    
    NVIC_EnableIRQ(UART1_IRQn);
    UART_ITConfig(MDR_UART1, UART_IT_RX, ENABLE);
    UART_Cmd(MDR_UART1, ENABLE);
}

uint8_t GetByte(void) {
    uint8_t byte = Recieve_buff[Recieve_Rd++];
    Recieve_Cnt--;
    return byte;
}

int main (void) {
    init_leds();
    init_UART();

    while (1) {
        // Для 9 варианта пакет состоит из 9 байт: 
        // AC AD AE 32 44 54 [Data] 44 [CRC]
        if (Recieve_Cnt >= 9) {
            
            // Проверяем первый байт заголовка
            if (Recieve_buff[Recieve_Rd] == 0xAC) {
                uint8_t b1 = GetByte(); // 0xAC
                uint8_t b2 = GetByte(); // 0xAD
                uint8_t b3 = GetByte(); // 0xAE
                uint8_t b4 = GetByte(); // 0x32
                uint8_t b5 = GetByte(); // 0x44
                uint8_t b6 = GetByte(); // 0x54
                
                // Проверяем остальной заголовок
                if (b2 == 0xAD && b3 == 0xAE && b4 == 0x32 && b5 == 0x44 && b6 == 0x54) {
                    uint8_t data = GetByte();    // 7-й байт: Данные
                    uint8_t footer = GetByte();  // 8-й байт: 0x44
                    uint8_t received_crc = GetByte(); // 9-й байт: CRC
                    
                    if (footer == 0x44) {
                        // Расчет CRC по твоей формуле (Дополнение до 0x100)
                        uint32_t sum = b1 + b2 + b3 + b4 + b5 + b6 + data + footer;
                        uint8_t my_crc = (uint8_t)(0x100 - (sum & 0xFF));
                        
                        if (my_crc == received_crc) {
                            // Если логика на плате инверсная (0-горит), используй ~data
                            // Если прямая (1-горит), убери тильду: PORT_Write(MDR_PORTA, data);
                            PORT_Write(MDR_PORTA, ~data); 
                        }
                    }
                }
            } else {
                // Если первый байт не AC, просто сдвигаем очередь
                GetByte();
            }
        }
    }
}