135 lines
4.7 KiB
C
135 lines
4.7 KiB
C
/******************************************************************************
|
||
* @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);
|
||
}
|
||
}
|