#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);
}
}
}
}
}
}
}
}