ก็มาดูแต่ละจุดกันนะ ว่ามันคืออะไรกันบ้าง
จุดแรกก็เลือก OSCILLATORTYPE เราก็เลือกเป็น crytal 8MHz ภายนอก ดูที่บิต register ก็ไม่มีบิตนี้อยู่นะ ก็ละเป็นที่เข้าใจก่อน มากมายเหลือเกิน หาไม่ไหว ท่านใดทราบก็อธิบายเสริมมานะครับ
oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
จุดนี้เราก็เลือก RCC_HSE_ON ส่วนตัวอื่นเราก็ OFF ไป ตัวนี้มีบิตให้เลือกเป็น '0' เป็น '1' ที่ Clock control register (RCC_CR)
oscinitstruct.HSEState = RCC_HSE_ON;
oscinitstruct.LSEState = RCC_LSE_OFF;
oscinitstruct.HSIState = RCC_HSI_OFF;
ตัวนี้เรามาตั้งเป็น HSE แล้วคงจะไม่ได้ใช้แล้วใช่ไหม ก็ใส่เอาไว้ก็ได้ หรือลองเอาออก ดูสิว่ายังทำงานได้ไหม
oscinitstruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
นี่ที่ block diagram ก็ไม่เห็นมี คงมีในเบอร์ใหญ่ conectivity line (stm32f107) ก็เลือกหารด้วย '1' เอาไว้ หรือจะเอาออกก็ได้
มันจะมีบิต PLLXTPRE เพื่อเลือกว่าจะเอา HSE เข้า PLL โดยตรง(PLLXTPRE =0) หรือจะหาร HSE ด้วย 2 ก่อน (PLLXTPRE = 1) ก็ไม่มีให้ตั้งนะ ถ้าไม่มีให้ตั้งก็เป็น default คือ บิต PLLXTPRE จะเท่ากับ '0' คือเลือก HSE โดยตรง
oscinitstruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
จุดนี้เราก็เลือก PLL ON, เลือก HSE เป็น source ของ PLL, เลือก PLL คุณด้วย 8 ก็จะได้ clock เป็น 8x8 = 64MHz ถ้าเราตั้งเป็น MUL9 ก็จะได้ clock เป็น 8x9 = 72MHz ซึ่งเป็นค่าที่สูงสุดแล้ว ห้ามตั้งค่าเกินนี้ ถ้า crytal ของเราเท่ากับ 8MHz ลองตั้งตัวคูณ(MUL) ให้ต่ำลงมาก็ได้ ลงมาได้ถึง MUL2 เลย (ดูที่ Clock configuration register (RCC_CFGR)) ตามความต้องการใช้งานของเรา เราจะเปลี่ยน crytal ภายนอกเป็นค่าความถี่เท่าไหร่ก็ได้ ให้ตรงกับค่าการใช้งานของเราได้เลย ไม่ได้ฟิคอยู่ที่ 8MHz crytal
oscinitstruct.PLL.PLLState = RCC_PLL_ON;
oscinitstruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
oscinitstruct.PLL.PLLMUL = RCC_PLL_MUL8;