您现在的位置是:首页 >技术教程 >爱普特APT32F110x系列时钟介绍网站首页技术教程

爱普特APT32F110x系列时钟介绍

西之可乐 2023-07-23 16:04:16
简介爱普特APT32F110x系列时钟介绍

最近要用APT32F110x做一些开发,顺便学习一下。

APT32F110x 是由爱普特推出的基于平头哥(T-Head Microsystems)CPU 内核开发的 32 位高性能低成本单片机。
APT32F1104x基于嵌入式 Flash 工艺制造,内部丰富的模拟资源,包括模拟比较器、LCD 控制器,面向的应用为工业控制,小家电,消费电子设备,可穿戴设备等应用。

APT32F1104x的系统时钟源选择和 HCLK/PCLK 频率管理 
  支持多种时钟源作为系统时钟运行: 
-  内部低速振荡器(IMOSC)为缺省时钟源:5.556MHz/4.194MHz/2.097MHz/131.072KHz 
-  内部高速振荡器(HFOSC):48MHz 
-  外部主晶振(EMOSC):0.4MHz ~ 24MHz/32.738KHz 
-  外部 RTC 晶振(ESOSC):32.768KHz 
-  内部超低功耗振荡器(ISOSC):27KHz 
  可编程 CPU 时钟(HCLK)和外设时钟(PCLK) 
  外部时钟失效监测(Clock Fail Monitor),支持时钟去抖选项 
  可选择的系统内部时钟源输出(CLO) 

时钟结构如下图:

 

爱普特提供了demo,其时钟设置在board_config.c中的:

csi_clk_config_t tClkConfig = 
	{SRC_HFOSC, HFOSC_48M_VALUE, SCLK_DIV1, PCLK_DIV1, 5556000, 5556000};
	//{SRC_EMOSC, 20000000, SCLK_DIV1, PCLK_DIV2, 5556000, 5556000};
	//{SRC_IMOSC, IMOSC_5M_VALUE, SCLK_DIV1, PCLK_DIV2,5556000, 5556000};
	//{SRC_HFOSC, HFOSC_48M_VALUE, SCLK_DIV1, PCLK_DIV1,5556000, 5556000};
	//{SRC_IMOSC, IMOSC_4M_VALUE, SCLK_DIV1, PCLK_DIV1,5556000, 5556000};
	//{SRC_IMOSC, IMOSC_2M_VALUE, SCLK_DIV1, PCLK_DIV1,5556000, 5556000};
	//{SRC_IMOSC, IMOSC_131K_VALUE, SCLK_DIV1, PCLK_DIV1,5556000, 5556000};
	//{SRC_ESOSC, ESOSC_VALUE, SCLK_DIV1, PCLK_DIV1,5556000, 5556000};

csi_clk_config_t的结构则定义在sys_clk.h:

typedef struct {
	cclk_src_e		eClkSrc;	//clock source
	uint32_t		wFreq;		//clock frequency
	hclk_div_e		eSdiv;		//SDIV
	pclk_div_e		ePdiv;		//PDIV
	uint32_t		wSclk;		//SCLK
	uint32_t		wPclk;
}csi_clk_config_t;

结构字段的具体解释:

cclk_src_e        eClkSrc;    //对应的是SYSCLK_SEL[2:0]
uint32_t        wFreq;    //clock frequency, 输入时钟的频率,比如内部低速振荡器(IMOSC)的:5.556MHz/4.194MHz/2.097MHz/131.072KHz
hclk_div_e        eSdiv;   //SCLK的分频,即SYSCLK_DIV的值, 由“wTargetSclk = wFreq/g_wHclkDiv[tClkConfig.eSdiv];”中的“g_wHclkDiv”决定,取决于g_wHclkDiv的索引值是多少
pclk_div_e        ePdiv;  //PCLK分频,即PCLK_DIV, 实际值是“tClkConfig.wPclk = tClkConfig.wSclk/(0x1<<tClkConfig.ePdiv);”
uint32_t        wSclk;  //SYSCLK,设置无意义,实际由“tClkConfig.wSclk = wTargetSclk;”决定,csi_sysclk_config中会重新赋值
uint32_t        wPclk;   //PCLK,设置无意义,实际由”tClkConfig.wPclk = tClkConfig.wSclk/(0x1<<tClkConfig.ePdiv);“决定,csi_sysclk_config中会重新赋值

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。