#include "MDR32Fx.h"
#include "MDR32F9Qx_port.h"
#include "MDR32F9Qx_rst_clk.h"
volatile uint32_t ms_tick = 0;
void SysTick_Handler(void) { ms_tick++; }
void delay_ms(uint32_t ms) {
uint32_t start = ms_tick;
while ((ms_tick - start) < ms);
}
void init_systick(void) {
SysTick->LOAD = (8000000 / 1000) - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
}
void init_uart_tx(void) {
// Тактирование порта B и UART1
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTB | RST_CLK_PCLK_UART1, ENABLE);
// Настройка PB5 (TX) как альтернативной функции
PORT_InitTypeDef PortInit;
PORT_StructInit(&PortInit);
PortInit.PORT_Pin = PORT_Pin_5;
PortInit.PORT_OE = PORT_OE_OUT;
PortInit.PORT_FUNC = PORT_FUNC_ALTER;
PortInit.PORT_MODE = PORT_MODE_DIGITAL;
PortInit.PORT_SPEED = PORT_SPEED_FAST;
PORT_Init(MDR_PORTB, &PortInit);
// Настройка скорости UART (57600 при 8 МГц)
MDR_UART1->IBRD = 8;
MDR_UART1->FBRD = 44;
// Формат кадра: 8 бит, 1 стоп, без паритета, FIFO выкл
MDR_UART1->LCR_H = (3 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (0 << 1) | (0 << 0);
// Включить передатчик и UART
MDR_UART1->CR = (1 << 8) | (1 << 0); // TXE + UARTEN
}
int main(void) {
// Явно включаем HSI (8 МГц)
MDR_BKP->REG_0F |= (1 << 22);
while (!(MDR_BKP->REG_0F & (1 << 23)));
MDR_RST_CLK->CPU_CLOCK = (0 << 8) | (0 << 2); // HCLK = HSI
init_systick();
init_uart_tx();
while (1) {
// Ждём, пока передатчик не освободится (TXFF = 0)
while (MDR_UART1->FR & (1 << 5));
// Отправляем байт 0x55
MDR_UART1->DR = 0x55;
delay_ms(1000);
}
}