使用Keil 5进行工程搭建,后续所有测评代码,都将在此工程的基础上进行添加,并且,与测评相关的所有工程都会上传到论坛。
首先需要在EEworld网站(https://bbs.eeworld.com.cn/elecplay/content/5aa6118a#F3)或者官网(http://xhsc.com.cn/Productlist/info.aspx?itemid=1801)下载相关资料。主要有以下几个文件,如下图所示:
上述几个文件按从上到下顺序,分别为HC32F4A0芯片数据手册、编程手册、开发板原理图资料、驱动库和Keil Pack包。
准备工作结束,先安装HC32F4A0_IDE_Rev1.0.6.zip中的Keil pack包。然后,新建一个有如下文件夹,里面按我个人喜好,新建了如下内容:
其中,Bsp文件夹中还有src和inc文件夹,我们后续的驱动代码都将放在这个文件夹中;Doc文件加用于存放ReadMe文件和相应的程序说明文件;Libraies文件夹用于存放驱动库代码,即我们下载的HC32F4A0_DDL_Rev2.0.0.zip中的文件;Project文件夹用于存放工程文件;User用于存放我们的相关业务代码;通讯文件夹中存放串口调试工具。
然后,我们将.\HC32F4A0_DDL_Rev2.0.0\drivers文件夹下的所有文件拷贝到Libraries文件夹中;
CMSIS文件夹中内容如下:
User文件夹内容如下,其中hc32f4xx_config.h文件从官方例程中拷贝出来的,其余文件由自己编写。
下面开始新建工程,创建工程时,选择HC32F4A0SITB,随后打开Keil工程管理工具,创建以下虚拟文件夹,并在这些虚拟文件夹中添加文件。
工程创建好后,整个目录如图所示,头文件的包含,就不再展开了。
点击编译,至此,工程创建部分已经结束,写得不是很详细,需要的朋友可以下载后附的工程文件。
接着时我们的业务代码。首先,查看官方手册,我们知道,这个芯片主频可以达到240MHz,但是,我们创建完后,主频在40MHz。这个我觉得是官方库做的不是很好的地方。一般像STM32F4或者GD的单片机,只需要更改好外部晶振的频率,就可以了,系统时钟的配置,都在system_xx32fxxx.c中写好了,GD的只需要打开对应的宏就可以了。
但是,华大官方并没有帮我们做好这件事,不过在提供的例程中可以找到对应的配置代码,个人觉得还是集成在system_hc32f4a0.c中比较好。
以下是系统时钟配置代码:
/**************************************************************
* [url=home.php?mod=space&uid=32621]@name[/url] SetSysClk
* [url=home.php?mod=space&uid=159083]@brief[/url] 参考自官方工程
* @param None
* @retval
* [url=home.php?mod=space&uid=1315547]@author[/url] Zachary
* [url=home.php?mod=space&uid=34591]@data[/url] 2023-02-13
**************************************************************/
static void bsp_SetSysClk( void )
{
stc_clock_xtal_init_t stcXtalInit;
stc_clock_pll_init_t stcPLLHInit;
LL_PERIPH_WE( LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | \
LL_PERIPH_EFM | LL_PERIPH_SRAM ); /* ---解保护相关外设--- */
/* 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 ) ); /* ---外设总线分频--- */
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 );
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;
CLK_PLLInit( &stcPLLHInit );
/* Highspeed SRAM set to 0 Read/Write wait cycle */
SRAM_SetWaitCycle( SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0 );
/* SRAM1_2_3_4_backup set to 1 Read/Write wait cycle */
SRAM_SetWaitCycle( ( SRAM_SRAM123 | SRAM_SRAM4 | SRAM_SRAMB ), SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1 );
/* 0-wait @ 40MHz */
EFM_SetWaitCycle( EFM_WAIT_CYCLE5 );
/* 4 cycles for 200 ~ 250MHz */
GPIO_SetReadWaitCycle( GPIO_RD_WAIT4 );
CLK_SetSysClockSrc( CLK_SYSCLK_SRC_PLL );
LL_PERIPH_WP( LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | \
LL_PERIPH_EFM | LL_PERIPH_SRAM ); /* ---保护相关外设--- */
}
配置好时钟后,新建全局变量stc_clock_freq_t sysclk,在配置完时钟后,调用CLK_GetClockFreq()函数进行查看系统时钟是否配置正确,如图所示。
在正确配置时钟后,我们进行编写点灯程序。可是查看原理图,发现,竟然没有单独IO口控制的led灯,太狠了。不过查看例程和原理图发现了以下电路:
我们可以通过控制TPS2051的第4引脚,来控制LED11的亮灭,LED10也是同样的道理。
下面我们在bsp_Gpio.c和bsp_Gpio.h中写相应的配置代码:
/**************************************************************
* @Name bsp_Gpio_Init
* @brief
* @param None
* @retval
* @author Zachary
* @Data 2022-02-13
**************************************************************/
void bsp_Gpio_Init( void )
{
stc_gpio_init_t Gpio_InitStruct = { 0 };
LL_PERIPH_WE( LL_PERIPH_GPIO ); /* --关闭写GPIO寄存器保护--- */
Gpio_InitStruct.u16PinDir = PIN_DIR_OUT; /* --方向 输入或输出--- */
Gpio_InitStruct.u16PinDrv = PIN_HIGH_DRV; /* --驱动能力--- */
Gpio_InitStruct.u16PinAttr = PIN_ATTR_DIGITAL; /* --数字量或模拟量--- */
Gpio_InitStruct.u16PinOutputType = PIN_OUT_TYPE_CMOS; /* --正常CMOS电平输出或NMOS开漏输出--- */
// Gpio_InitStruct.u16PinInputType = PIN_IN_TYPE_SMT; /* --施密特输入或CMOS输入--- */
Gpio_InitStruct.u16PinState = PIN_STAT_RST; /* --初始化后电平状态--- */
Gpio_InitStruct.u16PullUp = PIN_PU_ON; /* --上拉输出--- */
Gpio_InitStruct.u16ExtInt = PIN_EXTINT_OFF; /* --中断功能不开启--- */
Gpio_InitStruct.u16Invert = PIN_INVT_OFF; /* --反向功能不开启--- */
Gpio_InitStruct.u16Latch = PIN_LATCH_OFF; /* --输出锁存功能不开启--- */
GPIO_Init( LED11_PORT, LED11_PIN, &Gpio_InitStruct );
GPIO_Init( LED10_PORT, LED10_PIN, &Gpio_InitStruct );
LL_PERIPH_WP( LL_PERIPH_GPIO ); /* --开启写GPIO寄存器保护--- */
}
/* Includes --------------------------------------------------------------*/
#include "main.h"
/* --- Define ------------------------------------------------------------*/
#define LED11_PIN GPIO_PIN_09
#define LED11_PORT GPIO_PORT_C
#define LED11_TOGGLE() GPIO_TogglePins( LED11_PORT, LED11_PIN );
#define LED10_PIN GPIO_PIN_11
#define LED10_PORT GPIO_PORT_B
#define LED10_TOGGLE() GPIO_TogglePins( LED10_PORT, LED10_PIN );
/* --- Typedef -----------------------------------------------------------*/
/* --- Variables ---------------------------------------------------------*/
/* --- Functions ---------------------------------------------------------*/
void bsp_Gpio_Init( void );
/*------------------------------------------------------------------------*/
接着在主程序中调用相关初始化代码和点灯程序:
/**
************************************* Copyright ******************************
*
* (C) Copyright 2022,Zachary ,HPU, China.
* All Rights Reserved
*
* FileName : main.c
* Version : v1.0
* Author : Zachary
* Date : 2023-02-13
* Description: This is a template project of HC32F4A0
---Zachary,in Zhejiang Hanpu.
******************************************************************************
*/
/* Includes --------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include "main.h"
#include "bsp_Gpio.h"
/* --- Typedef -----------------------------------------------------------*/
/* --- Define ------------------------------------------------------------*/
/* --- Macro -------------------------------------------------------------*/
/* --- Variables ---------------------------------------------------------*/
stc_clock_freq_t sysclk;
/* --- Functions ---------------------------------------------------------*/
static void SysInit( void );
static void bsp_SetSysClk( void );
/*------------------------------------------------------------------------*/
/**************************************************************
* @Name main
* @brief
* @param None
* @retval
* @author Zachary
* @Data 2022-02-13
**************************************************************/
int32_t main( void )
{
SysInit();
while( 1 )
{
LED10_TOGGLE();
LED11_TOGGLE();
delay_ms( 500 );
}
}
/**************************************************************
* @Name SysInit
* @brief
* @param None
* @retval
* @author Zachary
* @Data 2023-02-13
**************************************************************/
static void SysInit( void )
{
bsp_SetSysClk();
CLK_GetClockFreq( &sysclk );
delay_init( 240 );
bsp_Gpio_Init();
}
最后,我使用的是Jlink下载的程序,keil配置jlink时,找不到芯片时,选择cortex-m4即可。板载的DAP,keil中没法使用,有没有会玩的网友。
以上就是环境搭建和点灯的程序,以下是程序效果视频。
|