首页 > 其他分享 >HC32F4A0PITB创建工程模板

HC32F4A0PITB创建工程模板

时间:2024-06-06 17:29:09浏览次数:27  
标签:CLK 创建 void HC32F4A0PITB 文件夹 us ms GPIO 模板

使用芯片第一步网上搜索如何创建工程模板,如何下载和查看资料!!!

本教程使用的开发板是【立创·天空星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警告,这样我们的工程模板就完成了!

标签:CLK,创建,void,HC32F4A0PITB,文件夹,us,ms,GPIO,模板
From: https://blog.csdn.net/honmy18/article/details/139503472

相关文章

  • FlowUs息流模版变现:创作模板与内容生产的新天地
    在数字化时代,内容创作和管理的需求日益增长。FlowUs作为一个多功能的协作平台,不仅提供了强大的内容创作和管理工具,还为用户开辟了通过创作模板和生产内容赚取收入的新途径。本文将详细介绍FlowUs平台的核心功能、创作模板的特点以及如何通过该平台实现稳定收入。FlowUs平台简......
  • 不会你打我!使用AI绘画Stable Diffusion或Midjourney创建你的专属表情包!附完整详细教程
    相信大家对微信表情包一定非常熟悉了,可能每天都在使用别人的表情包。那么有没有想过制作自己的专属表情包呢?那您可能觉得我又不会设计,怎么制作呢?没关系,虽然不会设计,但是我们可以简单地使用一些AI辅助。不是也上架了自己制作的表情包~今天将自己通过AI制作上架微信表情包的......
  • 创建属性property时,不用官方的 default 说明符;
    创建属性property时,不用官方的default说明符;首先看个案例TPerson=classpublishedpropertyAge:IntegerreadFAgewriteSetAgedefault20;end;我们创建一个TPerson类给其一个属性,然后使用了default20关键字,按照我们的理解应该是这个age属性的默认值就......
  • 在 Powershell 管道中创建新对象
    我希望将某些文件递归复制到目标目录,但保持相同的文件夹结构。我希望能够执行以下操作:gci-Recurse-File*.csproj|rvpa-Relative|select{@{src=$_;dst=[System.IO.Path]::GetDirectoryName($baseDir+$_)}}}|%{mkdir$_.dst&&cp$_.src$_.dst}......
  • C# .NET 6 使用WorkFlow Core 创建工作审批流
    1,背景工作流思想在上世纪60年代就有人提出过;70年代就有人开始尝试,但是由于当时许多的限制,工作流一直没有成功的被实现;80年代才出现第一批成功的工作流系统;90年代工作流技术走向了第一个发展高峰期;90年代后至今工作流出现了很多版本,但是主旨还是不变的,为了使我们的工作变得更......
  • C# .NET 6 使用WorkFlow Core 创建工作审批流
    1,背景工作流思想在上世纪60年代就有人提出过;70年代就有人开始尝试,但是由于当时许多的限制,工作流一直没有成功的被实现;80年代才出现第一批成功的工作流系统;90年代工作流技术走向了第一个发展高峰期;90年代后至今工作流出现了很多版本,但是主旨还是不变的,为了使我们的工作变得更......
  • 使用CRaC为JVM创建checkpoint
    CRaCCoordinatedRestoreatCheckpoint,缩写为CRaC,大致的原理是将JVM的当前运行状态进行持久化存储起来,再条件JDK版本:17及以上,建议17或21OpenJDK发行版,目前支持CRaC的JDK有两家:ZuluJDK:发行商为Azul,下载地址:https://www.azul.com/downloads/?version=java-17-lts&os=c......
  • tapPromise 函数 (绑定hooks方法)tapable 库,创建自定义插件的库
    tapPromise函数(绑定hooks方法)tapable库,创建自定义插件的库刚看到了一个插件的use函数//引入组件use(plugin:IPluginClass,options?:IPluginOption){if(this._checkPlugin(plugin)&&this.canvas){this._saveCustomAttr(plugin);constpluginRu......
  • 创建一条隧道网络,进行传输的时候,是否是转换为物理网卡IP进行通信?
    在创建隧道网络进行传输时,通常不会直接转换为物理网卡IP进行通信。隧道网络的核心思想是通过在现有网络基础上构建一个虚拟的通道,使得原本无法直接通信的节点能够通过这个通道进行通信。具体来说,隧道传输的过程大致可以分为以下几个步骤:封装数据:在隧道的起点(客户端或隧道起点),首......
  • jvm参数模板
    8g物理内存-Xms4g-Xmx4g-Xmn2g-Xss1m-XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=256m-XX:SurvivorRatio=8-XX:MaxDirectMemorySize=512m-XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction=70-XX:+UseCMSInitiatingOccupancyOnly-XX:+UseCMSCompactAtFullC......