stm32 ผม initial : HSI + PLL ไม่ผ่านครับ ค้างตลอดเลย ใครก็ได้ ช่วยที T_T

Started by TaoTao, March 22, 2016, 06:33:16 PM

Previous topic - Next topic

TaoTao

ลองกับ Keil และ Coocox ครับ
เบอร์ STM32F103C8

คือ ผมไม่มีบอร์ดอ่ะครับ เป็นชิปเปล่าๆ เลยไม่ได้ต่อ Osc

ผมจึงใช้ HSI + PLL ครับ
เห็น ดาต้าชีท บอกว่า HSI หาร 2 ส่งให้ PLL_16 เป็น 64 MHz

ปัญหาที่เกิดขึ้น คือ
มันมาค้าง ที่บรรทัดสุดท้าย ครับ
บรรทัดที่ ผม // เอาไว้

มันคือ บิต SW ซึ่งเป็นตัวสำคัญเลย

ต้องแก้ไข ตรงไหนอ่ะครับ
เพื่อให้ PLL เป็น System Clock ได้ ครับ


//---------------------------------------------------------------------------------------------------
void Init_clk(){
      
      RCC->CR      &=   ~RCC_CR_HSEON;                  // Off_HSE
   
      RCC->CR      &=   ~RCC_CR_PLLON;                  // Off_PLL
      RCC->CFGR   |=   (0xF << 18);                          // Change mul_PLL
      
      RCC->CR      |=   RCC_CR_PLLON;                  // On_PLL
      while( (RCC->CR & (uint32_t) RCC_CR_PLLRDY) == 0 );
      
      //RCC->CFGR   |=   (uint32_t) 0x2;                                               // พอปิดแล้ว ไม่ค้างครับ งงมากมาย
}

พอปิด RCC->CFGR |= 0x2; แล้ว มันไม่ค้างครับ
แต่ คลอกต่ำมากมาย

ใครแก้ได้ ช่วยทีครับ ว่าต้องทำอย่างไร
งมมาตั้งหลายวันละ ยังไม่รอดเลย

T_T!

RoLRoR

http://blog.tkjelectronics.dk/2010/02/stm32-overclocking/
ทดลองตามนี้ดูไหมครับ. ผมเคย clock  128Mhz ได้กับ stm32f103ret6
เผื่อทดลองดูกับ c8t6  ได้ครับ

ขออภัยลืมดูว่าใช้ internal RC    :-X

dec

น่าจะประมาณนี้นะ ลองดู ผมก็ไม่มี f103 ลอง

void SysClockInit(void)
{
uint32_t tmp;

if( RCC->CFGR & RCC_CFGR_SWS != RCC_CFGR_SW_HSI )
{
/* Check the HSI State */
if( !(RCC->CR & RCC_CR_HSION) )
{
/* Enable the Internal High Speed oscillator (HSI). */
RCC->CR |= RCC_CR_HSION;
}

/* Wait till HSI is ready */
while( !(RCC->CR & RCC_CR_HSIRDY) );
}

/* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
tmp = (RCC->CR & ~RCC_CR_HSITRIM);
tmp |= ((0x10 << 3) & RCC_CR_HSITRIM);
RCC->CR = tmp;

/* Disable the main PLL. */
RCC->CR &= ~RCC_CR_PLLON;

/* Wait till PLL is disabled */
while( (RCC->CR & RCC_CR_PLLRDY) );

/* Configure the main PLL clock source and multiplication factors. */
tmp = RCC->CFGR;
tmp &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
tmp |= (RCC_CFGR_PLLMULL);
RCC->CFGR = tmp;

/* Enable the main PLL. */
RCC->CR |= RCC_CR_PLLON;

/* Wait till PLL is ready */
while( !(RCC->CR & RCC_CR_PLLRDY) );

/* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
tmp = FLASH->ACR & (~FLASH_ACR_LATENCY);
tmp |= FLASH_ACR_LATENCY_1;
FLASH->ACR = tmp;

/* HCLK Configuration */
tmp = (RCC->CFGR & ~RCC_CFGR_HPRE);
tmp |= RCC_CFGR_HPRE_DIV1;
RCC->CFGR = tmp;

/* SYSCLK Configuration */
/* HSI is selected as System Clock Source */
tmp = (RCC->CFGR & ~RCC_CFGR_SW);
tmp |= RCC_CFGR_SW_1;
RCC->CFGR = tmp;

/* PCLK1 & PCLK2 Configuration */
tmp = (RCC->CFGR & ~(RCC_CFGR_PPRE1 | RCC_CFGR_PPRE2));
tmp |= (RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_PPRE2_DIV1);
RCC->CFGR = tmp;
}


