论坛元老
 
- 积分
- 3371
- 金钱
- 3371
- 注册时间
- 2015-1-7
- 在线时间
- 794 小时
|
发表于 2016-7-29 14:12:46
|
显示全部楼层
本帖最后由 ianhom 于 2016-7-29 14:42 编辑
没有办法得到那么任意的系统时钟,不过可以写段程序让他自己算,算出来的值修改RCC寄存器就好,注意最大时钟的限制。
[mw_shl_code=c,true]
#define MAX_AHB_CLK (72000000)
static const uint16 sg_au16AhpPre[] = {1, 2, 4, 8, 16, 64, 128, 256, 512};
uint8 SysClk_Cal(uint32 u32ExtCrystal, uint32 u32SetClk) /* u32ExtCrystal是外部晶振频率, u32SetClk是目标AHB时钟频率 */
{
uint8 u8Hse, u8PllMul, u8Ahb;
if(u32SetClk > MAX_AHB_CLK)
{
printf("Setting clock is higher than then the MAX clock\n");
}
for(u8PllMul = 2; u8PllMul <= 16; u8PllMul++)
{
for(u8Ahb = 0; u8Ahb < 9; u8Ahb++)
{
for(u8Hse = 1; u8Hse <= 2; u8Hse++)
{
if((u32SetClk * u8Hse * sg_au16AhpPre[u8Ahb]) == (u32ExtCrystal * u8PllMul))
{
if(u32ExtCrystal / u8Hse * u8PllMul <= MAX_AHB_CLK)
{
printf("Find it! \n");
printf("%d / %d * %d / %d = %d\n\n", u32ExtCrystal, u8Hse, u8PllMul, sg_au16AhpPre[u8Ahb], (u32ExtCrystal / u8Hse * u8PllMul / sg_au16AhpPre[u8Ahb]));
return 0;
}
}
}
}
}
printf("Failed to find\n");
return 1;
}
[/mw_shl_code]
|
|