#include "MDR32Fx.h"
#include "MDR32F9Qx_port.h"
#include "MDR32F9Qx_uart.h"
#include "MDR32F9Qx_rst_clk.h"
// Глобальные переменные для буфера (из учебника)
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) != RESET) {
UART_ClearITPendingBit(MDR_UART1, UART_IT_RX);
Recieve_buff[Recieve_Wr++] = UART_ReceiveData(MDR_UART1);
Recieve_Cnt++;
}
}
void Init_All(void) {
PORT_InitTypeDef PortInit;
UART_InitTypeDef UART_InitStructure;
// 1. Тактирование
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);
// 3. UART1 Pins (PORTB: Pin 5 - TX, Pin 6 - RX)
PortInit.PORT_Pin = PORT_Pin_5;
PortInit.PORT_FUNC = PORT_FUNC_ALTER;
PORT_Init(MDR_PORTB, &PortInit);
PortInit.PORT_Pin = PORT_Pin_6;
PortInit.PORT_OE = PORT_OE_IN;
PORT_Init(MDR_PORTB, &PortInit);
// 4. Настройка 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_All();
uint8_t packet[9]; // Размер пакета для варианта №9
while (1) {
// Ждем, пока в буфере накопится хотя бы 9 байт
if (Recieve_Cnt >= 9) {
uint16_t sum = 0;
// Читаем пакет из кольцевого буфера
for(int i=0; i<9; i++) {
packet[i] = Recieve_buff[Recieve_Rd++];
Recieve_Cnt--;
if (i < 8) sum += packet[i]; // Считаем сумму всех байт кроме CRC
}
// Проверка заголовка (0xAC 0xAD 0xAE 0x32 0x44 0x54 ... 0x44)
if (packet[0] == 0xAC && packet[1] == 0xAD && packet[2] == 0xAE &&
packet[3] == 0x32 && packet[4] == 0x44 && packet[5] == 0x54 &&
packet[7] == 0x44)
{
// Проверка CRC (Дополнение до 0x100)
uint8_t calculated_crc = (uint8_t)(0x100 - (sum & 0xFF));
if (packet[8] == calculated_crc) {
PORT_Write(MDR_PORTA, packet[6]); // Вывод Data на светодиоды
}
}
}
}
}