اطلاعیه

Collapse
No announcement yet.

تعریف ارای و هنگ کردن برنامه stm32f103vet6

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

    تعریف ارای و هنگ کردن برنامه stm32f103vet6

    وقت بخیر

    در یک پروزه در کیل 511 که اخیرا تهیه کردم از ماجول های زیر استفاده شده !! وقتی ارای تعریف میکنم ( 4 عضو ) با دانلود پروژه در کنتروللر ! هنگ میکند و اجرا نمیشود !!! بنظرتون مشکل ار کجاست !

    کد:
    #include "stm32f10x_adc.h"
    #include "stm32f10x_dma.h"
    #include "stm32f10x_fsmc.h"
    #include "stm32f10x_gpio.h"
    #include "stm32f10x_rcc.h"
    #include "stm32f10x_tim.h"
    #include "stm32f10x_usart.h"

    #2
    پاسخ : تعریف ارای و هنگ کردن برنامه stm32f103vet6

    بیشتر توضیح بده!
    راه اندازی enc28j60 و enc424j600 برای RL-TCPnet

    راه اندازیks0108 با emwin

    راه اندازی lcd7 اینچ با داریور داخلی stm32f429

    دیدگاه


      #3
      پاسخ : تعریف ارای و هنگ کردن برنامه stm32f103vet6

      وقت بخیر

      ممنون

      برنامه شامل کنتروللر tft 7 و نمایش متغییر هاست و یک تایم اینتراپت با زمان 10 میلی ثانیه که بخوبی کار میکنه !
      به پروژه برنامه adc , dma رو اضافه کردم روی پایه pc0 و adc1 که اونم بخوبی کار میکنه و پایداره !

      برای اصلاح نمونه گیری و متوسط گیری یک آرایه buf[4 تعریف کردم ! وقتی اعضای ارایه رو استفاده میکنم یا حتی مقدار میدم برنامه رو کنتروللر هنگ میکنه و اجرا نمیشه ولی وقتی مقدار دهی اریه رو تو برنامه کامنت کنم برنامه درست کار میکنه !!
      برای تعریق آرایه چیزی باید منظور بشه ! البته کمپایلر هیچ خطایی نمیده !

      کد:
      unsigned char buf[4]={0,0,0,0};
      کد:
      //start of adc init
      
      volatile uint16_t ADCConvertedValue;
      unsigned char buf[4]={0,0,0,0};
      uint16_t AD_value;
      
      #define ADC1_DR_Address  ((uint32_t)0x4001244C) 			//¶¨Òå¶ÔÓ¦µÄADC1µØÖ·
      
      void Init_ADC(void)
      {
      	GPIO_InitTypeDef GPIO_InitStructure;							//¶¨ÒåGPIO³õʼ»¯½á¹¹Ìå
      	ADC_InitTypeDef ADC_InitStructure;								//¶¨ÒåADC³õʼ»¯½á¹¹Ìå
      	DMA_InitTypeDef DMA_InitStructure;								//¶¨ÒåDMA³õʼ»¯½á¹¹Ìå
      
      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);			//ʹÄܸ÷¸ö¶Ë¿ÚʱÖÓ£¬ÖØÒª£¡£¡£¡
      	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	 			//ʹÄÜDMA1ʱÖÓ
      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);			//ʹÄÜADC1ʱÖÓ
      		
      //	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;						//½«ÍⲿADÊäÈë¹Ò½Óµ½5Òý½ÅÉÏ
      	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;						//½«ÍⲿADÊäÈë¹Ò½Óµ½5Òý½ÅÉÏ
      	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;					//ÉèÖÃPC5Òý½ÅΪģÄâÊäÈë
      	GPIO_Init(GPIOC, &GPIO_InitStructure);							//¸ù¾Ý²ÎÊýÅäÖÃGPIOC¶Ë¿Ú
      
       	DMA_DeInit(DMA1_Channel1);
       	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;		//¶¨ÒåDMAÍâÉè»ùµØַΪADC1
       	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue;	//¶¨ÒåDMAÄÚ´æ»ùµØÖ·
       	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;				//ÍâÉèADC1×÷ΪÊý¾Ý´«ÊäµÄÀ´Ô´
       	DMA_InitStructure.DMA_BufferSize = 1;							//¶¨ÒåÖ¸¶¨DMAͨµÀµÄDMA»º´æµÄ´óС
       	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉèµØÖ·¼Ä´æÆ÷²»±ä
       	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;		//ÄÚ´æµØÖ·¼Ä´æÆ÷²»±ä
       	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
       	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
       	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;					//¹¤×÷ÔÚÑ­»·»º´æģʽ
       	DMA_InitStructure.DMA_Priority = DMA_Priority_High;				//DMAͨµÀ1ÓµÓиßÓÅÏȼ¶
       	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;					//DMAͨµÀ1ûÓÐÉèÖÃΪÄÚ´æµ½ÄÚ´æ´«Êä
       	DMA_Init(DMA1_Channel1, &DMA_InitStructure);					//¸ù¾Ý²ÎÊý³õʼ»¯DMA¼Ä´æÆ÷
       
       	DMA_Cmd(DMA1_Channel1, ENABLE);									//ʹÄÜDMAͨµÀ1
        
       	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;				//¶ÀÁ¢¹¤×÷ģʽ
       	ADC_InitStructure.ADC_ScanConvMode = ENABLE;					//ɨÃèģʽ
       	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;				//Á¬Ðøת»»Ä£Ê½
       	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
       	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;			//ÓÒ¶ÔÆë
       	ADC_InitStructure.ADC_NbrOfChannel = 1;							//ÉèÖÃת»»ÐòÁ㤶ÈΪ1
       	ADC_Init(ADC1, &ADC_InitStructure);								//¸ù¾Ý²ÎÊý³õʼ»¯ADC1¼Ä´æÆ÷
      
      // 	ADC_RegularChannelConfig(ADC1,ADC_Channel_15, 1, ADC_SampleTime_55Cycles5);
       	ADC_RegularChannelConfig(ADC1,ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
      																	//²ÉÑùʱ¼äµÈÓÚ 55.5 ÖÜÆÚ
       	ADC_DMACmd(ADC1, ENABLE);										//ʹÄÜ ADC1 DMA ÇëÇó
       
       	ADC_Cmd(ADC1, ENABLE);											//ʹÄÜADC1
      																	
       	ADC_ResetCalibration(ADC1);										//ÖØÖÃÖ¸¶¨µÄADCµÄУ׼¼Ä´æÆ÷ 
      
       	while(ADC_GetResetCalibrationStatus(ADC1));						//»ñÈ¡ADCÖØÖÃУ׼¼Ä´æÆ÷µÄ״̬
      
       	ADC_StartCalibration(ADC1);										//¿ªÊ¼Ö¸¶¨ADCµÄУ׼״̬
       	while(ADC_GetCalibrationStatus(ADC1));							//»ñÈ¡Ö¸¶¨ADCµÄУ׼״̬
         
       	ADC_SoftwareStartConvCmd(ADC1, ENABLE);							//ʹÄÜADC1Èí¼þת»»
      }
      //end of adc init
      
      
      void TIM2_IRQHandler(void)
      {
      	TIM_ClearITPendingBit(TIM2, TIM_IT_Update);    	//Çå³þÖжϹÒÆðλ
      
       if(--milcnt==0){
       //------------------------------ 
        milcnt=10; //every 100ms
        cnt++;
        LED1=~LED1;				//ÒÔ1SµÄÖÜÆÚÉÁ˸
      
        LCD_ShowChar4(20,12,cnt, YELLOW, BLACK);
      	
      		AD_value=ADC_GetConversionValue(ADC1);
      
      		//	buf[0]=12;	 (کامنت برداشته بشه )
      
      		LCD_Shownum4d2(30,12,AD_value, YELLOW, BLACK);
      		LCD_Showhex4d2(35,12,AD_value, YELLOW, BLACK);
      	
      		if(--seccnt==0){
        //---------------------------------- 
        seccnt=10; //every 1sec
      //  ccc++;
        LED2 =~LED2;									//ÒÔ0.5ÃëµÃÖÜÆÚÉÁ˸
      
       } 
       } 
      }

      دیدگاه


        #4
        پاسخ : تعریف ارای و هنگ کردن برنامه stm32f103vet6

        وقت بخیر

        کمی وارد جزییات شدم با debug !! اتفاقی که میفته این هست که یک متغییر unsigned char i تعریف کردم ! فقط تعریف بدون بکار گرفتن ! برنامه خوب کار کرد ! حالا char رو به int تغییر دادم !! برنامه هنگ کرد !! debug برنامه رو چک کردم در قسمت lcd_init وقتی فانکشن
        l
        کد:
        LCD_WR_DATA(0x0023)
        اجرا میشه موقع برگشت از فانکشن کلیه رحیسترهای RCC بهم میریزه !! و برنامه به جای نامشخص پرش میکنه !!

        علت این اتفاق و راه حل رفع این اشکال رو نمیدونم چی هست !!؟؟ ممنون میشم راهنمایی کنید !!!

        دیدگاه


          #5
          پاسخ : تعریف ارای و هنگ کردن برنامه stm32f103vet6

          وقت بخیر

          برای خودم هم جالب بود با تغییر محل فانکشن های Init ظارا مشکل حل شد و هنگ ندارم

          کد:
          //old
          	SystemInit();
          	Init_LED();
          	Init_NVIC();	
          	Init_TIMER();				//¶¨Ê±Æ÷³õʼ»¯
          	Usart_Configuration(115200);
          	LCD_Init();
          //new
          	SystemInit();
          	LCD_Init();
          	Init_LED();
          	Init_TIMER();				//¶¨Ê±Æ÷³õʼ»¯
          	Usart_Configuration(115200);
          	Init_ADC();
          LCD_Init از آخر ، به بعد از SystemInit منتقل شد !!

          دیدگاه


            #6
            پاسخ : تعریف ارای و هنگ کردن برنامه stm32f103vet6

            سلام.
            یه نکته مهم این هست که تعریف آرایه در حقیقت یعنی کار کردن با اشاره گر ها و کار با اشاره گر ها بلقوه میتونه سبب این مشکلات بشه. این مشکلی که شما گفتید شاید به دلیل تداخل در حافظه باشه اگه از حافظه زیاد استفاده نکردید و مشکلی از این دست ممکنه پیش بیاد.

            یه تجربه دیگه که خودم دارم این بود که توی یه تابع یه متغیر 8 بیتی تعریف کرده بودم ولی شمارشی که انجام می دادم بیشتر از 255 بود این سبب می شد که موقع برگشت از تابع به آدرس غیر از آدرسی که انتظار میرفت پرش کنه.

            به نظر من هم مشکل ظاهرا حل شده است احتمالا اگه یه مقدار کد تغییر کنه مجددا خودش رو نشون خواهد داد.

            موفق باشید.
            شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
            هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
            چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

            دیدگاه


              #7
              پاسخ : پاسخ : تعریف ارای و هنگ کردن برنامه stm32f103vet6

              نوشته اصلی توسط محمد نحوی
              سلام.
              یه نکته مهم این هست که تعریف آرایه در حقیقت یعنی کار کردن با اشاره گر ها و کار با اشاره گر ها بلقوه میتونه سبب این مشکلات بشه. این مشکلی که شما گفتید شاید به دلیل تداخل در حافظه باشه اگه از حافظه زیاد استفاده نکردید و مشکلی از این دست ممکنه پیش بیاد.

              یه تجربه دیگه که خودم دارم این بود که توی یه تابع یه متغیر 8 بیتی تعریف کرده بودم ولی شمارشی که انجام می دادم بیشتر از 255 بود این سبب می شد که موقع برگشت از تابع به آدرس غیر از آدرسی که انتظار میرفت پرش کنه.

              به نظر من هم مشکل ظاهرا حل شده است احتمالا اگه یه مقدار کد تغییر کنه مجددا خودش رو نشون خواهد داد.

              موفق باشید.
              به نظرتون راه جلوگیری از این مشکل چیه ؟ یعنی اگر همین کد تغییر داده شود، دوباره اتفاقات سابق نیفتد؟
              راه کلی و اصولی برای تعریف متغیرهای آرایه ای به طوری که موجب این اتفاقات نشوند چیست ؟
              ممنون.
              ---------
              .
              .
              ...........

              دیدگاه


                #8
                پاسخ : تعریف ارای و هنگ کردن برنامه stm32f103vet6

                راه حل حرفه ای و تقریبا نهایی که در دنیای برنامه نویسی برای اینکار انجام میشه تحلیل برنامه یا مهندسی نرم افزار هست. یعنی قبل از کد نویسی تمامی حالات خطا رو استخراج می کنن روند و نقشه کلاس ها و ارث بری اونها و ... رو تعیین می کنن که به اینکار میگن تحلیل برنامه. بعد از تحلیل برنامه شروع به کد نویسی می کنن و در این شرایط چون تمامی حالات و خطاها در حد ممکن در نظر گرفته شده کد از ابتدا اصولی و دقیق نوشته میشه و احتمال چنین خطاهایی کمتر میشه.

                ولی تجربه فرد کدنویس هم خیلی موثره. حتی اگه تحلیل برنامه رو انجام داده باشیم ولی با این حال کد نویس بی دقتی بکنه ممکنه مشکلاتی از این دست باز هم پیش بیاد.

                اگه دوستان برنامه نویس این سوال رو پاسخ بدن، پاسخ دقیق تر و قابل اطمینان تری هست به هر حال بنده مطالعات پراکنده ای در این زمینه داشتم.
                موفق باشید
                شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
                هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
                چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

                دیدگاه


                  #9
                  پاسخ : تعریف ارای و هنگ کردن برنامه stm32f103vet6

                  مشکلش خیلی ساده ست

                  این خط از کد اشتباهه

                  کد:
                  unsigned char buf[4]={0,0,0,0};
                  کافیه بنویسید

                  کد:
                  unsigned char buf[4]={0};

                  دیدگاه

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