OpenEdv-开源电子网

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

关于STM32L1xx 的时钟设置函数的很奇怪的现象~~(内部RC振荡使用)

[复制链接]

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-1-15
在线时间
0 小时
发表于 2014-5-22 13:46:18 | 显示全部楼层 |阅读模式
5金钱
公司做个东西,为了节省PCB面积用了STM32的内部时钟, 写时钟设置函数的时候出问题了~~先是库函数失效,不能成功设置RCC-CFGR的值,后来改为寄存器操作后能成功赋值了,但是单步调试,函数进来就跳不出去了~~真心无解了~~
遂求助于广大热心的人民群众了~~
代码如下

void RCC_Clock_Init(void)
{
 RCC_DeInit();  //  RCC Reset
 RCC_HSEConfig(RCC_HSE_OFF);// 关闭HSE入口
 RCC_HSICmd(ENABLE);     //启用HSI
 while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)       
         {       
         }
 FLASH_PrefetchBufferCmd(ENABLE);
 FLASH_SetLatency(FLASH_Latency_1);
 RCC_PLLConfig (RCC_PLLSource_HSI,RCC_PLLMul_4,RCC_PLLDiv_2);//设置PLL输出32M   HSI为16M 乘以4除以2为32M PLL这里是 因为不能直接乘以2 所以这么设置
 RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB  32M
 RCC_PCLK1Config(RCC_HCLK_Div2);//低速 APB1 16M
 RCC_PCLK2Config(RCC_HCLK_Div1) ;//高速  APB2  32M

 RCC_PLLCmd(ENABLE);
 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)  //等待PLL准备好  
         {
         }
//    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);   //RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟
     RCC->CFGR = RCC->CFGR | 0x00000003;//上面的库函数方式不能执行赋值操作,寄存器操作可成功赋值
   /*  while(RCC_GetSYSCLKSource() != 0x0C)     //  PLL返回用作系统时钟的时钟源 0x0C:PLL作为系统时钟      改为寄存器操作过后就没用这个了~~
       {
       }  */
}

最佳答案

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

回复【4楼】正点原子: --------------------------------- 谢谢原子哥~~一直没来得及回复,当时是第二天直接改了启动文件的默认配置来的~~~但是还忽略了  它还有个MOSI的内部时钟源 比HSI低 比LSI高~~复位后从那个时钟启动的~~~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-1-15
在线时间
0 小时
 楼主| 发表于 2014-5-22 13:46:19 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢原子哥~~一直没来得及回复,当时是第二天直接改了启动文件的默认配置来的~~~但是还忽略了  它还有个MOSI的内部时钟源 比HSI低 比LSI高~~复位后从那个时钟启动的~~~
回复

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-5-15
在线时间
0 小时
发表于 2014-5-22 15:59:43 | 显示全部楼层
是不是启动文件有问题,你删掉,重新加载个启动文件?
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-1-15
在线时间
0 小时
 楼主| 发表于 2014-5-22 16:11:01 | 显示全部楼层
回复【2楼】CXP_ARM:
---------------------------------
不是  不加这个.c文件程序调试没问题  板子也能跑起来的~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-22 17:12:50 | 显示全部楼层
L1,没有用过,F1倒是很容易改出来.
只需要在寄存器代码里面,修改一句话,就是使用内部RC震荡了...
[mw_shl_code=c,true]//系统时钟初始化函数(使用内部RC晶振) //pll:选择的倍频数,从2开始,最大值为16 void Stm32_Clock_Init_RC(u8 PLL) { unsigned char temp=0; MYRCC_DeInit(); //复位并配置向量表 RCC->CR|=0x00010000; //外部高速时钟使能HSEON while(!(RCC->CR>>17));//等待外部时钟就绪 RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1; PLL-=2;//抵消2个单位 RCC->CFGR|=PLL<<18; //设置PLL值 2~16 RCC->CFGR|=0<<16; //PLLSRC 使用内部RC震荡/2,也就是4Mhz的频率 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; } } [/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code] 使用HSE的情况:RCC->CFGR|=1<<16;
改为:RCC->CFGR|=0<<16;
就是使用内部HSI/2作为PLL的时钟源. 
问题就解决了. 

所以说,用库函数是好,就是遇到问题的时候,搞不清白...
偶尔还是看看寄存器代码吧.

实验4 串口实验(内部RC震荡).rar

89.77 KB, 下载次数: 150

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-1-15
在线时间
0 小时
 楼主| 发表于 2014-6-10 09:19:51 | 显示全部楼层
回复【5楼】wu5606523:
---------------------------------
额 是当时忽略了  不是但是忽略了~~
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-11-25
在线时间
0 小时
发表于 2014-12-8 21:20:27 | 显示全部楼层
最后怎么弄的,代码看看啊 啊 啊 啊,还有你做过低功耗吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 05:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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