Nikelec.ir آموزش الکترونیک و کامپیوتر

section-icon

انجمن ها

در مورد هر چیزی که می خواهید صحبت کنید!

خوش آمدید به

STDperiph_lib

در حال نمایش 4 نوشته (از کل 4)
  • نویسنده
    نوشته‌ها
  • سلام استاد
    توی قسمت راه اندازی GPIO با spl طبق آموزش شما پیش رفتم و کد رو نوشتم،
    MODER درست مقدار دهی شد
    OTYPER هم مقدار صفر داخلش ریخته شده و درسته.
    ولی داخل OSPEEDR مقدار 0x20 و در PUPDR مقدار 0x200 ریخته شده، شما گفتین اگه بهشون مقدار ندیم، مقدار پیش فرض که صفر هست داخلش ریخته میشه.
    وقتی مقدار دادم بهشون و روی حالت push pull و low speed گذاشتمشون، مقدارشون درست شد و صفر شد.
    مشکل از کجاست؟

    ;(GPIO_SetBits(GPIOA,GPIO_Pin_2

    ;(GPIO_ResetBits(GPIOA,GPIO_Pin_2
    اینا هم پین رو برام صفر و یک نمیکنن
    از طریق ODR صفر و یک میشن ولی از طریق اینا نمیشن.
    اینم بگم که روی بورد برنامه رو اجرا نکردم، توی شبیه ساز کیل اجرا کردم، برای همین مقدار رجیستر هارو میبینم.

    سلام وقت شما بخیر .
    دوتا مورد اولی اینکه دقیقه های 27 قسمت شش دقیق ترش و توضیح کامل این مورد دقیقه 33 قسمت شش و 49 قسمت شش 39 قسمت هشت دوباره ! قسمت 13 دقیقه 72 و….. بسیار جاهای دیگه در مورد مقدار پیش فرض رجیسترها توضیح دادم .البته شاید جاهای بیشتری هم گفته باشم فعلا در حد سریع دیدن اینجاهارو دیدم اما شما دقیقه 33 قسمت شش که قبل از این قسمت باشه رو اگر دیده و توجه کرده باشید تا آخر همین چیزی که میگم صادق هست پس همیشه حواستون باشه برا همین چندبار دیگه تکرارش کردم و با این چندبار تکرار دیگه خودتون این مورد براتون جا افتاده و تو بعضی رجیسترا که مثل همین رجیسترهایی که نام بردید نیار به توضیح خاصی روی مقدار ریست نداره پس وقت الکی سرش هدر نمیدیم و چون قبلا توضیح داده شده رد بررسی نمی کنیم دیگه این مورد .
    اما برای اینکه دوباره بگمش مقدار پیش فرضی که شما دارید به دوتا چیز بستگی داره یکی اینکه مقدار Reset Value چقدر هست که همون موردی میشه که تو دقیقه 33 قسمت شش براتون توضیحش دادم . مورد دیگه مقداری که هنگام Init کردن واحد جانبی بهش پاس میدیم که فیلد اون ساختاری هست که مقدارش میدید ( همون که تو آموزش مقدار میدیم فیلدهاش و بعد پاس میدیم به تابع Init ) مقادیر داخل رجیستر رو مشخص میکنه و اگر چیزی داخلش نریزید و پاس بدید مقدار پیش فرض های متغیرها و نوع های داده رو که داخل قسمت زبان C در موردشون توضیح دادم پاس میدید به تابع . پس اگر اصلا با اون رجیستر کاری نداشته باشید که مقدار Reset Value داخلش میشینه ( یا مقداری که کدهای از پیش تولید شده اگر نیاز بوده براتون داخلش میریزه که توضیح دادم تو آموزش )( یا مثلا پیکره بندی پایه های مربوط به پروگرم کردن چطور هست که اونم توضیح داده شده ،که باعث میشه مقدار صفر نباشه )
    ولی وقتی مثل شما با اون رجیستر کار داشته باشیم باید ببینی داده ای که داری پاس میدی به اون تابع برای پیکره بندی مقدار پیشفرض فیلدهاش چه مقدارهایی هست فرض کنیم شما اطلاع نداری مقادیر پیش فرض چقدر هست که می تونید با دیباگ کردن این مقادیر ببینید که البته شما هنوز به قسمت های مربوط به دیباگ کردن نرسیدید . پس ادامه بدید تا متوجه بشید چی دارم میگم .
    پس با مواردی که بالا گفته شد اول اینکه باید موقع پرسیدن سوال اطلاعات بیشتری داده بشه مثلا نوع میکرو رو مشخص کنید مورد دوم رجیستری که دارید مقدار میدید مربوط که کدام واحد جانبی هست مثلا ما توهمون قسمت شش اگر دقت کنید جایی که دارم در مورد GPIOx_MODER توضیح میدم ( دقیقه 50 )مقدار Reset value برای port های مختلف مقادیر متفاوتی داره که این می تونه چیزی غیر ازصفر باشه . ( که تو آموزش میبینیم هست )
    پس موارد گفته شده بالا رو چک کنید : یک مقدار فیلدهای ساختاری که دارید به تابع Init پاس میدید وقتی رفتید داخل تابع تو محیط دیباگ چک کنید ببینید چی دارید پاس میدید و آیا مقادیر همونی هست که شما میخواید باشه یا اونی که توقع دارید پیشفرض ساختار باشه نیست .و مقدار Reset Value اون رجیستر هایی که دارید مقدار میدید هم چک کنید که ببینید با مقادیری که شما داخلش دارید قبل از Init کردن و بعد از Init کردن چه تفاوتی داره . اینجوری متوجه مشکل میشید که از کجاست . و به جواب سوالتون میرسید .

    و در آخر مشکل اصلی که به باز به این سوالتون هم مربوط میشه مثلا وقتی میبینید تابعی که مطئن هستید باید کار کنه کار نمیکنه : مشکل اصلی اینه که شما Simulate می کنید یعنی اون کارایی که دارید انجام میدید اکثر موارد درست هست و مشکل بر میگرده به Simulate با توجه به سوالات قبلی که اگه اشتباه نکنم داخل تلگرام پرسیدید و گفتم اینجا مطرح کنید که فکر کنم چون حل شد دیگه مطرح نکردید و میخواستم همین رو بگم که بقیه هم در اطلاع باشند که Simulate نکنید حتی داخل خود انجمن St هم این میگه که دلیلش هم خودشون توضیح دادن که وقت کردم میذارم رو وبلاگ که ببینید چقدر مشکل این Simulate پیش میاره .و البته منم برای همین تو آموزش میگم روی برد تست کنید .البته جاهایی هم Simulate کردن مناسب هست که مطلبی در این مورد در وبلاگ ارائه میدم و کامل بررسی می کنم .

    avatar-image

    smsjzia

    @smsjzia

    مشارکت کننده

      سلام
      در راه اندازی usart با STDPeriph دو مدل کد میزنم یکی با کاراکتر معمولی و یا آرایه کاراکتری و یکی هم با اشاره گر به کاراکتر ولی کد اشاره گر کار نمینه.چرا؟

      کد با کاراکتر یا آرایه ای از کاراکترها:

      char charPrint[3];
      void USART1_IRQHandler(void){
      	charPrint = USART_ReceiveData(USART1);
      	USART_ClearFlag(USART1,USART_FLAG_RXNE);
      	USART_SendData(USART1,charPrint);
      } 

      کد با کاراکتر یا اشاره گر به کاراکتر:

      char* charPrint;
      void USART1_IRQHandler(void){
      	*charPrint = USART_ReceiveData(USART1);
      	USART_ClearFlag(USART1,USART_FLAG_RXNE);
      	USART_SendData(USART1,*charPrint);
      }

      به نظرتون مشکل کد دوم چیه که کار نمیکنه؟

      • این پاسخ 4 سال، 4 ماه پیش توسط avatar-image Admin ویرایش شده است.
      • این پاسخ 4 سال، 4 ماه پیش توسط avatar-image Admin ویرایش شده است.

      سلام وقتتون بخیر .
      داخل کد دوم که با اشاره گر کار کردید موقع صدا زدن تابع SendData دارید محتوای اشاره گر charPrint پاس میدید به تابع بجای اینکه خود اشاره گر پاس بدید ( در واقع این تابع از شما آدرس میخواد شما دارید محتوا میدید ) ( اون ستاره پشتش اضافه است )

    3

    صدا

    3

    پاسخ

    برچسب ها

    در حال نمایش 4 نوشته (از کل 4)
    • شما برای پاسخ به این موضوع باید وارد شوید.