2026-08-31 21:07:17 +08:00

135 lines
4.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
* @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 <stdio.h>
/* 用户灯 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);
}
}