TaoTao

Quote from: dec on March 22, 2016, 08:17:51 PM
น่าจะประมาณนี้นะ ลองดู ผมก็ไม่มี f103 ลอง

void SysClockInit(void)
{
uint32_t tmp;

if( RCC->CFGR & RCC_CFGR_SWS != RCC_CFGR_SW_HSI )
{
/* Check the HSI State */
if( !(RCC->CR & RCC_CR_HSION) )
{
/* Enable the Internal High Speed oscillator (HSI). */
RCC->CR |= RCC_CR_HSION;
}

/* Wait till HSI is ready */
while( !(RCC->CR & RCC_CR_HSIRDY) );
}

/* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
tmp = (RCC->CR & ~RCC_CR_HSITRIM);
tmp |= ((0x10 << 3) & RCC_CR_HSITRIM);
RCC->CR = tmp;

/* Disable the main PLL. */
RCC->CR &= ~RCC_CR_PLLON;

/* Wait till PLL is disabled */
while( (RCC->CR & RCC_CR_PLLRDY) );

/* Configure the main PLL clock source and multiplication factors. */
tmp = RCC->CFGR;
tmp &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
tmp |= (RCC_CFGR_PLLMULL);
RCC->CFGR = tmp;

/* Enable the main PLL. */
RCC->CR |= RCC_CR_PLLON;

/* Wait till PLL is ready */
while( !(RCC->CR & RCC_CR_PLLRDY) );

/* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
tmp = FLASH->ACR & (~FLASH_ACR_LATENCY);
tmp |= FLASH_ACR_LATENCY_1;
FLASH->ACR = tmp;

/* HCLK Configuration */
tmp = (RCC->CFGR & ~RCC_CFGR_HPRE);
tmp |= RCC_CFGR_HPRE_DIV1;
RCC->CFGR = tmp;

/* SYSCLK Configuration */
/* HSI is selected as System Clock Source */
tmp = (RCC->CFGR & ~RCC_CFGR_SW);
tmp |= RCC_CFGR_SW_1;
RCC->CFGR = tmp;

/* PCLK1 & PCLK2 Configuration */
tmp = (RCC->CFGR & ~(RCC_CFGR_PPRE1 | RCC_CFGR_PPRE2));
tmp |= (RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_PPRE2_DIV1);
RCC->CFGR = tmp;
}


ได้แว้ววว ๆ ๆ ๆ  ดีใจ ๆ  ^_^!
งมโข่ง เครียดอยู่ตั้งหลายวัน

ต้องมี บิต FLASH_ACR_LATENCY มาเกี่ยวข้องด้วยหรือนี่  มันมาจากไสหว่า O_o!
Initial HSI ล้ำลึกมากมาย ขอคารวะ 1 จอก   ;D

ขอบคุณมากมาย ก๊าบบบบบ

นึกว่า จะไม่ได้ใช้งาน HSI ซะละ

TaoTao

Quote from: RoLRoR on March 22, 2016, 07:42:00 PM
http://blog.tkjelectronics.dk/2010/02/stm32-overclocking/
ทดลองตามนี้ดูไหมครับ. ผมเคย clock  128Mhz ได้กับ stm32f103ret6
เผื่อทดลองดูกับ c8t6  ได้ครับ

ขออภัยลืมดูว่าใช้ internal RC    :-X

128 MHz

O_O!

555+ เดี๋ยวรอว่างก่อน อาจได้ลองซะกะหน่อย อยากรู้ ๆ

ขอบคุณนะค๊าบบบ

:o

dec

Quote from: TaoTao on March 23, 2016, 03:49:41 PM
ได้แว้ววว ๆ ๆ ๆ  ดีใจ ๆ  ^_^!
งมโข่ง เครียดอยู่ตั้งหลายวัน

ต้องมี บิต FLASH_ACR_LATENCY มาเกี่ยวข้องด้วยหรือนี่  มันมาจากไสหว่า O_o!
Initial HSI ล้ำลึกมากมาย ขอคารวะ 1 จอก   ;D

ขอบคุณมากมาย ก๊าบบบบบ

นึกว่า จะไม่ได้ใช้งาน HSI ซะละ

