OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3903|回复: 5

系统时钟

[复制链接]

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-12
在线时间
17 小时
发表于 2016-7-29 08:54:51 | 显示全部楼层 |阅读模式
1金钱
哪位大神知道如何把系统时钟配置为我想要的任何频率?非常感谢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11476
金钱
11476
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-7-29 09:20:34 | 显示全部楼层

找找system.c函数,修改里面的常数,都是宏定义。

回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-12
在线时间
17 小时
 楼主| 发表于 2016-7-29 09:32:54 | 显示全部楼层
xuande 发表于 2016-7-29 09:20
找找system.c函数,修改里面的常数,都是宏定义。

能说得详细点吗,我也知道是在里面修改,但是嘛,代码有点复杂,有些看不太懂
比如说我要把系统时钟配置为56M,或者72M,或者48M,你说怎么配置?
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11476
金钱
11476
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-7-29 09:45:21 | 显示全部楼层
feng_dou 发表于 2016-7-29 09:32
能说得详细点吗,我也知道是在里面修改,但是嘛,代码有点复杂,有些看不太懂
比如说我要把系统时钟配置 ...


具体哪个宏定义,我也要看程序才行。
反正不是PLL_M、PLL_N,那个值比较大,比如144(2x72)、336(2x168)。
文件开头有段说明,会有点帮助。

回复

使用道具 举报

307

主题

1427

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7876
金钱
7876
注册时间
2015-10-15
在线时间
2875 小时
发表于 2016-7-29 10:48:46 | 显示全部楼层
1.首先,请了解一下系统时钟是怎么来的,怎么计算。
2.不存在任何频率的。。。。你的频率也一般是几种常用的频率,因为一旦你的外部晶振大小决定了,系统时钟可以设置的值也就那么多。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
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]

QQ截图20160729141800.png
QQ截图20160729142309.png
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 21:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表