4347|6

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32F103系列PLL有36M的吗? [复制链接]

                                 我的芯片明明是STM32F103VET6,可是怎么弄PLL最高输出44M,倍数再高一点就完蛋,为了RCC前前后后弄了差不多2天时间,直到昨天晚上才发现在36M以下就OK,实在不知道是什么原因!!!市场上是不是有废品出售?
此帖出自stm32/stm8论坛

最新回复

                                 版主几乎每次都能抓住问题的核心  详情 回复 发表于 2010-8-27 09:55
点赞 关注
 

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1) 你能证明你的程序正确吗?
2) 你怎么知道PLL最高输出只有44M,怎么测量的?
3) 如果怀疑有废品出售,请提供购买渠道,我们可以追查。
4) 把你的芯片拍个照片发出来。
此帖出自stm32/stm8论坛
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 


不知道版主有没有耐心看我的RCC程序?
RCC->CR = RCC->CR | RCC_CR_HSION;                                         //使能HSI
RCC->CR = RCC->CR | RCC_CR_HSITRIM;                                 //HSI的频率校正
while((RCC->CR & RCC_CR_HSIRDY) != RCC_CR_HSIRDY);             //等待HSI准备好
if(SysClk>8000000)
{
      temp=SysClk/(8000000/2);                        //
//    if(temp>2)temp=temp-2;
//    RCC->CFGR = RCC->CFGR | (temp<<18);                //设置PLL的倍数
    RCC->CFGR = RCC->CFGR | RCC_PLLMul_12;
      RCC->CFGR = RCC->CFGR | RCC_PLLSource_HSI_Div2;        //选择HSI为PLL的输入
    RCC->CR = RCC->CR | RCC_CR_PLLON;                //使能PLL
     while((RCC->CR & RCC_CR_PLLRDY) != RCC_CR_PLLRDY);//等待PLL准备好
    RCC->CFGR = RCC->CFGR | 2;                        //选择PLL作为系统时钟
}
else
{
      RCC->CFGR = RCC->CFGR | RCC_SYSCLKSource_HSI;        //选择HSI作为系统时钟
}
倍数设置11程序正常执行,设置12倍就没有反应了;由于从MCO引脚看不到时钟输出,我是这样判断系统时钟的:
#define        SysTick_Delay                1                                //系统定时器n毫秒定时
#define        SysTickClkSource        1                                //1:SysTick使用AHB(HCLK)时钟做时钟源,0:SysTick使用AHB(HCLK)时钟8分频后做时钟源
void InitSysTick(void)
{
        if(SysTickClkSource)                                                                        //系统定时器采用AHB时钟做时钟源
        {
                SysTick->CTRL |= SysTick_CLKSource_HCLK;
                SysTick->LOAD = SysTick_Delay*SysClk/1000;
        }
        else                                                                                                        //AHB时钟8分频后做系统定时器时钟源
        {
                SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
                SysTick->LOAD = SysTick_Delay*SysClk/8/1000;
        }
        SysTick_CounterCmd(SysTick_Counter_Enable);                                //使能系统定时器
        SysTick->CTRL |= 0x02;                                                                        //使能系统定时器中断
}
在系统定时器中断函数
void SysTick_Handler(void)
{
        if(SysTick->CTRL && 0x100);
        WDI=!WDI;
//        if(WdiCnt++>300){WDI=!WDI;WdiCnt=0;}
        SysTickCnt++;
}
测量WDI信号频率,当我修改PLL倍数时把
#define        SysClk                                48000000                //当选择HSI为时钟源的时候系统时钟最大为64M
也改为期望的时钟值,那么PLL输出正确的话,WDI应该是500Hz(526Hz)左右。
不知道版主对此有何看法?谢谢!
当我选择HSE的时候结果是一样的,只是选择HSE做PLL的源PLL的输出精度非常高,WDI信号就是500Hz。
此帖出自stm32/stm8论坛
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 请问你设置了Flash的等待周期了吗?
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
是这两个函数吧?
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
加在语句“RCC->CFGR = RCC->CFGR | RCC_SYSCLKSource_PLL;”后面,结果一样,
一旦选择了例如64M等系统时钟,时钟切换语句后面的语句就不能执行了。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
找到原因了,这2条语句
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
应该加在语句“RCC->CFGR = RCC->CFGR | RCC_SYSCLKSource_PLL;”前面就OK了。
否则,当系统时钟比较高的时候,不能可靠的读取FLASH,程序当然就不能执行了。
感谢版主的提示。
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 版主几乎每次都能抓住问题的核心
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表