قسمت نهم – تنظیمات کلاک

حبیب نصراصفهانی دیدگاه ها 0 سپتامبر 18, 2019

سیستم کلاک داخلی STM8 به ما این اجازه را می‌دهد که سرعت عملکرد CPU را متناسب با نیاز خود تنظیم کنیم. تأخیر نرم‌افزار و توان مصرفی به تنظیمات کلاک سیستم وابسته است.

در میکروکنترلرهای STM8، سه منبع کلاک اصلی وجود دارد. کلاک داخلی سرعت بالا (HSI)، کلاک خارجی سرعت بالا (HSE) و کلاک داخلی کم مصرف (LSI). کلاک داخلی سرعت بالا (HSI)  دارای فرکانس نوسان 16 مگاهرتز است و یک نوسانگر داخلی RC با دقت خوب است – حدود 1٪ تحمل در طیف گسترده‌ای از دما. HSE می‌تواند به عنوان یک مدار کلاک خارجی، نوسانگر کریستالی با جبران حرارت (TCXO) یا تشدید کننده کریستال معمولی باشد. می‌تواند فرکانس‌های از 1  مگاهرتز تا 24 مگاهرتز را بپذیرد. در نهایت، کلاک LSI مبتنی بر اسیلاتور RC داخلی است که عمدتاً برای حالت‌های کم مصرف و تایمر نظارت مستقل (IWDG) استفاده می‌شود. این کلاک دارای فرکانس ثابت 128 کیلوهرتز است و مانند HSE و HSI دقیق نیست. هم‌چنین تقسیم کننده‌های کلاک/ پیمایشگرها در نقاط مختلف به منظور اندازه‌گیری کلاک‌ها وجود دارد. به طور عمده به دو پیمایشگر، پیمایشگر HSI و تقسیم کننده CPU نیاز داریم. Peripherals به طور مستقیم توسط منبع کلاک اصلی تأمین می‌شود. به علاوه یک پین خروجی برای کلاک  (CCO) وجود دارد که فرکانس ساعت را به خروجی می‌دهد. از این می‌توان برای کلاک دیگر میکروها نیز استفاده کرد، برای دیگر آی سی‌های منطقی کلاک تولید می‌کند. هم‌چنین می‌تواند به عنوان یک نوسان‌ساز آزاد و یا آزمایشات عملکرد کلاک مورد استفاده قرار گیرد. یک حالت کلاک امنیتی fail-safe وجود دارد که باعث می‌شود در زمانی که HSE از کار افتاد به صورت خودکار HSI شروع به فعالیت کند.

کد زیر نشان می‌دهد چگونه CPU را با استفاده از HSI با کلاک 2 مگاهرتز راه اندازی کنید و کلاک 500 کیلو‌هرتز را روی پین CCO به عنوان خروجی داشته باشیم. HSE به 8 تقسیم شده است، یعنی 16 مگاهرتز تقسیم بر 8 برابر 2 مگاهرتز شده است. این 2 مگاهرتز منبع کلاک اصلی است و 4 مرتبه دیگر تقسیم شده است تا فرکانس 500 کیلوهرتز را تولید کند.

#include "stm8s.h"

/******************************************************************************/
void CLK_Config(void)
{
  CLK_DeInit();                 
  CLK_HSECmd(DISABLE);
  CLK_LSICmd(DISABLE);
  CLK_HSICmd(ENABLE);
  while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);
                                
  CLK_ClockSwitchCmd(ENABLE);
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);
  CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4);
                                
  CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, 
  DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);
                                
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);
                                
  CLK_CCOConfig(CLK_OUTPUT_CPU);
  CLK_CCOCmd(ENABLE);
  while(CLK_GetFlagStatus(CLK_FLAG_CCORDY) == FALSE)
}
/******************************************************************************/
int main( void )
{
  CLK_Config();  
  while(1)
  {
  }
}



/******************************************************************************/
#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(u8* file, u32 line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

در قسمتی از کد های بالا یعنی تابع void CLK_Config(void) تنظیمات مربوط به کلاک انجام شده که به توضیح آنها می پردازیم.

 CLK_DeInit();     

کد بالا تنظیمات را مربوط به کلاک را به حالت ککارخانه ای بر می گرداند.

  CLK_HSECmd(DISABLE);
  CLK_LSICmd(DISABLE);
CLK_HSICmd(ENABLE);

کد های بالا حالت هایHSE و LSI را غیره فعال می کند و حالت HSI را فعال می نماید.بقیه کد نحوه اینکه CPU را با استفاده از HSI با کلاک 2 مگاهرتز راه اندازی کنید( CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8)) و کلاک 500 کیلو‌هرتز را روی پین CCO به عنوان خروجی داشته باشیم( CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4) ).

 HSE به 8 تقسیم شده است، یعنی 16 مگاهرتز تقسیم بر 8 برابر 2 مگاهرتز شده است. این 2 مگاهرتز منبع کلاک اصلی است و 4 مرتبه دیگر تقسیم شده است تا فرکانس 500 کیلوهرتز را تولید کند.

پیکربندی CCO به صورت توسط برنامه های زیر در برنامه گفته شده انجام میگردد.

CLK_CCOConfig(CLK_OUTPUT_CPU);
CLK_CCOCmd(ENABLE);
while(CLK_GetFlagStatus(CLK_FLAG_CCORDY) == FALSE);

حال برنامه را بر روی میکرو ریخته و با اسکوپ شکل موج خروجی را ببینید.

دیگر تنظیمات کلاک را در پروژه های بعدی همزمان با موضوع مربوطه توضیح خواهیم داد.

0 دیدگاه ها

پاسخی بگذارید