使用芯片第一步网上搜索如何创建工程模板,如何下载和查看资料!!!
本教程使用的开发板是【立创·天空星HC32F4A0PITB开发板】
网址:https://lckfb.com/project/detail/lckfb-lspi-skystar-hc32f4a0pitb-lite?param=baseInfo
开源原理图和PCB,资料免费!!!!感谢立创开发板团队的开源!!
一、器件包安装
官网下载地址:https://www.xhsc.com.cn/Productlist/info.aspx?itemid=1803
我们点击这个下载。
等待下载完成之后,进行解压,然后双击安装。
我们直接 Next 下一步
无脑点击下一步,等待安装完成。
安装完成之后会在Keil软件的安装目录下有一个 HDSC 的文件夹:
注意:这个packs文件夹是我在安装Keil的时候自己设定的,我们其他不用管,只要使用搜索功能能搜得出这个文件夹就证明安装成功了。
二、标准固件库获取
官网下载地址:https://www.xhsc.com.cn/Productlist/info.aspx?itemid=1803
我们需要下载两个压缩包
三、创建工程模板
1、前提条件
-
已经安装好Keil软件
-
已经安装好HC32F4A0PITB的Pack包
-
已经下载好HC32F4A0PITB固件库
2、新建工程目录
新建文件夹,命令为 HC32F4A0PITB_ProjectTemplate,用来保存新创建的工程。
然后在该文件夹下新建6个文件夹,分别命名为:
-
project: 存放工程文件(目前只支持MDK5)。
-
libraries:存放各种库文件,CMSIS,芯片固件库,文件系统库,网络库等。
-
board:存放和板子初始化和链接文件。
-
app: 存放应用程序,由用户编写和放main函数。
-
bsp:存放和底层相关的支持包。
-
module:主要存放各种软件模块,比如软件定时器,PID,FIFO,状态机等。
然后在project文件夹下新建一个文件夹:MDK(V5)
在HC32F4A0PITB_ProjectTemplate文件夹下新建一个README.md文件,如图所示。
3、拷贝工程文件
找到我们的固件库的下载目录,将HC32F4A0_DDL_Rev2.2.0/drivers文件夹下的hc32_ll_driver文件夹全部拷贝到新建目录的libraries下。
将HC32F4A0_DDL_Rev2.2.0/drivers文件夹下的cmsis文件夹全部拷贝到新建目录的module下。
然后我们将\hc32f4a0_ddl_Rev1.4.0\mcu\common文件夹复制到 模板module文件夹下。
将 \HC32F4A0_DDL_Rev2.2.0\projects\ev_hc32f4a0_lqfp176\examples\adc\adc_base\source 下的
-
hc32f4xx_conf.h
-
main.c
复制到app文件夹下。
我们将下方百度网盘内的文件下载并且解压,拖到 HC32F4A0PITB_ProjectTemplate 文件夹中替换原本的board文件夹。
这个board文件夹中是初始化函数和us级函数,直接可以将芯片配置为240MHz!!!
链接:https://pan.baidu.com/s/1BLEdlLL1AJBfi2AB-sKT5Q?pwd=ed94
提取码:ed94
/*-------board.h文件------*/
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:https://oshwhub.com/forum
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-04-07 LCKFB-LP first version
*/
#include "hc32_ll.h"
void board_init(void);
void delay_ms(uint32_t __ms); // 延时ms
void delay_1ms(uint32_t __ms); // 延时ms
void delay_us(uint32_t __us); // 延时us
void delay_1us(uint32_t __us); // 延时us
/*-------board.h文件------*/
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:https://oshwhub.com/forum
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-04-07 LCKFB-LP first version
*/
#include "board.h"
/* unlock/lock peripheral */
#define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \
LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM)
#define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM)
/**
* @brief BSP clock initialize.
* Set board system clock to PLLH@240MHz
* Flash: 5 wait
* SRAM_HS: 1 wait
* SRAM1_2_3_4_B: 2 wait
* PCLK0: 240MHz
* PCLK1: 120MHz
* PCLK2: 60MHz
* PCLK3: 60MHz
* PCLK4: 120MHz
* EXCLK: 120MHz
* HCLK: 240MHz
* @param None
* @retval None
*/
void BSP_CLK_Init(void)
{
stc_clock_xtal_init_t stcXtalInit;
stc_clock_pll_init_t stcPLLHInit;
/* PCLK0, HCLK Max 240MHz */
/* PCLK1, PCLK4 Max 120MHz */
/* PCLK2, PCLK3 Max 60MHz */
/* EX BUS Max 120MHz */
CLK_SetClockDiv(CLK_BUS_CLK_ALL, \
(CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | CLK_PCLK2_DIV4 | \
CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2 | CLK_EXCLK_DIV2 | \
CLK_HCLK_DIV1));
GPIO_AnalogCmd(GPIO_PORT_H, GPIO_PIN_01 | GPIO_PIN_00, ENABLE);
CLK_XtalStructInit(&stcXtalInit);
/* Config Xtal and enable Xtal */
stcXtalInit.u8Mode = CLK_XTAL_MD_OSC;
stcXtalInit.u8Drv = CLK_XTAL_DRV_ULOW;
stcXtalInit.u8State = CLK_XTAL_ON;
stcXtalInit.u8StableTime = CLK_XTAL_STB_2MS;
CLK_XtalInit(&stcXtalInit);
(void)CLK_PLLStructInit(&stcPLLHInit);
/* VCO = (8/1)*120 = 960MHz*/
stcPLLHInit.u8PLLState = CLK_PLL_ON;
stcPLLHInit.PLLCFGR = 0UL;
stcPLLHInit.PLLCFGR_f.PLLM = 1UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLN = 120UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLP = 4UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLQ = 4UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLR = 4UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_XTAL;
(void)CLK_PLLInit(&stcPLLHInit);
/* Highspeed SRAM set to 1 Read/Write wait cycle */
SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1);
/* SRAM1_2_3_4_backup set to 2 Read/Write wait cycle */
SRAM_SetWaitCycle((SRAM_SRAM123 | SRAM_SRAM4 | SRAM_SRAMB), SRAM_WAIT_CYCLE2, SRAM_WAIT_CYCLE2);
/* 0-wait @ 40MHz */
EFM_SetWaitCycle(EFM_WAIT_CYCLE5);
/* 4 cycles for 200 ~ 250MHz */
GPIO_SetReadWaitCycle(GPIO_RD_WAIT4);
CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
}
void board_init(void)
{
LL_PERIPH_WE(EXAMPLE_PERIPH_WE);
BSP_CLK_Init();
(void)SysTick_Init(1000U);
LL_PERIPH_WP(EXAMPLE_PERIPH_WP);
}
// 延时us
void delay_us(uint32_t __us)
{
uint32_t ticks;
uint32_t told, tnow, tcnt = 0;
uint32_t reload = SysTick->LOAD; // 获取SysTick的重载值
// 计算需要的时钟数 = 延迟微秒数 * 每微秒的时钟数
ticks = __us * (SystemCoreClock / 1000000);
// 获取当前的SysTick值
told = SysTick->VAL;
while (1)
{
// 重复刷新获取当前的SysTick值
tnow = SysTick->VAL - 200;
if (tnow != told)
{
if (tnow < told)
tcnt += told - tnow;
else
tcnt += reload - tnow + told;
told = tnow;
// 如果达到了需要的时钟数,就退出循环
if (tcnt >= ticks)
break;
}
}
}
// 延时us
void delay_1us(uint32_t __us){ delay_us(__us); }
// 延时ms
void delay_ms(uint32_t __ms){ delay_us(__ms * 1000); }
// 延时ms
void delay_1ms(uint32_t __ms){ delay_us(__ms * 1000); }
/**
* @brief SysTick interrupt handler function.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
SysTick_IncTick();
// __DSB(); /* Arm Errata 838869 */
}
4、新建Keil工程
在上面建立的project
文件夹里面创建一个MDK(V5)
文件夹用来存放keil MDK ARM V5
版本的工程文件。 打开Keil uVision5
创建一个新的工程: 单击->Project
->New uVision Project
->选好芯片型号HC32F4A0PITB
。
5、创建分组并添加源文件
右键Target->单击Manage Project Items 如下所示设计分组(双击可以修改名字):
将\HC32F4A0PITB_ProjectTemplate\module\cmsis\Device\HDSC\hc32f4xx\Source\ARM
目录下的startup_hc32f4a0.s
(启动文件)添加到STARTUP组里(注意最后要点击对话框左下角的OK
按钮才能生效)。
将\HC32F4A0PITB_ProjectTemplate\module\cmsis\Device\HDSC\hc32f4xx\Source
目录下的 system_hc32f4a0.c 添加到APP组里面:、。
将\HC32F4A0PITB_ProjectTemplate\libraries\hc32_ll_driver\src
目录下的所有文件添加到Driver组里面。
添加\board
目录下的board.c
文件到Board目录下去
添加README.md
文件到DOC目录下去。(注意:文件类型一定要选择 All files 才可以看得到.md后缀的文件)
然后我们将app文件夹中的main.c,添加到APP目录中。
最后我们打开文件添加的窗口,将usb相关的c文件删掉。
添加下列路径:
6、配置工程
点击魔法棒弹出页面
-
勾选
Create HEX File
-
使用微库
-
添加全局宏定义 :
__DEBUG,HC32F4A0,USE_DDL_DRIVER
-
C语言使用C99标准
注意:下面第一张图使用AC6编译器~!!!!!图片中弄错了!!
7、修改工程
我们模板中使用的是hc32_ll.h作为主要头文件。我们想要使用hc32_ll.h外设,需要在头文件 hc32f4xx_conf.h 中将相关的DDL_OFF改为DDL_ON。
打开hc32f4xx_conf.h修改:
四、测试
将main.c中的代码替换为:
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:https://oshwhub.com/forum
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-04-07 LCKFB-LP first version
*/
#include "board.h"
int32_t main(void)
{
stc_gpio_init_t stcGpioInit; // 定义GPIO结构体
board_init();
GPIO_Unlock(); // 解锁GPIO寄存器
(void)GPIO_StructInit(&stcGpioInit);
(void)GPIO_Init(GPIO_PORT_B, GPIO_PIN_02, &stcGpioInit);
GPIO_ResetPins(GPIO_PORT_B,GPIO_PIN_02); // 置为低电平
GPIO_OE(GPIO_PORT_B,GPIO_PIN_02,Enable);// GPIO B2输出使能
GPIO_Lock(); // 锁定GPIO寄存器
while(1)
{
GPIO_SetPins(GPIO_PORT_B,GPIO_PIN_02); // 高电平
delay_ms(200);
GPIO_ResetPins(GPIO_PORT_B,GPIO_PIN_02); // 低电平
delay_ms(200);
}
}
我们点击编译
发现0错误,0警告,这样我们的工程模板就完成了!