打印

STM32F103系列PLL有36M的吗?

[复制链接]
3092|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzzly|  楼主 | 2010-8-25 09:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的芯片明明是STM32F103VET6,可是怎么弄PLL最高输出44M,倍数再高一点就完蛋,为了RCC前前后后弄了差不多2天时间,直到昨天晚上才发现在36M以下就OK,实在不知道是什么原因!!!市场上是不是有废品出售?
沙发
香水城| | 2010-8-25 10:18 | 只看该作者
1) 你能证明你的程序正确吗?
2) 你怎么知道PLL最高输出只有44M,怎么测量的?
3) 如果怀疑有废品出售,请提供购买渠道,我们可以追查。
4) 把你的芯片拍个照片发出来。

使用特权

评论回复
板凳
yzzly|  楼主 | 2010-8-25 11:18 | 只看该作者
本帖最后由 yzzly 于 2010-8-25 11:24 编辑

不知道香版有没有耐心看我的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。

使用特权

评论回复
地板
香水城| | 2010-8-25 12:01 | 只看该作者
请问你设置了Flash的等待周期了吗?

使用特权

评论回复
5
yzzly|  楼主 | 2010-8-25 13:35 | 只看该作者
是这两个函数吧?
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
加在语句“RCC->CFGR = RCC->CFGR | RCC_SYSCLKSource_PLL;”后面,结果一样,
一旦选择了例如64M等系统时钟,时钟切换语句后面的语句就不能执行了。

使用特权

评论回复
6
yzzly|  楼主 | 2010-8-26 20:08 | 只看该作者
找到原因了,这2条语句
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
应该加在语句“RCC->CFGR = RCC->CFGR | RCC_SYSCLKSource_PLL;”前面就OK了。
否则,当系统时钟比较高的时候,不能可靠的读取FLASH,程序当然就不能执行了。
感谢香版的提示。

使用特权

评论回复
7
火箭球迷| | 2010-8-27 09:55 | 只看该作者
香主几乎每次都能抓住问题的核心:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

427

主题

1178

帖子

3

粉丝