用STM32跑主循环,72M的频率只剩1M

2020-01-01 17:42发布

本帖最后由 delphiliu 于 2012-5-22 17:06 编辑

最近用STM32做全彩的LED显示屏,总是出现画面的闪烁,怀疑是速度太慢了,今天测试,用STM32跑主循环,主循环只有一条翻转指令,结果用示波器测量发现频率只有1M多点。下面是我的时钟设置,8M的外部晶振,DLL作为系统时钟72M。PCLK2是72M,PCLK1是36M。问题出在哪里呢?第一次使用STM32,还请高手指点一二。

void RCC_Configuration(void)
{
   ErrorStatus HSEStartUpStatus;
   RCC_DeInit();                                            //将外设RCC寄存器重设为默认值
   RCC_HSEConfig(RCC_HSE_ON);                               //设置外部高速晶振HSE
   HSEStartUpStatus=RCC_WaitForHSEStartUp();                //等待HSE起振
   if(HSEStartUpStatus==SUCCESS)
   {
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  //预取指缓存使能
         FLASH_SetLatency(FLASH_Latency_2);                                     //设置代码延时值 2 延时周期
         RCC_HCLKConfig(RCC_SYSCLK_Div1);                            //设置AHB时钟(HCLK)RCC_HCLK_Div1 APB时钟=系统时钟
     RCC_PCLK2Config(RCC_HCLK_Div1);                        //设置高速AHB时钟(PCLK2)RCC_HCLK_Div1 APB时钟=HCLK  
         RCC_PCLK1Config(RCC_HCLK_Div2);                        //设置低速AHB时钟(PCLK1)RCC_HCLK_Div2 APB1时钟=HCLK/2
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);    //设置PLL时钟源及倍频系数
         RCC_PLLCmd(ENABLE);                                    //使能或失能PLL
         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)       //等待指定的RCC标志位设置成功,等待PLL初始化成功
         {
         }
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);             //设置系统时间(SYSCLK),设置PLL为系统时钟源
         while(RCC_GetSYSCLKSource()!=0x08)                     //等待PLL成功用于系统时钟的时钟源
         {                                                                                                                //0x00:HSI作为系统时钟
         }                                                                                                                //0x04:HSE作为系统时钟
                                                                                                                    //0x08:PLL作为系统时钟
   }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
85条回答
delphiliu
1楼-- · 2020-01-02 10:29
codefish 发表于 2012-5-22 16:58
只有这么一点代码吗?
我怎么看不到设置PLL为9倍频的代码?
如果用8兆的晶振,设置为9倍频,时钟就为72兆了 ...

void RCC_Configuration(void)
{
   ErrorStatus HSEStartUpStatus;
   RCC_DeInit();                                            //将外设RCC寄存器重设为默认值
   RCC_HSEConfig(RCC_HSE_ON);                               //设置外部高速晶振HSE
   HSEStartUpStatus=RCC_WaitForHSEStartUp();                //等待HSE起振
   if(HSEStartUpStatus==SUCCESS)
   {
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  //预取指缓存使能
         FLASH_SetLatency(FLASH_Latency_2);                                     //设置代码延时值 2 延时周期
         RCC_HCLKConfig(RCC_SYSCLK_Div1);                            //设置AHB时钟(HCLK)RCC_HCLK_Div1 APB时钟=系统时钟
     RCC_PCLK2Config(RCC_HCLK_Div1);                        //设置高速AHB时钟(PCLK2)RCC_HCLK_Div1 APB时钟=HCLK  
         RCC_PCLK1Config(RCC_HCLK_Div2);                        //设置低速AHB时钟(PCLK1)RCC_HCLK_Div2 APB1时钟=HCLK/2
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);    //设置PLL时钟源及倍频系数
         RCC_PLLCmd(ENABLE);                                    //使能或失能PLL
         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)       //等待指定的RCC标志位设置成功,等待PLL初始化成功
         {
         }
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);             //设置系统时间(SYSCLK),设置PLL为系统时钟源
         while(RCC_GetSYSCLKSource()!=0x08)                     //等待PLL成功用于系统时钟的时钟源
         {                                                                                                                //0x00:HSI作为系统时钟
         }                                                                                                                //0x04:HSE作为系统时钟
                                                                                                                    //0x08:PLL作为系统时钟
   }
}


貌似刚才 每帖全。不好意思。
qinshi1208
2楼-- · 2020-01-02 14:50
 精彩回答 2  元偷偷看……
delphiliu
3楼-- · 2020-01-02 19:40
dudududu 发表于 2012-5-22 16:09
看IO是看不出速度的,因为IO动作是需要好几个时钟周期的。
你说的LED是点阵么?多大规模??要是太大了, ...

嗯。现在的点阵不是很大,160×16的。但是是全彩的,芯片为MBI5042,现在数据写入没有问题,就是全屏都在闪,用示波器测量DCLK(串行数据时钟)频率为1M,行扫时间为4ms。我粗略的计算了一下,每行有160个点阵,每个点阵有3个像素,每个像素是16bit,一次要处理7680个bit,一个DCLK可以同时写入3个bit,那么需要3560个DCLK。
delphiliu
4楼-- · 2020-01-02 23:54
qinshi1208 发表于 2012-5-22 17:11
这个内核的速度用IO翻转来测试,好像不能体现内核的速度。
STM32带全彩的,做不了多大,而且还不能去做灰度 ...

嗯,现在在做灰度呢,每个像素的灰度都是16bit,芯片为MBI5042。点阵倒是不大,160×16的,以前没有做过,您看这样的规模能带的动吗?如果排除时钟初始化的问题,除了芯片的性能问题还真想不出别的原因。。
delphiliu
5楼-- · 2020-01-03 04:06
qinshi1208 发表于 2012-5-22 17:11
这个内核的速度用IO翻转来测试,好像不能体现内核的速度。
STM32带全彩的,做不了多大,而且还不能去做灰度 ...

还有一个比较矛盾的。就是我使用比较匹配定时器,对IO口翻转,频率达到了4M,现在在主程序里面翻转,才1M。这个怎么解释呢
codefish
6楼-- · 2020-01-03 04:09
delphiliu 发表于 2012-5-22 17:03
void RCC_Configuration(void)
{
   ErrorStatus HSEStartUpStatus;

看不出代码有什么问题
我相信你的Stm32是运行在72M频率下面的。

一周热门 更多>