stm 32 f 107は外部16 MHzのウェーブを使用します.

4223 ワード

プロジェクトでは16 MHzの外部ウェハを使って、stm 32 f 107のボードを走らせていますが、現在発生している問題はプロジェクトで採用されています.
http://www.360doc.com/content/15/0813/16/18490038_491413356.shtml
この記事のブログを修正したところ、Set SysClock To 72()関数の中のクロック2分周を修正したところ、ブログとの違いが分かりました.
ブログの中の钾ifdef STM 32 F 10 X_CLは定義されていないので、铉elseの部分を実行し、RCC_を追加します.CFGR_PLLXTPRE_HSE_Div 2マクロ定義は2分周時に第2ステップの修正が完了します.
私自身のプロジェクトのコードは、铂ifdef STM 32 F 10 X_です.CLのこの部分のコードですので、マクロ定義の問題であるべきだと思います.そこで、マクロ関連の定義を探してみます.下記のコードが関連していることが分かりました.
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) 
  /* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */
  /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
  /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */
  /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
  /* #define STM32F10X_HD */     /*!< STM32F10X_HD: STM32 High density devices */
  /* #define STM32F10X_HD_VL */  /*!< STM32F10X_HD_VL: STM32 High density value line devices */  
  /* #define STM32F10X_XL */     /*!< STM32F10X_XL: STM32 XL-density devices */
  /* #define STM32F10X_CL*/      /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif
しかし、私が疑問に思うのはSTM 32 F 10 X_です.CLのマクロ定義は注釈であり、また〓if!defined(STM 32 F 10 X LD)&&!defined(STM 32 F 10 X LD_VL)&!defined(STM 32 F 10 XuMD)&&!defined(STM 32 F 10 XuMDHuVL)&!defined(STM 32 F 10 XuHD)&&!defined(STM 32 F 10 X HDHuVL)&!defined(STM 32 F 10 X XL)&&!defined(STM 32 F 10 XuCL)という条件も満足しています.つまり、私のプログラムではSTM 32 F 10 X_は定義されていません.CLマクロは他のところで定義されていますので、keilの設定ツールOptions for Target xxxメニューのC/C++を開けても、マクロの定義がありません.
後に同僚が助けてくれました.STM 32 F 107というチップの属性は他のSTM 32シリーズとは少し違っています.STM 32 F 10 X_を自動的に定義しているようです.CL(私のコードと構成には定義がありませんが)は、プロジェクトを作る時にチップの選択をする時に関連しているかもしれません.もちろんこれも推測です.具体的な原因は私達も確定できません.
また、以前はstm 32 f 107を使って16 MHzの外部ウェハクロックを使った構成も提供されています.これらの構成は彼がテストしたものです.また、Set SysClock To 72()の中で、リンクのブログと同じように、螃else部分を修正してもいいですか?CLのこの部分のコードは、まず実行条件のすべての語句を注釈し、その後、自分達の構成を追加して、第二部分コードの修正を実現する.
#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
/* -----------------------------changed by Mabel.-----------------------------*/        
//    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
//                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
//    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
//                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
//  
//    /* Enable PLL2 */
//    RCC->CR |= RCC_CR_PLL2ON;
//    /* Wait till PLL2 is ready */
//    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
//    {
//    }
//    
//   
//    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
//    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
//    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
//                            RCC_CFGR_PLLMULL9 ); 

	RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                         RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLSRC_PREDIV1 |   RCC_CFGR_PLLMULL9);  


/* -----------------------------changed by Mabel.-----------------------------*/        

#else    
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */
同僚の助けに感謝します.原因を知っている友達もこのブログを見てからコメントしてください.この原因を説明してください.ありがとうございます.