用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-09 08:02
ming180 发表于 2012-5-22 22:46
楼主把
GPIOE->BRR   |=  0x0040;
GPIOE->BSRR  |=  0x0040;

ok,言之有理!
uc_c++
2楼-- · 2020-01-09 11:37
是了下同为Cortex-M3的EFM32
  1. #include "proj_incs.h"

  2. #define GPIO_LED_1   IO_EFM32_OBJECT_POLARITY_DEF(C,13,0) //PC13,极性0(低电平表示ON,高电平表示OFF)

  3. #define IO_DELAY()   

  4. int main()
  5. {
  6.   CHIP_Init();
  7.   
  8.   CMU_HFRCOBandSet(cmuHFRCOBand_28MHz);                //设置HFRCO频率为28M
  9.   CMU_ClockSelectSet(cmuClock_CORE,cmuSelect_HFRCO);   //选择时钟为内部HFRCO
  10.   
  11.   CMU_ClockEnable(cmuClock_GPIO, true);       //使能GPIO时钟
  12.   GPIO_LED_1<<IO_ON<<IO_MAKE_MODE_PUSHPULL;   //GPIO_LED_1设置PUSHPULL输出,初始ON                  

  13.   while(1)
  14.   {
  15.      GPIO_LED_1<<1;   
  16.      GPIO_LED_1<<0;   
  17.      GPIO_LED_1<<1;   
  18.      GPIO_LED_1<<0;   
  19.      GPIO_LED_1<<1;   
  20.      GPIO_LED_1<<0;            
  21.      GPIO_LED_1<<1;         
  22.      GPIO_LED_1<<0;      
  23.      GPIO_LED_1<<1;   
  24.      GPIO_LED_1<<0;
  25.      GPIO_LED_1<<1;   
  26.      GPIO_LED_1<<0;   
  27.      GPIO_LED_1<<1;   
  28.      GPIO_LED_1<<0;   
  29.      GPIO_LED_1<<1;   
  30.      GPIO_LED_1<<0;            
  31.      GPIO_LED_1<<1;         
  32.      GPIO_LED_1<<0;      
  33.      GPIO_LED_1<<1;   
  34.      GPIO_LED_1<<0;            
  35.   }
  36. }
复制代码IO频率(整波形)频率是F_CPU/6
uc_c++
3楼-- · 2020-01-09 13:43
  1. //------------------------------------------------------------------
  2. #include "proj_incs.h"

  3. #define GPIO_LED_1   IO_STM32_OBJECT_POLARITY_DEF(B,7,0)  //PB7,低电平为ON

  4. int main(void)
  5. {
  6.    SystemInit();
  7.   
  8.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   
  9.    GPIO_LED_1<<IO_OFF<<IO_MAKE_OUT_PP_50M;
  10.   
  11.    while(1)
  12.   {
  13.      GPIO_LED_1<<1;   
  14.      GPIO_LED_1<<0;   
  15.      GPIO_LED_1<<1;   
  16.      GPIO_LED_1<<0;   
  17.      GPIO_LED_1<<1;   
  18.      GPIO_LED_1<<0;            
  19.      GPIO_LED_1<<1;         
  20.      GPIO_LED_1<<0;      
  21.      GPIO_LED_1<<1;   
  22.      GPIO_LED_1<<0;
  23.      GPIO_LED_1<<1;   
  24.      GPIO_LED_1<<0;   
  25.      GPIO_LED_1<<1;   
  26.      GPIO_LED_1<<0;   
  27.      GPIO_LED_1<<1;   
  28.      GPIO_LED_1<<0;            
  29.      GPIO_LED_1<<1;         
  30.      GPIO_LED_1<<0;      
  31.      GPIO_LED_1<<1;   
  32.      GPIO_LED_1<<0;            
  33.   }
  34. }
复制代码试了下STM32,
主频72M    IO速度18M
主频24M    IO速度12M
delphiliu
4楼-- · 2020-01-09 14:47
 精彩回答 2  元偷偷看……
wochai
5楼-- · 2020-01-09 17:24
delphiliu 发表于 2012-5-23 09:28
现在IO翻转的问题已经解决了
    GPIOE->BRR  |=  0x0040;
      GPIOE->BSRR |=  0x0040;   这样修改IO ...

这个要记录一下,虽然没用过STM32
52516
6楼-- · 2020-01-09 20:44
delphiliu 发表于 2012-5-22 18:42
嗯,多谢。现在测得最高的频率是1.8M,比刚才高了点。刚才是1.2M。还是跟正常水平有些差距呢!难道真的是 ...

和库函数没关系。
对了,你是不是启用了参数检测?
在config.h里面有个宏定义

一周热门 更多>