/****************************************************************************** * @file main.c * @brief N32G003F5S7-STB 开发板 闪灯 + 调试串口打印示例 * * 硬件连接(原理图 N32G003F5S7-STB_V1.0.sch,目标 MCU 为 U1): * - 用户灯 D1:PA6(U1.16) -> 跳线 J16 -> D1 -> R1 -> GND, * PA6 输出高电平点亮(需短接 J16 跳线帽)。 * 可选:D2 接 PA7(跳线 J17)、D3 接 PA10(跳线 J18)。 * - 调试串口(DEBUG USB):UART1 TX = PA2(U1.6)、RX = PA3(U1.10), * 经 J5 跳线(7-8、9-10 短接)连到板载 Nu-Link 虚拟串口。 * 参数:115200,8 数据位,无校验,1 停止位,无流控。 * - 注意:N32G003 没有 DMA 外设,串口发送只能用查询/中断方式, * 本程序采用查询方式发送。 * 另外 PA8/PA9 与 SWDIO/SWCLK 双键合在同一封装引脚, * 禁止用作普通 GPIO,否则 SWD 调试会断开。 * * 功能:主循环翻转 D1 闪烁,同时通过 printf 向调试串口打印 * 循环计数(约每 0.8s 一行)。 * * 说明:系统时钟初始化 SystemInit() 由启动文件在进入 main 之前 * 自动调用;printf 重定向依赖工程勾选 MicroLIB。 *****************************************************************************/ #include "n32g003.h" #include /* 用户灯 D1 连接的引脚(详见板卡原理图),注意不要用 PA8/PA9(与 SWD 冲突) */ #define LED_PORT GPIOA #define LED_PIN GPIO_PIN_6 #define LED_CLK RCC_APB_PERIPH_IOPA /* 调试串口:UART1,TX = PA2,RX = PA3(AF5,见用户手册表 5-7) */ #define UARTx UART1 #define UARTx_CLK RCC_APB_PERIPH_UART1 #define UARTx_GPIO GPIOA #define UARTx_TX_PIN GPIO_PIN_2 #define UARTx_RX_PIN GPIO_PIN_3 #define UARTx_GPIO_AF GPIO_AF5_UART1 #define UARTx_BAUDRATE 115200u /* 循环计数器:调试时可在 Watch 窗口观察,确认程序正常运行 */ static volatile uint32_t g_loop_count = 0; /** * @brief 简单的软件延时(空指令循环) * @param n 循环次数(默认 48MHz 主频下约 5000000 ≈ 0.4s,可按需调整) */ static void delay_loop(volatile uint32_t n) { while (n--) { __NOP(); } } /** * @brief LED 引脚初始化:开时钟 + 推挽输出 */ static void led_init(void) { GPIO_InitType gpio_init; RCC_APB_Peripheral_Clock_Enable(LED_CLK); GPIO_Structure_Initialize(&gpio_init); gpio_init.Pin = LED_PIN; gpio_init.GPIO_Mode = GPIO_MODE_OUT_PP; /* 推挽输出 */ gpio_init.GPIO_Pull = GPIO_NO_PULL; gpio_init.GPIO_Slew_Rate = GPIO_SLEW_RATE_FAST; gpio_init.GPIO_Alternate = GPIO_NO_AF; GPIO_Peripheral_Initialize(LED_PORT, &gpio_init); } /** * @brief 调试串口初始化:UART1,PA2(TX)/PA3(RX) 复用 AF5 * 115200,8 数据位,无校验,1 停止位,无流控 */ static void uart_init(void) { GPIO_InitType gpio_init; UART_InitType uart_init; /* 开 GPIOA 和 UART1 时钟 */ RCC_APB_Peripheral_Clock_Enable(RCC_APB_PERIPH_IOPA | UARTx_CLK); /* TX:复用推挽输出 */ GPIO_Structure_Initialize(&gpio_init); gpio_init.Pin = UARTx_TX_PIN; gpio_init.GPIO_Mode = GPIO_MODE_AF_PP; gpio_init.GPIO_Alternate = UARTx_GPIO_AF; GPIO_Peripheral_Initialize(UARTx_GPIO, &gpio_init); /* RX:复用输入 */ gpio_init.Pin = UARTx_RX_PIN; gpio_init.GPIO_Mode = GPIO_MODE_INPUT; gpio_init.GPIO_Alternate = UARTx_GPIO_AF; GPIO_Peripheral_Initialize(UARTx_GPIO, &gpio_init); uart_init.BaudRate = UARTx_BAUDRATE; uart_init.WordLength = UART_WL_8B; uart_init.StopBits = UART_STPB_1; uart_init.Parity = UART_PE_NO; uart_init.Mode = UART_MODE_RX | UART_MODE_TX; UART_Initializes(UARTx, &uart_init); UART_Enable(UARTx); } /** * @brief 重定向 printf 到调试串口(查询方式发送,需勾选 MicroLIB) */ int fputc(int ch, FILE *f) { (void)f; UART_Data_Send(UARTx, (uint8_t)ch); while (UART_Flag_Status_Get(UARTx, UART_FLAG_TXDE) == RESET) { } return ch; } /** * @brief 主函数 */ int main(void) { led_init(); uart_init(); printf("\r\nN32G003F5S7-STB: LED blink + UART printf demo\r\n"); while (1) { GPIO_Pin_Toggle(LED_PORT, LED_PIN); /* 翻转 LED */ g_loop_count++; /* 观察点:递增说明 CPU 正在运行 */ printf("loop count = %u\r\n", (unsigned int)g_loop_count); delay_loop(5000000u); } }