OpenEdv-开源电子网

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

14.2讲主频时钟设置问题,发现主频没有改变

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2020-4-27
在线时间
6 小时
发表于 2020-5-3 17:45:54 | 显示全部楼层 |阅读模式
1金钱
按照视频教程设置了主频时钟到696M,烧录进去led闪灯频率没有明显改变,为了防止我写错程序。我把例程源码里面的bsp_clk.c里面的全部代码copy进去,然后修改寄存器值(58倍,一倍频)发现闪灯频率确实变快了一倍左右。

然后神奇的事情发生了,我把程序里面后面设置其他的时钟代码删掉,只留下了设置主频的代码,再烧进去,发现闪灯频率又变慢了,改回所有的代码,又正常了。

求解啊!

下面是编写的程序:
void imx6u_clkinit(void)
{
        if((((CCM->CCSR) >> 2) & 0x1 ) == 0)         /* 当前pll1_sw_clk使用的pll1_main_clk*/
        {       
                CCM->CCSR &= ~(1 << 8);                                /* 配置step_clk时钟源为24MH OSC */       
                CCM->CCSR |= (1 << 2);                                /* 配置pll1_sw_clk时钟源为step_clk */
        }

        /* 1.2、设置pll1_main_clk为1056MHz,也就是528*2=1056MHZ,
         *      因为pll1_sw_clk进ARM内核的时候会被二分频!
         *      配置CCM_ANLOG->PLL_ARM寄存器
         *      bit13: 1 使能时钟输出
         *      bit[6:0]: 88, 由公式:Fout = Fin * div_select / 2.0,1056=24*div_select/2.0,
         *                              得出:div_select=    88  
         */
        CCM_ANALOG->PLL_ARM = (1 << 13) | ((58 << 0) & 0X7F);         /* 配置pll1_main_clk=1056MHz */
        CCM->CCSR &= ~(1 << 2);                                                                        /* 将pll_sw_clk时钟重新切换回pll1_main_clk */
        CCM->CACRR = 0;                                                                                        /* ARM内核时钟为pll1_sw_clk/2=1056/2=528Mhz */
}



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

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2020-4-27
在线时间
6 小时
 楼主| 发表于 2020-5-3 19:12:33 | 显示全部楼层
我进一步试了一下,只要在这些程序后,加上任意一种其他时钟的配置,主频就正常。比如加上
        /* 2、设置PLL2(SYS PLL)各个PFD */
        reg = CCM_ANALOG->PFD_528;
        reg &= ~(0X3F3F3F3F);                /* 清除原来的设置                                                 */
        reg |= 32<<24;                                /* PLL2_PFD3=528*18/32=297Mhz         */
        reg |= 24<<16;                                /* PLL2_PFD2=528*18/24=396Mhz(DDR使用的时钟,最大400Mhz) */
        reg |= 16<<8;                                /* PLL2_PFD1=528*18/16=594Mhz         */
        reg |= 27<<0;                                /* PLL2_PFD0=528*18/27=352Mhz          */
        CCM_ANALOG->PFD_528=reg;        /* 设置PLL2_PFD0~3                                  */

这些语句配置PLL2,加了这个之后,led闪烁速度就快了。

真是奇怪啊!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-5-6 01:14:50 | 显示全部楼层
帮顶
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2020-4-27
在线时间
6 小时
 楼主| 发表于 2020-5-6 10:52:00 | 显示全部楼层
期待回答啊
回复

使用道具 举报

