一、介绍
这篇文章主要介绍HC32L021-Mini开发板的资源分布,并使用这块开发板生成个16KHz的PWM,因为我现在的实际项目大部分都是控制电机,频率都是16KHz的,这个是在iCEasy商城免费申请的。
二、整体资源分布
● 48MHz Cortex-M0+ 32位CPU平台
● HC32L021系列具有灵活的功耗管理系统:
– 0.65μA@3V深度休眠模式:所有时钟关闭,上电复位有效,IO状态保持,IO中断有效,所有寄存器、RAM和CPU数据保存状态时的功耗
– 45μA/MHz@3V@48MHz工作模式:CPU运行,外设关闭,从FLASH运行程序
● 64K字节FLASH存储器,具有擦写保护功能,支持ISP、ICP、IAP,4级安全保护
● 6K字节RAM存储器
● 通用I/O管脚
(17IO/20pin, 10IO/14pin)
– 部分IO支持滤波
● 时钟、晶振
– 内部高速时钟RC48M:4/6/32/48MHz
– 内部低速时钟RCL:32.768/38.4kHz
– 外部低速晶振XTL:32.768kHz
– 支持外部时钟源输入
● 定时器/计数器
– 2个复合定时器CTIM,每个CTIM可配置为1个16位通用定时器GTIM或3个16位基本定时器BTIM:作为通用定时器时支持4通道捕获比较,4通道PWM输出;作为基本定时器时,每个定时器支持两路翻转输出
– 1个高级16位定时器ATIM3,支持3相带死区互补的PWM输出
– 1个独立看门狗电路,内部低速时钟提供IWDT计数
– 1个时钟校准模块CTRIM,支持超低功耗定时功能,支持最大65536s超长定时和自动唤醒,支持内部时钟实时校准功能
– 1个RTC实时日历时钟计数器,支持最高0.06ppm补偿精度
– 1个CM0+内置24位SysTick定时器
● 通讯接口
– 2路LPUART通讯接口
– 1路SPI标准通讯接口
– 1路I2C高速通讯接口
● 1路TRNG:64bit随机数发生器
● 全球唯一10字节ID号
● 集成1个12位1Msps采样的高速高精度SAR ADC
● 2路电压比较器VC,可配置64阶比较电压,可配置12档滤波
● 集成1路低电压侦测器LVD,可配置16阶比较电平,可配置12档滤波,可监控端口电压以及电源电压
● SWD调试解决方案,提供全功能调试器
● 工作条件:-40~105℃,1.8~5.5V
● 封装形式:QFN20,TSSOP20,QFN14
我使用的是TSSOP20封装的

这个芯片的资源可以在小华半导体的官网上找到,有数据手册,参考手册原理图

三、工程测试
我使用的是Keil开发,所以在写程序之前需要安装芯片支持包,同样还是在小华官网下载

安装好后打开例程

选择example,找到gpio例程,打开gpio_output例程

打开之后编译一下,例程给的led闪烁程序是PA0端口的,我们的开发板led接在PA6上面,所以需要把初始化引脚和设置高低电平引脚改一下
/**
* @brief Main function
* @retval int32_t return value, if needed
*/
int32_t main(void)
{
GpioConfig(); /* LED端口初始化 */
while (1)
{
GPIO_PA06_SET();
DDL_Delay1ms(500);
GPIO_PA06_RESET();
DDL_Delay1ms(500);
}
}
/**
* @brief GPIO配置
* @retval None
*/
static void GpioConfig(void)
{
stc_gpio_init_t stcGpioInit = {0};
SYSCTRL_PeriphClockEnable(PeriphClockGpio); /*开启GPIO时钟*/
/* LED端口初始化 */
GPIO_StcInit(&stcGpioInit); /* 结构体变量初始值初始化 */
stcGpioInit.bOutputValue = TRUE; /* 设置GPIO输出初始值为高 */
stcGpioInit.u32Mode = GPIO_MD_OUTPUT_PP; /* 端口方向配置 */
stcGpioInit.u32PullUp = GPIO_PULL_NONE; /* 端口上拉配置 */
stcGpioInit.u32Pin = GPIO_PIN_06; /* 端口引脚配置 */
GPIOA_Init(&stcGpioInit); /* GPIO端口初始化 */
}然后再编译,把烧录器接好,点击烧录,就能看到led开始闪烁
四、生成PWM
我们使用PA2,是复用在TIM0的通道0上面,可以查看参考手册7.3.4 端口数字复用功能

我们使用的内部低速时钟4M的频率,按如下配置就能生成16K的PWM
/**
* @brief 端口配置初始化
* @retval None
*/
static void GpioConfig(void)
{
stc_gpio_init_t stcGpioInit = {0};
SYSCTRL_PeriphClockEnable(PeriphClockGpio); /* 开启GPIO时钟 */
/* CTIM0_CH0(PA02)端口初始化 */
GPIO_StcInit(&stcGpioInit); /* 结构体变量初始值初始化 */
stcGpioInit.u32Mode = GPIO_MD_OUTPUT_PP; /* 端口方向配置 */
stcGpioInit.u32PullUp = GPIO_PULL_NONE; /* 端口上拉配置 */
stcGpioInit.u32Pin = GPIO_PIN_02; /* 端口引脚配置 */
GPIOA_Init(&stcGpioInit); /* GPIO初始化 */
GPIO_PA02_AF_CTIM0_CH0(); /* CTIM0_CH0(PA02)端口复用功能 */
}
/**
* @brief 初始化GTIMER
* @retval None
*/
static void Gtim0Config(void)
{
stc_gtim_init_t stcGtimInit = {0};
SYSCTRL_FuncDisable(SYSCTRL_FUNC_CTIMER0_USE_BTIM); /* 配置CTIM0有效,BTIM0/1/2无效 */
SYSCTRL_PeriphClockEnable(PeriphClockCtim0); /* 使能CTIM0外设时钟 */
GTIM_StcInit(&stcGtimInit); /* 结构体变量初始值初始化 */
stcGtimInit.u32Mode = GTIM_MD_PCLK; /* 工作模式: 定时模式,计数时钟源来自PCLK */
stcGtimInit.u32OneShotEn = GTIM_CONTINUOUS_COUNTER; /* 连续计数模式 */
stcGtimInit.u32Prescaler = GTIM_COUNTER_CLK_DIV1; /* 对计数时钟进行预除频 */
stcGtimInit.u32ToggleEn = GTIM_TOGGLE_DISABLE; /* TOG输出禁止 */
stcGtimInit.u32AutoReloadValue = 250 - 1; /* 自动重载寄存ARR赋值,计数周期为PRS*(ARR+1)*TPCLK */
GTIM_Init(GTIM0, &stcGtimInit); /* GTIM0初始化 */
GTIM_CompareCaptureModeSet(GTIM0, GTIM_COMPARE_CAPTURE_CH0, GTIM_COMPARE_CAPTURE_PWM_NORMAL); /* CHx PWM输出,CNT>=CCR输出高电平 */
GTIM_CompareCaptureRegSet(GTIM0, GTIM_COMPARE_CAPTURE_CH0, 200); /* 比较值 200 */
}把逻辑分析仪接在PA2口,测试波形


开源社区
