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


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

static PORT_InitTypeDef PortInit;
static UART_InitTypeDef UART_InitStructure;

// Функция приема одного байта
uint8_t UART_ReceiveByte(void) {
    while (UART_GetFlagStatus(MDR_UART1, UART_FLAG_RXFE) == SET); // Ждем, пока придет байт
    return UART_ReceiveData(MDR_UART1);
}

int main(void) {
    // 1. Тактирование PORTA, PORTB и UART1
    RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTB | RST_CLK_PCLK_UART1, ENABLE);
    
    // 2. Настройка PORTA на выход (зеленые светодиоды)
    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); // Гасим всё (инверсия)

    // 3. Настройка PORTB (PB5 - TX, PB6 - RX) для UART
    PortInit.PORT_Pin = PORT_Pin_5 | PORT_Pin_6;
    PortInit.PORT_OE = PORT_OE_IN; // Для альтернативных функций неважно, но пусть так
    PortInit.PORT_FUNC = PORT_FUNC_ALTER; // Включаем альтернативный режим
    PortInit.PORT_MODE = PORT_MODE_DIGITAL;
    PORT_Init(MDR_PORTB, &PortInit);

    // 4. Конфигурация UART1
    UART_StructInit(&UART_InitStructure);
    UART_InitStructure.UART_BaudRate = 28800; // Твоя скорость
    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_ON;
    UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE;

    UART_Init(MDR_UART1, &UART_InitStructure);
    UART_BRGInit(MDR_UART1, UART_HCLKdiv1); // Делитель частоты
    UART_Cmd(MDR_UART1, ENABLE);

    while (1) {
        // Логика приема пакета: 0x0A 0x11 0x0A 0x15 Data 0x85 CRC
        if (UART_ReceiveByte() == 0x0A) {
            if (UART_ReceiveByte() == 0x11) {
                if (UART_ReceiveByte() == 0x0A) {
                    if (UART_ReceiveByte() == 0x15) {
                        
                        uint8_t data = UART_ReceiveByte(); // Байт данных
                        if (UART_ReceiveByte() == 0x85) { // Байт конца
                            
                            uint8_t received_crc = UART_ReceiveByte(); // Контрольная сумма
                            
                            // Считаем свою CRC
                            // Сумма всех байтов: 0x0A + 0x11 + 0x0A + 0x15 + data + 0x85
                            uint32_t sum = 0x0A + 0x11 + 0x0A + 0x15 + data + 0x85;
                            uint8_t my_crc = (uint8_t)(0x100 - (sum & 0xFF));

                            // Сверяем
                            if (my_crc == received_crc) {
                                PORT_Write(MDR_PORTA, ~data); // Ок - выводим данные на LED
                            } else {
                                // Ошибка CRC - можно, например, на мгновение зажечь всё
                                PORT_Write(MDR_PORTA, 0x00); 
                            }
                        }
                    }
                }
            }
        }
    }
}