[DemoCode下载] M051系列的Blink程序

[复制链接]
154|3
稳稳の幸福 发表于 2025-10-16 09:59 | 显示全部楼层 |阅读模式
这里我提供一个基于 新唐标准库(Standard Peripheral Library, SPL) 的版本,这是最常用和易于理解的方式。
我们将以最经典的 NuTiny-EVB-M051 开发板为例,假设LED连接在 P3.6 引脚。如果你的硬件连接不同,请修改对应的引脚定义。

准备工作

硬件:

M051 系列开发板(如 NuTiny-EVB-M051)。

USB 数据线。

J-Link 或 Nu-Link 调试器(通常开发板已集成)。

软件:

Keil MDK-ARM 或 IAR Embedded Workbench。

新唐 M051 系列的设备支持包。

新唐 M051 系列标准外设库。



 楼主| 稳稳の幸福 发表于 2025-10-16 09:59 | 显示全部楼层
  1. /**
  2. * [url=/u/brief]@brief[/url]  简单的LED闪烁程序 for Nuvoton M051 Series
  3. * [url=/u/硬件]@硬件[/url]    NuTiny-EVB-M051 (LED连接到 P3.6)
  4. * @说明    使用标准库和查询方式延时
  5. */

  6. #include "M051Series.h"  // 包含M051系列的所有寄存器定义和标准库函数

  7. // 函数声明
  8. void SYS_Init(void);
  9. void GPIO_Init(void);
  10. void Delay(uint32_t iter);

  11. int main(void)
  12. {
  13.     /* 初始化系统时钟、GPIO等 */
  14.     SYS_Init();
  15.     /* 初始化GPIO,配置LED引脚 */
  16.     GPIO_Init();

  17.     while(1)
  18.     {
  19.         // 点亮LED (根据硬件连接,可能是低电平点亮)
  20.         P36 = 0;

  21.         // 延时
  22.         Delay(500000);

  23.         // 熄灭LED
  24.         P36 = 1;

  25.         // 延时
  26.         Delay(500000);
  27.     }
  28. }

  29. /**
  30. * @brief  系统初始化
  31. *         配置系统时钟,使能外设时钟
  32. */
  33. void SYS_Init(void)
  34. {
  35.     /*---------------------------------------------------------------------------------------------------------*/
  36.     /* Init System Clock                                                                                       */
  37.     /*---------------------------------------------------------------------------------------------------------*/
  38.     /* 使能外部12MHz晶振 */
  39.     SYS->PWRCON |= SYS_PWRCON_XTL12M_EN_Msk;

  40.     /* 等待时钟稳定 */
  41.     while(!(SYS->CLKSTATUS & SYS_CLKSTATUS_CLK_STABLE_Msk));

  42.     /* 选择HCLK时钟源为外部晶振,HCLK不分频 (HCLK = 12MHz) */
  43.     SYS->CLKSEL0 = SYS_CLKSEL0_HCLK_S_XTAL;
  44.     SYS->CLKDIV = SYS_CLKDIV_HCLK_N(1);

  45.     /* 使能GPIO模块的时钟 */
  46.     SYS->AHBCLK |= SYS_AHBCLK_GPIO_CKEN_Msk;
  47. }

  48. /**
  49. * @brief  GPIO初始化
  50. *         将P3.6配置为推挽输出模式,控制LED
  51. */
  52. void GPIO_Init(void)
  53. {
  54.     /* 将P3.6设置为GPIO模式(如果不是的话) */
  55.     SYS->P3_MFP &= ~SYS_MFP_P36_Msk;
  56.     SYS->P3_MFP |= SYS_MFP_P36_GPIO;

  57.     /* 设置P3.6为输出模式 */
  58.     GPIO_SetMode(P3, BIT6, GPIO_PMD_OUTPUT);

  59.     /* 初始状态:熄灭LED (输出高电平) */
  60.     P36 = 1;
  61. }

  62. /**
  63. * @brief  简单的软件延时函数
  64. * @param  iter: 延时循环次数
  65. * [url=/u/NOTE]@NOTE[/url]   这不是精确的延时,用于简单的演示。实际项目中建议使用定时器。
  66. */
  67. void Delay(uint32_t iter)
  68. {
  69.     volatile uint32_t i;
  70.     for(i = 0; i < iter; i++)
  71.     {
  72.         __NOP(); // 插入空操作,防止循环被编译器优化掉
  73.     }
  74. }

 楼主| 稳稳の幸福 发表于 2025-10-16 10:00 | 显示全部楼层
如何根据你的硬件修改
如果LED连接在其他引脚:
例如,如果你的LED在 P1.0,你需要将代码中所有的 P3 和 BIT6 替换为 P1 和 BIT0。同时修改多功能引脚配置和输出控制:
  1. // 在 GPIO_Init 函数中
  2. SYS->P1_MFP &= ~SYS_MFP_P10_Msk;
  3. SYS->P1_MFP |= SYS_MFP_P10_GPIO;
  4. GPIO_SetMode(P1, BIT0, GPIO_PMD_OUTPUT);
  5. P10 = 1; // 初始化为高电平
  6. // 在 main 循环中
  7. P10 = 0; // 亮
  8. P10 = 1; // 灭
如果LED是低电平点亮(常见):

P3.6 = 0; 用于点亮。

P3.6 = 1; 用于熄灭。

如果LED是高电平点亮:

只需将 P3.6 = 0; 和 P3.6 = 1; 的操作反过来即可。

 楼主| 稳稳の幸福 发表于 2025-10-16 10:00 | 显示全部楼层
编译和下载
在 Keil 或 IAR 中创建一个新工程,选择你具体的 M051 型号(如 M0518LAN)。

将上述代码添加到主文件(如 main.c)。

在工程设置中,确保链接了新唐的标准库文件。

编译工程。

连接你的 Nu-Link 调试器,将程序下载到单片机中。

复位或重新上电后,你应该就能看到LED开始闪烁了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

207

主题

3457

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部