开发环境搭建
小华提供了 HC32L021 主控的 IDE 支持包、驱动库以及样例,可以在 https://www.xhsc.com.cn/product/1263.html 获取相关资源
这里使用 MDK 作为开发环境,需要下载的有:SK_HC32L021_TSSOP20_Rev1.1.zip、HC32L021_IDE_Rev1.1.0.zip、HC32L021_DDL_Rev1.1.0.zip 这三个压缩文件
SK_HC32L021_TSSOP20_Rev1.1.zip 中包含本开发板的设计文件
使用 HC32L021_IDE_Rev1.1.0.zip 中的 IDE_PACK\MDK_IDE\HDSC.HC32L02x.1.1.0.pack 可以将 HC32L021 的包安装到 Keil:

我们可以参考 HC32L021_DDL_Rev1.1.0.zip 中的例程,使用其中的模板进行开发
使用模板新建项目
解压 HC32L021_DDL_Rev1.1.0.zip,找到其中 example 目录下的 template,复制一份即可

模板中 EWARM 为 IAR 工程,MDK 为 Keil MDK 工程,source 为源代码

进入 MDK 目录,双击 Keil 工程文件即可打开

打开 Keil 工程后,双击 main.c 打开主程序文件,在其中编写代码

使用外部中断控制 LED 灯
查阅 SK_HC32L021_TSSOP20_Rev1.1.zip 中提供的开发板原理图:
- LED D3 被连接到了 PA00,高电平点亮
- 按钮 K1 被连接到了 PA12,按下后接地

例程中提供了封装好的 GPIO 库 —— gpio.c,gpio.h 中 include 了 ddl.h,所以我们在 main.c 中将 ddl.h 替换为 gpio.h 即可
/*******************************************************************************
* Include files
******************************************************************************/
#include "gpio.h"接下来需要初始化 PA00 和 PA12 这两个管脚:
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
static void GpioConfig(void);
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
* @brief GPIO配置
* @retval None
*/
static void GpioConfig(void)
{
stc_gpio_init_t stcGpioInit;
SYSCTRL_PeriphClockEnable(PeriphClockGpio);
/* LED */
GPIO_StcInit(&stcGpioInit);
stcGpioInit.bOutputValue = TRUE; // 默认输出高电平
stcGpioInit.u32Mode = GPIO_MD_OUTPUT_PP; // 推挽输出
stcGpioInit.u32Pin = GPIO_PIN_00; // 00口
stcGpioInit.u32PullUp = GPIO_PULL_NONE; // 不上拉
GPIOA_Init(&stcGpioInit);
/* KEY */
stcGpioInit.u32ExternInt = GPIO_EXTI_FALLING; // 下降沿触发
stcGpioInit.u32Mode = GPIO_MD_INT_INPUT; // 中断输入
stcGpioInit.u32Pin = GPIO_PIN_12; // 12口
GPIOA_Init(&stcGpioInit);
/* Enable IRQ */
EnableNvic(PORTA_IRQn, IrqPriorityLevel0, TRUE);
}要想实现对 LED 亮灭的控制,我们可以使用一个变量 flag 标记小灯状态,当触发外部中断时翻转这个变量,TRUE 表示小灯亮,FALSE 表示小灯灭
添加一个布尔变量:
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
static boolean_t flag = FALSE;PortA 的中断服务函数:
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
* @brief PortA中断服务函数
* @retval None
*/
void PortA_IRQHandler(void)
{
if (TRUE == GPIO_IntFlagGet(GPIOA, GPIO_PIN_12))
{
flag = !flag;
GPIO_IntFlagClear(GPIOA, GPIO_PIN_12);
}
}在主函数 main() 中对 flag 进行判断,设置 PA00 的输出电平:
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
* @brief Main function
* @retval int32_t return value, if needed
*/
int32_t main(void)
{
GpioConfig();
while (1)
{
if (flag)
GPIO_PA00_SET();
else
GPIO_PA00_RESET();
DDL_Delay1ms(100);
}
}程序编写完成后可以使用右上角的按钮进行构建,构建输出 0 Error(s), 0 Warning(s) 表示构建成功:

使用板载调试器调试/烧录程序
开发板板载了 CMSIS-DAP 调试器,直接使用 USB-A/C 转 USB-C 连接线连接到电脑就可调试/烧录程序
调试程序
在 Keil 对程序进行调试可以点击工具栏中的 Debug 按钮(或使用快捷键 Ctrl+F5)

例如要监看 flag 变量的变化,右键 flag,在 Add 'flag' to... 中选择 Watch 1,在终端服务函数中设置一个断点,按 F5 开始执行程序
当按下按键 K1 时,触发外部中断,程序执行到中断服务函数中的断点后会暂停,此时 flag 的值为默认的 0x00(即 0 或 FALSE)

按下 F5 继续执行程序,可以看到 flag 的值变为了 0x01(即 1 或 TRUE),此时 LED 灯点亮

要退出调试模式,再次按 Ctrl+F5 即可(注意:退出调试界面时建议清除所有断点,部分 Keil 版本在退出调试界面时存在断点可能导致软件卡死崩溃)
烧录程序
要烧录程序到开发板,只需要点击 Download 按钮即可,构建日志输出 Flash Load finished 即成功:

注意:烧录完成后需要重新上电/按下复位按钮才可开始执行程序
程序运行展示


开源社区