ปัญหานี้จะเจอใน MCU ที่มี System Clock Speed สูงๆ โดย Flash Latency เข้ามาเกี่ยวข้องเพราะการที่ MCU มัน Fetch คำสั่งมาจาก Flash มันเอาสัญญาณนาฬิกา System Clock มาเป็นตัวกำหนด Timing ในสื่อสารกับ Flash Memory โดยการ หารๆๆ ลงมาจนได้ค่าความถี่ที่ต้องการที่ต้องการ ซึ่งถ้าเราไปปรับ System Clock เพิ่มขึ้นเป็น 2 เท่า ค่า Timing ของทั้งระบบก็จะเร็วขึ้นเป็น 2 เท่าจากเดิม

และตรงนี้เราก็เพิ่ม System Clock ไปตั้ง 16 เท่าของ HSI ทำให้ Flash Memory มันตามความเร็ว MCU ไม่ทัน ค่าที่ Fetch มาก็เพี้ยนแล้วก็ทำให้โปรแกรมบึ้มไป เราจึงต้องไปเพิ่ม Latency ในการอ่านข้อมูลจาก Flash (เพิ่มค่าตัวหาร Timing นั่นแหละ) เพื่อให้ MCU รอข้อมูลจาก Flash ให้ถูกต้องก่อน ที่จะเก็บค่าไป Execute

TaoTao

Quote from: RoLRoR on March 22, 2016, 07:42:00 PM
http://blog.tkjelectronics.dk/2010/02/stm32-overclocking/
ทดลองตามนี้ดูไหมครับ. ผมเคย clock  128Mhz ได้กับ stm32f103ret6
เผื่อทดลองดูกับ c8t6  ได้ครับ

ขออภัยลืมดูว่าใช้ internal RC    :-X

ล่าสุด ผมสั่ง F051C8 Speed ต่ำ.. วิ่งแค่ 48_Meg ครับ
แต่จะเอามาใช้งาน ทดแทนตัว 8 bits เดิมที่ผมเคยใช้
เลือกเบอร์นี้ เพราะ มันมี DAC และถูกด้วยอ่ะครับ
ที่สำคัญ ท้ายเอกสาร RM000091 มันมี ตัวอย่างด้วย น่าจะไม่ต้อง งมโคดนาน
ใช้วิชา Copy paste
;D

ไม่รู้ว่า จะ Overclock ให้เจ้า F0 ได้หรือเปล่าเน๊อะ
ถ้าได้ เจ๋งเลย ไม่ก็เจ๊งงงง

เดี๋ยวได้ลอง รอของมาก่อน
555+

TaoTao

Quote from: dec on March 23, 2016, 06:04:01 PM
Quote from: TaoTao on March 23, 2016, 03:49:41 PM
ได้แว้ววว ๆ ๆ ๆ  ดีใจ ๆ  ^_^!
งมโข่ง เครียดอยู่ตั้งหลายวัน

ต้องมี บิต FLASH_ACR_LATENCY มาเกี่ยวข้องด้วยหรือนี่  มันมาจากไสหว่า O_o!
Initial HSI ล้ำลึกมากมาย ขอคารวะ 1 จอก   ;D

ขอบคุณมากมาย ก๊าบบบบบ

นึกว่า จะไม่ได้ใช้งาน HSI ซะละ

ปัญหานี้จะเจอใน MCU ที่มี System Clock Speed สูงๆ โดย Flash Latency เข้ามาเกี่ยวข้องเพราะการที่ MCU มัน Fetch คำสั่งมาจาก Flash มันเอาสัญญาณนาฬิกา System Clock มาเป็นตัวกำหนด Timing ในสื่อสารกับ Flash Memory โดยการ หารๆๆ ลงมาจนได้ค่าความถี่ที่ต้องการที่ต้องการ ซึ่งถ้าเราไปปรับ System Clock เพิ่มขึ้นเป็น 2 เท่า ค่า Timing ของทั้งระบบก็จะเร็วขึ้นเป็น 2 เท่าจากเดิม

และตรงนี้เราก็เพิ่ม System Clock ไปตั้ง 16 เท่าของ HSI ทำให้ Flash Memory มันตามความเร็ว MCU ไม่ทัน ค่าที่ Fetch มาก็เพี้ยนแล้วก็ทำให้โปรแกรมบึ้มไป เราจึงต้องไปเพิ่ม Latency ในการอ่านข้อมูลจาก Flash (เพิ่มค่าตัวหาร Timing นั่นแหละ) เพื่อให้ MCU รอข้อมูลจาก Flash ให้ถูกต้องก่อน ที่จะเก็บค่าไป Execute

อ่อ..  อย่างนี้นี่เอง
ขอบคุณมากมายครับ

:D