10

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-7-1
在线时间
29 小时
发表于 2020-5-13 22:40:35 | 显示全部楼层
void clk_init_792MHZ(void)
{
    if(0 == (((CCM->CCSR) >> 2) & 0x01) )//如果时钟主频是pll1_main_clk那么切换到备用
    {
        //first select osc_clk as step_clk       CCSR:step_Sel
        //seconde select step_Clk as pll1_sw_clk  这两步就把主频时钟切换为了备用的24MHZ的osc、
        CCM->CCSR &= ~(1 << 8);
        CCM->CCSR |=  (1 << 2);
    }
    //主频切换成备用之后那么就开始修改主频 主频设置为792MHZ 然后一分频
    // PLL output frequency = Fref * DIV_SEL/2 =792MHZ =24MHZ*DIV_SEL/2    DIV_SEL=66
    CCM_ANALOG->PLL_ARM &= ~(0X7F);//低7位清0
    CCM_ANALOG->PLL_ARM |= ((66 << 0)&(0x7F));//DIV_SEL=66
    CCM_ANALOG->PLL_ARM |= (1 << 13); //打开时钟使能
    CCM->CACRR =0x02;//1分频

    CCM->CCSR &=  ~(1 << 2);//重新把主频设置为 pll1_main_clk


}

我无论怎么改分频 灯的闪烁速度一点也不会变。
回复

使用道具 举报

13

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2019-12-17
在线时间
57 小时
发表于 2020-5-17 18:30:14 | 显示全部楼层
我的也是,无论怎么修改,将整个初始化都复制了也还是没有变化,不知道为什么
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-4-16
在线时间
16 小时
发表于 2020-6-7 16:47:52 | 显示全部楼层
楼主解决了吗,我也遇到了同样的问题。
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-4-16
在线时间
16 小时
发表于 2020-6-7 16:49:22 | 显示全部楼层
zjj19941024 发表于 2020-5-13 22:40
void clk_init_792MHZ(void)
{
    if(0 == (((CCM->CCSR) >> 2) & 0x01) )//如果时钟主频是pll1_main_cl ...

我的也是,仔细观察是有变化的,但是不明显,找到问题了吗?
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-2-16
在线时间
4 小时
发表于 2020-6-9 22:39:28 | 显示全部楼层
CCM->CACRR =0x02;//1分频     ????????????这个是4吧
回复

使用道具 举报

6

主题

200

帖子

0

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
1063
金钱
1063
注册时间
2019-9-19
在线时间
194 小时
发表于 2020-6-10 12:34:13 | 显示全部楼层
本帖最后由 flyzeng 于 2020-6-10 12:39 编辑

楼主,我按照你的代码,前后烧写对比,并没有你说的快慢变化现象啊。你将main函数中,指示灯闪烁频率改为2秒,这样容易观察快慢变化。需要注意的是,这个延时是不精确的。有问题请继续留言。
                i++;
                if(i==200)
                {
                        i = 0;
                        led_state = !led_state;
                        led_switch(LED0, led_state);
                }
                delay(10);

=======================
出征,嗒嗒嗒——
快点上车!
=======================
回复

使用道具 举报

6

主题

200

帖子

0

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
1063
金钱
1063
注册时间
2019-9-19
在线时间
194 小时
发表于 2020-6-10 12:40:49 | 显示全部楼层
fengqi 发表于 2020-5-17 18:30
我的也是,无论怎么修改,将整个初始化都复制了也还是没有变化,不知道为什么

在main函数中将指示灯闪烁频率加大,这样容易观察快慢变化
=======================
出征,嗒嗒嗒——
快点上车!
=======================
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-8-22
在线时间
1 小时
发表于 2020-8-22 20:38:17 | 显示全部楼层
本帖最后由 wwj123 于 2020-8-22 20:42 编辑

今天学到主频这块也碰到了这个问题我的解决办法:
将例程代码按照我的源代码进行还原,最终发现在问题出在Makefile中对.c文件的编译未加优化项,尝试更改优化等级发现优化等级必须处于-O2(-O3未尝试),使用-O1则不会出现效果,仔细一想感觉这也没道理啊,但确实试了好多次都是这里的问题,如果有大神知道真正原因麻烦告知,谢谢!!!
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-3-3
在线时间
21 小时
发表于 2020-11-3 20:49:17 | 显示全部楼层
在启动文件的start函数里,添加dsb isb指令就可以了,后面到中断那一块也有可能导致主频初始化不成功,多在几个地方添加这个指令可以解决
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 18:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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