本帖最后由 骑着蜗牛狂奔O 于 2022-2-21 19:53 编辑
AT32的ERTC时钟源可以选择LEXT、LICK、HEXT,3种时钟源各有适应的场景
LEXT:通常使用32.768Khz的晶振
优点:是该种时钟源精度最高,并且能在电池供电下、以及低功耗模式下工作
缺点:需要一颗晶振,增加元件成本,增大PCB布线面积
HEXT: 主晶振
优点:该种时钟源精度也比较高,节省一颗晶振,降低了PCB布线面积
缺点:不能在电池供电下、以及低功耗下模式工作
LICK:典型值为40Khz,官方手册写了范围在30Khz~60KHz,
优点:能在电池供电下、以及低功耗模式下工作,节省一颗晶振,降低了PCB布线面积
缺点:时钟精度低,时间不是很准
AT32官方demo在以下路径
AT32F415_Firmware_Library_CN\project\at_start_f415\examples\ertc\calendar
以下程序是我在官方demo中截取的时钟切换部分
选择LICK为时钟
/* enable the lick osc */
crm_clock_source_enable(CRM_CLOCK_SOURCE_LICK, TRUE);
/* wait till lick is ready */
while(crm_flag_get(CRM_LICK_STABLE_FLAG) == RESET)
{
}
/* select the ertc clock source */
crm_ertc_clock_select(CRM_ERTC_CLOCK_LICK);
/* ertc second(1hz) = ertc_clk(lick) / (ertc_clk_div_a + 1) * (ertc_clk_div_b + 1) */
ertc_clk_div_b = 255;
ertc_clk_div_a = 127;
选择LEXT为时钟
/* enable the lext osc */
crm_clock_source_enable(CRM_CLOCK_SOURCE_LEXT, TRUE);
/* wait till lext is ready */
while(crm_flag_get(CRM_LEXT_STABLE_FLAG) == RESET)
{
}
/* select the ertc clock source */
crm_ertc_clock_select(CRM_ERTC_CLOCK_LEXT);
/* ertc second(1hz) = ertc_clk / (ertc_clk_div_a + 1) * (ertc_clk_div_b + 1) */
ertc_clk_div_b = 255;
ertc_clk_div_a = 127;
选择HEXT为时钟源,在官方的库中没有,但是比较简单
crm_ertc_clock_select(CRM_ERTC_CLOCK_HEXT_DIV);
意思就是选择HEXT/128为ERTC时钟,然后根据HSE频率配置分频值就行了,比如当HEXT为8MHz时,那么ERTC时钟为8MHz/128 = 62500hz,配置分频值为(ertc_clk_div_a + 1)*(ertc_clk_div_b + 1) = 62500就行了,比如
ertc_clk_div_b = 499;
ertc_clk_div_a = 124; |