OpenEdv-开源电子网

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

(求助) Stm32_Clock_Init(9);陷入死循环

[复制链接]

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-8-3
在线时间
7 小时
发表于 2018-8-3 17:07:26 | 显示全部楼层 |阅读模式
3金钱
请问程序在Stm32_Clock_Init(9);这句话陷入了死循环是什么原因?
板子用的是自己画的板子,当时为了竞赛用的,照着开发板原理图画的,只是去掉了一些外设。
程序用库函数版本的都可以照常运行,现象也没问题。但是现在学寄存器版本,在开发板学了一段时间了,今天来自己的板子烧个程序发现了大问题。
烧回跑马灯程序,发现程序死在了while(!(RCC->CR>>17));这句话上。
难道是晶振不行?  用的是8M无源贴片晶振。
8M晶振两端电压没问题,和寄存器版本时一样,两个脚都是2.144V(虽然网上说晶振两个脚电压一样时晶振坏了,但是寄存器版本确实能跑),有趣的现象是把while(!(RCC->CR>>17));换成while (!(RCC->CR &=0X00020000));这句后,一脚电压0.1V,另一脚0.4到0.5左右,实在是摸不着头脑。

恳请各位大神指点!

附上简单的跑马灯程序:
int main(void)
{
        u32 i = 0;
        Stm32_Clock_Init(9);
        delay_init(72);
        LED_Init();
        while(1)
        {
                TEST = ~TEST;
                delay_ms(10);
        }


系统时钟初始化函数:       

//系统时钟初始化函数
//pll:选择的倍频数,从2开始,最大值为16                 
void Stm32_Clock_Init(u8 PLL)
{
        unsigned char temp=0;   
        MYRCC_DeInit();                  //复位并配置向量表
        RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
        while(!(RCC->CR>>17));//等待外部时钟就绪
        //while (!(RCC->CR &=0X00020000));
        RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
        PLL-=2;                                  //抵消2个单位(因为是从2开始的,设置0就是2)
        RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
        RCC->CFGR|=1<<16;          //PLLSRC ON
        FLASH->ACR|=0x32;          //FLASH 2个延时周期
        RCC->CR|=0x01000000;  //PLLON
        while(!(RCC->CR>>25));//等待PLL锁定
        RCC->CFGR|=0x00000002;//PLL作为系统时钟         
        while(temp!=0x02)     //等待PLL作为系统时钟设置成功
        {   
                temp=RCC->CFGR>>2;
                temp&=0x03;
        }   
}                    



最佳答案

查看完整内容[请看2#楼]

那就确实是外部振荡没有起来, 检查一下电路, 晶体、包括电容、电阻等都检查一下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-3 17:07:27 | 显示全部楼层
hhh洋哥 发表于 2018-8-7 09:37
检查了一下,确实和PLL有关的寄存器值都是不对的,两个版本都是这样,库函数版本有波形,但是频率也是不 ...

那就确实是外部振荡没有起来,
检查一下电路,
晶体、包括电容、电阻等都检查一下。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-8-3
在线时间
7 小时
 楼主| 发表于 2018-8-3 17:08:40 | 显示全部楼层
对了,换了一次晶振后现象不变。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-8-5 02:04:06 | 显示全部楼层
你这个,检查下是不是芯片挂了?
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-8-3
在线时间
7 小时
 楼主| 发表于 2018-8-5 20:56:09 | 显示全部楼层
正点原子 发表于 2018-8-5 02:04
你这个,检查下是不是芯片挂了?

不好意思原子哥,现在才看到,芯片没挂,库函数版本的程序都可以跑,寄存器版本就不行了
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-5 21:00:06 | 显示全部楼层
看看我的这个帖子
http://www.openedv.com/forum.php ... d=275994&extra=
直接用4楼的函数初始化试试。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-8-3
在线时间
7 小时
 楼主| 发表于 2018-8-6 09:27:25 | 显示全部楼层
warship 发表于 2018-8-5 21:00
看看我的这个帖子
http://www.openedv.com/forum.php?mod=viewthread&tid=275994&extra=
直接用4楼的函数 ...

谢谢您的回复,我刚才试了一下,还是不行。
且晶振问题可以排除,因为库函数版本的程序都可以跑出来,

板子上的晶振

板子上的晶振

库函数版本跑马灯

库函数版本跑马灯
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-6 09:54:26 | 显示全部楼层
hhh洋哥 发表于 2018-8-6 09:27
谢谢您的回复,我刚才试了一下,还是不行。
且晶振问题可以排除,因为库函数版本的程序都可以跑出来,

你是怎么试的呢?
感觉应该不会呀
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-8-3
在线时间
7 小时
 楼主| 发表于 2018-8-6 14:55:37 | 显示全部楼层
warship 发表于 2018-8-6 09:54
你是怎么试的呢?
感觉应该不会呀

我是注释掉了原子哥的时钟初始化和delay_init,复制上帖子里的初始化
QQ截图20180806145505.png
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-8-3
在线时间
7 小时
 楼主| 发表于 2018-8-6 14:56:27 | 显示全部楼层
warship 发表于 2018-8-6 09:54
你是怎么试的呢?
感觉应该不会呀

程序还是在等待外部时钟就绪那边死循环了
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-6 16:34:25 | 显示全部楼层
本帖最后由 warship 于 2018-8-6 16:37 编辑
hhh洋哥 发表于 2018-8-6 14:56
程序还是在等待外部时钟就绪那边死循环了

这就有点意思了,库函数可跑,而这个不行。库函数跑出来的正常吗?主频能算出来是多少吗
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-6 17:05:29 | 显示全部楼层
可以在你正常运行的库函数版本初始化完成后,查询一下RCC->CR和RCC->CFGR寄存器的值
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-8-3
在线时间
7 小时
 楼主| 发表于 2018-8-6 18:40:07 | 显示全部楼层
warship 发表于 2018-8-6 17:05
可以在你正常运行的库函数版本初始化完成后,查询一下RCC->CR和RCC->CFGR寄存器的值

好的 谢谢您的一路指导,不过我得明天早上试一下,明天告诉您哈
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-6 20:12:04 | 显示全部楼层
本帖最后由 warship 于 2018-8-6 20:13 编辑
hhh洋哥 发表于 2018-8-6 18:40
好的 谢谢您的一路指导,不过我得明天早上试一下,明天告诉您哈

可定义u32 RccCR, RccCFGR;
初始化完成后,
RccCR=RCC->CR;  
RccCFGR=RCC->CFGR;
然后如果打印可用:
printf("RCC->CR=%08X",RccCR);   
printf("RCC->CFGR=%08X",RccCFGR);     
或者直接仿真看变量或寄存器的值。
当然,不定义变量,直接使用寄存器也可以。

然后对照寄存器的标志位,看外部时钟、PLL等标志、分频设置等参数。
其实,我想把这个问题搞清楚。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-8-3
在线时间
7 小时
 楼主| 发表于 2018-8-7 09:37:02 | 显示全部楼层
warship 发表于 2018-8-6 20:12
可定义u32 RccCR, RccCFGR;
初始化完成后,
RccCR=RCC->CR;  

检查了一下,确实和PLL有关的寄存器值都是不对的,两个版本都是这样,库函数版本有波形,但是频率也是不对的,两个版本寄存器值都是一样的,PLL未工作。
那么这是晶振的问题吗,板子上的晶振是嘉利创 贴的,当时有这个问题后,换了一片新的晶振也不行。

寄存器值

寄存器值

晶振电路原理图

晶振电路原理图
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-8-3
在线时间
7 小时
 楼主| 发表于 2018-8-7 14:41:51 | 显示全部楼层
warship 发表于 2018-8-7 13:13
那就确实是外部振荡没有起来,
检查一下电路,
晶体、包括电容、电阻等都检查一下。

解决了!
最终的问题出在了晶振电路的电阻上,电阻取值太小,换成1M就行了。
谢谢大神,真的感谢!
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-7 16:52:56 | 显示全部楼层
hhh洋哥 发表于 2018-8-7 14:41
解决了!
最终的问题出在了晶振电路的电阻上,电阻取值太小,换成1M就行了。
谢谢大神,真的感谢!

哈哈,恭喜。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-8-3
在线时间
7 小时
 楼主| 发表于 2018-8-7 19:24:27 | 显示全部楼层

下次画原理图的时候得更小心啦
感谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 07:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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