回答

收藏

[资料] GD32F105/107的时钟配置 108M【转】

GD32 GD32 5037 人阅读 | 0 人回复 | 2015-05-13

GD32F105/107的时钟配置 108M【转】
105,107的RCC寄存器中,RCC_CFGR的PLLMUL[4]由Bit27换到了bit29,因为bit27被MCO[3]占了,所以108M的配置有点小的变化。
另外105,107的HSE一般接的25M晶振,所以配置过程如下:
  1. static void SetSysClockTo108(void)
  2. {
  3.   __IO uint32_t StartUpCounter = 0,HSEStatus = 0;
  4.   __IO uint16_t GigadeviceID = 0;

  5.   /*ID check*/
  6.   if( *( uint8_t *)( 0xE00FFFE8 ) & 0x08 )
  7.   {
  8.        GigadeviceID = ( ( *( uint8_t *)( 0xE00FFFD0 ) & 0x0F ) << 8 ) |
  9.                   ( ( *( uint8_t *)( 0xE00FFFE4 ) & 0xFF ) >> 3  )  |
  10.                   ( ( *( uint8_t *)( 0xE00FFFE8 ) & 0x07 ) << 5 ) + 1 ;
  11.   }
  12.   if(GigadeviceID != 0x7A3)return;
  13.   
  14.   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  15.   /* Enable HSE */   
  16.   RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  17.   /* Wait till HSE is ready and if Time out is reached exit */
  18.   do
  19.   {
  20.     HSEStatus = RCC->CR & RCC_CR_HSERDY;
  21.     StartUpCounter++;  
  22.   } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  23.   if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  24.   {
  25.     /* HCLK = SYSCLK */
  26.     RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;     
  27.     /* PCLK2 = HCLK */
  28.     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
  29.     /* PCLK1 = HCLK/2 */
  30.     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

  31. #ifdef STM32F10X_CL
  32.     /* Configure PLLs ------------------------------------------------------*/
  33.     /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
  34.     /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */
  35.         
  36.     RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
  37.                               RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
  38.     RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
  39.                              RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10);
  40.   
  41.     /* Enable PLL2 */
  42.     RCC->CR |= RCC_CR_PLL2ON;
  43.     /* Wait till PLL2 is ready */
  44.     while((RCC->CR & RCC_CR_PLL2RDY) == 0)
  45.     {
  46.     }
  47.    
  48.     /* PLL configuration: PLLCLK = PREDIV1 * 27 = 108 MHz */
  49.     RCC->CFGR &= (uint32_t)~( RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
  50.     RCC->CFGR |= (uint32_t)(0x20000000 | RCC_CFGR_PLLSRC_PREDIV1 |
  51.                             RCC_CFGR_PLLMULL12);      
  52. #else
  53.     /*  PLL configuration: PLLCLK = HSE/2* (15+12) = 108 MHz */
  54.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
  55.                                        RCC_CFGR_PLLMULL));
  56.     RCC->CFGR |= (uint32_t)(0x08000000 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL12);   
  57.    
  58. #endif
  59.         
  60.     /* Enable PLL */
  61.     RCC->CR |= RCC_CR_PLLON;
  62.     while((RCC->CR & RCC_CR_PLLRDY) == 0){}
  63.    
  64.     /* Select PLL as system clock source */
  65.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
  66.     RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
  67.     while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08){}

  68.   }
  69.   else
  70.   { /* If HSE fails to start-up, the application will have wrong clock
  71.          configuration. User can add here some code to deal with this error */
  72.   }
  73. }
复制代码
原帖:http://bbs.21ic.com/icview-634644-1-1.html
分享到:
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条