اطلاعیه

Collapse
No announcement yet.

کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

    سلام
    یه سوال درباره تایمر:
    کوچکترین زمان تولید شده با استفاده از تایمر STM32F103 چه مقدار می تواند باشد؟
    آیا می توان با فرکانس 72MHZ توسط تایمر شماره دو این میکرو به زمان 100nS (ایجاد اینتراپت و یا Toggle شدن یک پین) دست یافت.
    من دنبال این هستم تا روی یه پین فرکانس 10MHZ رو داشته باشم. کریستال متصل به میکرو 8MHZ است.
    با استفاده از PLL داخلی فرکانس 72MHZ تولید شده و بروی پین MCO قابل رویت است. تنظیمات AHB و APB نیز به درستی انجام شده است.
    ولی فرکانس تولید شده در حالتهای مختلف کاری از 289KHZ بیشتر نمی شه. آیا محدودیتی برای کار تایمر وجود داره؟
    :angry:
    فکر آن باشد که بگشاید رهی

    #2
    پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

    تایمر 2 روی APB1 هستش که ماکسیمم فرکانس این باس 36 مگاهرتز هستش. اون باس APB2 هستش که فول اسپید هستش(72 مگاهرتز).
    منظور شما رو از ایجاد اینتراپت نمی فهمم؟
    اگه این 10 مگاهرتز رو فقط می خوایید فکر نمیکنم مشکلی باشه.
    می خوایید کدتون رو بذارید تا ببینیم.
    یه مقدار هم بیشتر توضیح بدید که چیکار می خوایید بکنید.


    اگه خوب توضیح ندید جواب نمیگیرید.

    دیدگاه


      #3
      پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

      این برنامه ای که نوشتم الان داره کار می کنه ولی با مشکلاتی همراهه!
      کد:
      int main(void)
      {
      	ClkInitCPU ();
      	Timer_IO_Config();
          Timer_NVIC_Configuration();	
      	Timer_Configuration();
      
       while (1)
      	{
      		
      	}
      }
      
      /*===========================================================================*/
      void ClkInitCPU (void)
      {
        static __IO ErrorStatus HSEStartUpStatus = SUCCESS;
        /* RCC system reset(for debug purpose) */
       RCC_DeInit();
      
       /* Enable HSE */
       RCC_HSEConfig(RCC_HSE_ON);
      
       /* Wait till HSE is ready */
       HSEStartUpStatus = RCC_WaitForHSEStartUp();
      
       if(HSEStartUpStatus == SUCCESS)
       {
        /* Enable Prefetch Buffer */
        //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
      
        /* Flash 2 wait state */
        //FLASH_SetLatency(FLASH_Latency_2);
       	
        /* HCLK = SYSCLK */
        RCC_HCLKConfig(RCC_SYSCLK_Div1); 
       
        /* PCLK2 = HCLK */
        RCC_PCLK2Config(RCC_HCLK_Div1); 
      
        /* PCLK1 = HCLK/2 */
        RCC_PCLK1Config(RCC_HCLK_Div2);
      
        /* PLLCLK = 8MHz * 9 = 72 MHz */
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
      
        /* Enable PLL */ 
        RCC_PLLCmd(ENABLE);
      
        /* Wait till PLL is ready */
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }
      
        /* Select PLL as system clock source */
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
      
        /* Wait till PLL is used as system clock source */
        while(RCC_GetSYSCLKSource() != 0x08)
        {
        }
       }
      }
      
      /*===========================================================================*/
      void Timer_IO_Config(void)
      {
       GPIO_InitTypeDef GPIO_InitStructure;
       
       RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE); 						 
      	
       //GPIOC Configuration:Pin6 as alternate function push-pull
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOC, &GPIO_InitStructure);
      	
       /* Output system clock on MCO pin ---------------------------------------------*/
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
      
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOA, &GPIO_InitStructure);
       RCC_MCOConfig(RCC_MCO_SYSCLK);
      }
      
      /*===========================================================================*/
      void Timer_NVIC_Configuration(void)
      {
       NVIC_InitTypeDef NVIC_InitStructure; 
       /* Enable the TIM2 global Interrupt */
       NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	 
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       NVIC_Init(&NVIC_InitStructure);
      }
      
      /*===========================================================================*/
      void Timer_Configuration(void)
      {
       TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
      	
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
      	
       /* Time base configuration */
      //*****************************************************************************
       TIM_TimeBaseStructure.TIM_Period=3600;		//3600/36000000 = 100 uS
      //TIM_TimeBaseStructure.TIM_Period=360;			// 360/36000000 = 10 uS
      //TIM_TimeBaseStructure.TIM_Period=36;		 	// 36/36000000 =  1 uS
      //*****************************************************************************	
       TIM_TimeBaseStructure.TIM_Prescaler= 0;			//36MHZ/(0+1) = 36MHZ
       TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1;
      	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
       TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
      	
       TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
       /* TIM2 enable counter */
       TIM_Cmd(TIM2, ENABLE);	
      
       /* TIM IT enable */
       TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
      }
      /*===========================================================================*/



      همونطور که گفتم کلاک 72MHZ روی پین MCO رویت می شه.
      با انتخاب TIM_Period=3600 روی پین PC6 سیگنال با فرکانس 100uS دریافت می شه.
      با انتخاب TIM_Period = 360 روی پین PC6 سیگنال با فرکانس 10uS دریافت می شه.
      با انتخاب TIM_Period = 36 روی پین PC6 سیگنال ناپایدار بوده و دارای Jitter است.
      حالا اگه بخواهیم به فرکانس در حد مثلا 200 نانو ثانیه دسترسی پیدا کنیم وضع از این هم بدتر می شه.
      من قبلا روی AVR این کارو انجام دادم مثلا با کریستال 8MHZ تونستم فرکانس 4MHZ رو روی پین OC0 بگیرم ولی با ARM تا حالا که موفق نشدم.
      امیدوارم تونسته باشم مشکل رو درست توضیح بدم. بازم یادآوری می کنم سیگنال ها رو عملا با اسکوپ دارم میگیرم. :cry:


      فکر آن باشد که بگشاید رهی

      دیدگاه


        #4
        پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

        بعیده اینطوری باشه. شما با نصف فرکانس CPU می تونید بشمارید. مثلاً با 60MHz برای CPU می تونید 30MHz بدید به APB1 و اگه ARR رو مساویِ 2 قرار بدید، راحت یه شکل موج 10MHz توی خروجی PWM یا OC خواهید داشت.
        توصبه می کنم به جای OC، از PWM استفاده کنید شاید اتفاق خاصی بیافته.
        بیایید با Google آشتی کنیم!

        دیدگاه


          #5
          پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

          شما تنظیمات پین ها رو درست انجام دادید؟ مال شما 64 پین هستش؟
          اگه تنظیمات پین های شما پین شماره 6 مربوط به C و شماره 8 مربوط به A باشه و یه نگاهی توی دیتاشیت بندازیم اینو می بینم:




          کو پین واسه تایمر 2؟ oo:
          در بعد، اگه به این توجه هم بکنید بد نیست:



          دیدگاه


            #6
            پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

            کو پین واسه تایمر 2؟ oo:
            آی سی مورد استفاده 100 پایه است.
            تو تابع Timer_IO_Config پایه PA8 به عنوان MCO و پایه PC6 به عنوان یک پایه خروجی معمولی استفاده شده.
            PA8 کلاک مورد استفاده رو بیرون می فرسته که با اسکوپ 72MHZ رو نشون می ده.
            PC6 هم پایه ای که توسط اینتراپت روتین تایمر مرتبا Toggle می شه.
            یادآوری : سیگنال ها رو عملا با اسکوپ دارم میگیرم. !!!
            با انتخاب TIM_Period=3600 روی پین PC6 سیگنال با فرکانس 100uS دریافت می شه.
            با انتخاب TIM_Period = 360 روی پین PC6 سیگنال با فرکانس 10uS دریافت می شه.
            با انتخاب TIM_Period = 36 روی پین PC6 سیگنال ناپایدار بوده و دارای Jitter است.
            اینم روتین اینتراپت تایمر شماره دو (هر بار که رخ می ده وضعیت پین PC6 تغییر می کنه):

            کد:
            void TIM2_IRQHandler(void)
            {
              static uint8_t Toggle;
              if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
              {
            
            	if( Toggle ) 
            	  { 
            		 GPIO_SetBits(GPIOC , GPIO_Pin_6);
            	  } 
            	  else 
            	  { 
            		 GPIO_ResetBits(GPIOC , GPIO_Pin_6);
            	  }
            	  Toggle = ~Toggle;  
              
              TIM_ClearITPendingBit(TIM2, TIM_IT_Update);		 
              }
            }

            فکر آن باشد که بگشاید رهی

            دیدگاه


              #7
              پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

              آخه من هر چی نگاه میکنم انگار شما اشتباه تنظیم کردید. کانال های تایمر 2 روی پورت A هستن. اینم نشونش:



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



              اون PC6 هم اون پینی هستش که شما لازم دارید. درسته؟

              دیدگاه


                #8
                پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

                دوست عزیز
                همونطور که مطلعید تایمرها رو می شه به روش های مختلف پیکره بندی کرد.
                تو برنامه ای که من نوشتم و اون بالا هم دیده می شه از کانال های مورد اشاره شما استفاده نشده و در عوض من از اینتراپت تایمر 2 استفاده کردم و پین PC6 رو که قبلا به عنوان IO خروجی تعریف کردم توی زیر برنامه اینتراپت Toggle می کنم.
                این برنامه تا 10us با دقت خوبی کار می کنه ولی با کمتر شدن زمان مشکلاتی که توضیح دادم بوجود میاد و من نمیدونم چرا اینطور می شه.
                شاید دلیلش این باشه که سرعت بروز وقفه تو این حالت سریع تر از اجرای بدنه برنامه اینتراپت می شه یعنی بدنه برنامه اینتراپت هنوز به آخر نرسیده که اینتراپت جدید از راه می رسه
                البته مطمئن نیستم چون سرعت اجرای برنامه با کلاک 72MHZ باید هماهنگ باشه و این خیلی سریعتر از 1uS هست. :rolleyes:
                فکر آن باشد که بگشاید رهی

                دیدگاه


                  #9
                  پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

                  نوشته اصلی توسط arya1348
                  شاید دلیلش این باشه که سرعت بروز وقفه تو این حالت سریع تر از اجرای بدنه برنامه اینتراپت می شه یعنی بدنه برنامه اینتراپت هنوز به آخر نرسیده که اینتراپت جدید از راه می رسه
                  البته مطمئن نیستم چون سرعت اجرای برنامه با کلاک 72MHZ باید هماهنگ باشه و این خیلی سریعتر از 1uS هست. :rolleyes:
                  خو همینه دیگه. وقفه که سرعت اجراش اونقدرا نیست که. خیلی هنر بکنه بشه یکی دو مگاهرتز.
                  بیایید با Google آشتی کنیم!

                  دیدگاه


                    #10
                    پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

                    نوشته اصلی توسط arya1348
                    دوست عزیز
                    همونطور که مطلعید تایمرها رو می شه به روش های مختلف پیکره بندی کرد.
                    تو برنامه ای که من نوشتم و اون بالا هم دیده می شه از کانال های مورد اشاره شما استفاده نشده و در عوض من از اینتراپت تایمر 2 استفاده کردم و پین PC6 رو که قبلا به عنوان IO خروجی تعریف کردم توی زیر برنامه اینتراپت Toggle می کنم.
                    این برنامه تا 10us با دقت خوبی کار می کنه ولی با کمتر شدن زمان مشکلاتی که توضیح دادم بوجود میاد و من نمیدونم چرا اینطور می شه.
                    شاید دلیلش این باشه که سرعت بروز وقفه تو این حالت سریع تر از اجرای بدنه برنامه اینتراپت می شه یعنی بدنه برنامه اینتراپت هنوز به آخر نرسیده که اینتراپت جدید از راه می رسه
                    البته مطمئن نیستم چون سرعت اجرای برنامه با کلاک 72MHZ باید هماهنگ باشه و این خیلی سریعتر از 1uS هست. :rolleyes:
                    می خوای خب پس روتین وقفه رو بهینه کنیم؟
                    مثلا Toggle رو بیرون تعریف کن(گلوبال).
                    برای ست کردن و رست کردن پین ها شاید اگه روی ریجسترشون مستقیم بنویسی بهتر باشه.
                    من با CMSIS کار نمی کنم. ببین اون 2 تا API چیکار میکنن، همونجا توی روتین وقفه بذارشون(تا جای ممکن بهینه شون بکن).

                    دیدگاه


                      #11
                      پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

                      خو همینه دیگه. وقفه که سرعت اجراش اونقدرا نیست که. خیلی هنر بکنه بشه یکی دو مگاهرتز.
                      اگه به کدهای داخل روتین وقفه توجه کنید می بینید که از دستورات کمی تشکیل شده و هیچ برنامه تاخیری تو اونجا وجود نداره.
                      روال برنامه پس از واردشدن به روتین وقفه چند تا دستور ساده رو اجرا می کنه و به سرعت از اونجا خارج می شه
                      این میکروکنترلر ها Throughput بالایی دارن. و برای فرکانس 72MHZ چیزی در حدود 90 MIPS می شه. (72MHz or 90 MIPS)
                      در هر صورت بعید می دونم اجرای برنامه وقفه اینقدر طول بکشه که وقفه جدید به سرعت از راه برسه
                      فکر آن باشد که بگشاید رهی

                      دیدگاه


                        #12
                        پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

                        نوشته اصلی توسط arya1348
                        اگه به کدهای داخل روتین وقفه توجه کنید می بینید که از دستورات کمی تشکیل شده و هیچ برنامه تاخیری تو اونجا وجود نداره.
                        روال برنامه پس از واردشدن به روتین وقفه چند تا دستور ساده رو اجرا می کنه و به سرعت از اونجا خارج می شه
                        این میکروکنترلر ها Throughput بالایی دارن. و برای فرکانس 72MHZ چیزی در حدود 90 MIPS می شه. (72MHz or 90 MIPS)
                        در هر صورت بعید می دونم اجرای برنامه وقفه اینقدر طول بکشه که وقفه جدید به سرعت از راه برسه
                        یه نکته ای رو از قلم انداختید. اونم اینه که، کد نویسیِ شما به زبان اسمبلی نیست، یه زبانِ C اِ و کامپایلر در تبدیل کدِ شما (فقط چند تا دستورالعمل ساده) به اسمبلی خیلی هم کارآمد به نظر نمی رسه چون باید حواسش به همه منابع داخل پردازنده باشه و همه جوره مراقب پشته و رجیسترهای وضعیت باشه.
                        مخلص کلام اینکه، 2-3 خط کد به زبان C توی روتین وقفه، معمولاً معادل 20-30 خط کد اسمبلی میشه که باز هم معمولاً همه شون در یک کلاک اجرا نمی شن. مخصوصاً اگه یه تابع دیگه رو توی وقفه صدا بزنید که دیگه واویلــــا میشه. اگه می خواید مطمئن بشید فایل .list رو با دقت نگاه کنید...
                        بیایید با Google آشتی کنیم!

                        دیدگاه


                          #13
                          پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

                          مخلص کلام اینکه، 2-3 خط کد به زبان C توی روتین وقفه، معمولاً معادل 20-30 خط کد اسمبلی میشه که باز هم معمولاً همه شون در یک کلاک اجرا نمی شن. مخصوصاً اگه یه تابع دیگه رو توی وقفه صدا بزنید که دیگه واویلــــا میشه.
                          فرمایش شما کاملا درسته. با فرض اینکه کل روتین وقفه فقط 30 کلاک برای اجرا ببره و در صورتیکه ما زمان وقوع وقفه رو 1uS تعیین کرده باشیم، در این صورت در یک ثانیه پردازنده باید 30 میلیون دستورالعمل رو اجرا کنه (اگه خوشبین باشیم که هر دستور 1 کلاک می بره)
                          با انتخاب TIM_Period = 36 روی پین PC6 سیگنال ناپایدار بوده و دارای Jitter است و معنی اش اینه که روتین وقفه بیش از 90 کلاک برای اجرا نیاز داره (راستش هنوز به این وضعیت مشکوکم. شاید تخصیص کلاک برای اجرای دستورات با حداکثر سرعت به یه سری تنظیمات نیاز داشته باشه، این فقط یه حدسه)
                          در هر صورت نتیجه میگیرم که این روش تولید سیگنال کاملا ناکارآمده و کلی از منابع میکرو رو به خودش اختصاص میده.
                          من قبلا این کارو با AVR انجام دادم ولی روتین وقفه رو درگیر این ماجرا نکرده بودم. اونجا از قابلیت Output Compare Match استفاده کرده بودم و سخت افزار تایمر میکرو به صورت خودکار پین رو Toggle میکرد.
                          فکر کنم اینجا هم باید همین کار رو انجام بدم.
                          وقتی برنامه رو نوشتم و تست کردم نتیجه رو همین جا میارم. به هر حال ممنونم که حوصله به خرج دادید و بحث رو دنبال کردید. :agree:
                          فکر آن باشد که بگشاید رهی

                          دیدگاه


                            #14
                            پاسخ : کوچکترین زمان تولید شده با استفاده از تایمر STM32F103

                            من با تایمرهای STM32 خیلی ور رفتم. کلاً پیچیده س!
                            یه کاری می گم انجام بده. البته اگه با Keil کار می کنی. به نظرم مشکل از مقسم، Prescaler، کلاک APBها یا چیزایی این شکلی باشه. تو مد شبیه سازی Keil می تونی همه کلاک ها رو ببینی. حتی وضعیت لحظه به لحظه ادوات جانبی مثل تایمر. با اجرای دیباگ برنامه ت به سادگی می تونی بفهمی قضیه از چه قراره.
                            بیایید با Google آشتی کنیم!

                            دیدگاه


                              #15
                              پاسخ : کوچکترین زمان تولید شده با استفاده از

                              برنامه رو تغییر دادم و با استفاده از قابلیت ایجاد سیگنال PWM ، فرکانس 1MHZ رو تولید کردم.(بدون استفاده از روتین وقفه)
                              اگه TIM_Period=71 باشه فرکانس 1MHZ رو روی پین PC6 خواهیم داشت. باکمتر شدن این عدد به فرکانس های بالاتری دست پیدا می کنیم.(من تا 25MHZ رو ایجاد کردم) :job: :wow:
                              اینم کد نوشته شده:

                              کد:
                              int main(void)
                              {
                              	ClkInitCPU ();
                              	Timer_IO_Config();
                              	Timer_Configuration();
                              
                               while (1)
                              	{
                              		
                              	}
                              }
                              
                              /*===========================================================================*/
                              void ClkInitCPU (void)
                              {
                                static __IO ErrorStatus HSEStartUpStatus = SUCCESS;
                                /* RCC system reset(for debug purpose) */
                               RCC_DeInit();
                              
                               /* Enable HSE */
                               RCC_HSEConfig(RCC_HSE_ON);
                              
                               /* Wait till HSE is ready */
                               HSEStartUpStatus = RCC_WaitForHSEStartUp();
                              
                               if(HSEStartUpStatus == SUCCESS)
                               {
                                /* Enable Prefetch Buffer */
                                //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
                              
                                /* Flash 2 wait state */
                                //FLASH_SetLatency(FLASH_Latency_2);
                               	
                                /* HCLK = SYSCLK */
                                RCC_HCLKConfig(RCC_SYSCLK_Div1); 
                               
                                /* PCLK2 = HCLK */
                                RCC_PCLK2Config(RCC_HCLK_Div1); 
                              
                                /* PCLK1 = HCLK/2 */
                                RCC_PCLK1Config(RCC_HCLK_Div2);
                              
                                /* PLLCLK = 8MHz * 9 = 72 MHz */
                                RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
                              
                                /* Enable PLL */ 
                                RCC_PLLCmd(ENABLE);
                              
                                /* Wait till PLL is ready */
                                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
                                {
                                }
                              
                                /* Select PLL as system clock source */
                                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
                              
                                /* Wait till PLL is used as system clock source */
                                while(RCC_GetSYSCLKSource() != 0x08)
                                {
                                }
                               }
                              }
                              
                              /*===========================================================================*/
                              void Timer_IO_Config(void)
                              {
                               GPIO_InitTypeDef GPIO_InitStructure;
                              
                               RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
                               RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
                              	
                               /*GPIOB Configuration: TIM3 channel 1 */
                               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
                               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                              
                               GPIO_Init(GPIOC, &GPIO_InitStructure);
                              
                               GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);		
                              	
                               /* Output system clock on MCO pin ---------------------------------------------*/
                              //  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
                              
                              //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
                              //  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                              //  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                              //  GPIO_Init(GPIOA, &GPIO_InitStructure);
                              //  RCC_MCOConfig(RCC_MCO_SYSCLK);
                              }
                              /*===========================================================================*/
                              void Timer_Configuration(void)
                              {
                               	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
                               	TIM_OCInitTypeDef TIM_OCInitStructure;
                               /* TIM3 clock enable */
                               RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                              
                              	/* -----------------------------------------------------------------------
                                TIM3 Configuration: generate 1 PWM signals with 50% duty cycles:
                                The TIM3CLK frequency is set to SystemCoreClock (Hz), to get TIM3 counter
                                clock at 72 MHz the Prescaler is computed as following:
                                Prescaler = (TIM3CLK / TIM3 counter clock) - 1  : Prescaler = (72/72) - 1 = 0
                                SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density
                                and Connectivity line devices
                              
                                The TIM3 is running at 1 MHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1)
                                                       = 72 MHz / (71+1) = 1 MHz
                                TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = (36/72)* 100 = 50%
                               ----------------------------------------------------------------------- */
                                /* Time base configuration */
                               TIM_TimeBaseStructure.TIM_Period = 71;
                               TIM_TimeBaseStructure.TIM_Prescaler = 0;   //PrescalerValue;
                               TIM_TimeBaseStructure.TIM_ClockDivision = 0;
                               TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
                              
                               TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
                              
                               /* PWM1 Mode configuration: Channel1 */
                               TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
                               TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
                               TIM_OCInitStructure.TIM_Pulse = 36;					//CCR1_Val;
                               TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
                              
                               TIM_OC1Init(TIM3, &TIM_OCInitStructure);
                              
                               TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
                              
                               TIM_ARRPreloadConfig(TIM3, ENABLE);
                              
                               /* TIM3 enable counter */
                               TIM_Cmd(TIM3, ENABLE);
                              }
                              /*===========================================================================*/

                              خب از اول هدف من این نبود که با فرکانس بالا یه پین رو Toggle کنم. یه سیگنال خاصی قبلا با فرکانس 10MHZ یا 100nS نمونه برداری شده بود و اطلاعاتش توی حافظه موجود بود. من میخوام این سیگنال رو با استفاده از یه D/A باز سازی کنم. بنابراین به یه تایمینگ دقیق 100nS نیاز دارم تا اطلاعات رو از توی حافظه بخونم و روی D/A بفرستم. این کارو باید با استفاده از یه تایمر (برای ایجاد زمان بندی دقیق) انجام بدم و از روتین اینتراپت هم برای مراجعه به حافظه و خوندن اطلاعات و فرستادن این اطلاعات روی پورت و D/A استفاده کنم.
                              ظاهرا این میکرو توانایی انجام این کارو نداره. حالا باید برم سراغ سری STM32F4xx
                              اگه با اونم موفق نشم ، آخرش اینه که از یه FPGA استفاده کنم. :nerd:
                              دوستان اگه نظری دارید راهنمایی کنید
                              فکر آن باشد که بگشاید رهی

                              دیدگاه

                              لطفا صبر کنید...
                              X