اطلاعیه

Collapse
No announcement yet.

نکاتی پیرامون STM32 قسمت 1-آموزش پیرامون واچ داگ تایمر و Option Byte در STM32

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

    نکاتی پیرامون STM32 قسمت 1-آموزش پیرامون واچ داگ تایمر و Option Byte در STM32

    سلام دوستان
    دو سه روزی بود که به یک مشکلی برخورده بودم. BLINK را نوشته بودم که نمی توانستم زمان آن را از 200 میلی ثانیه بالاتر ببرم.
    سلام دوستان به یک مشکلی برخوردم چند روزی هست من رو اسیر و علاف خودش کرده :various_118: وقتی از تابع HAL_Delay در زمان های زیر 200 میلی ثانیه استفاده میکنم همه چیز درست پیش میره اما وقتی به زمان های بالای 500 میلی ثانیه میرسم بطور کلی برنامه بهم میخوره. اول به برنامه ام شک کردم، اما وقتی بایک تابع چشمک زن(BLINK) هم اومدم امتحان

    امروز راه حلش رو با دیباگ کردن پیدا کردم که مربوط به WDG در میکروکنترلر های ARM میشه که تقریبا منبع فارسی ندیدم در موردش صحبت کرده باشه، بنابراین قصد دارم کمی اینجا در این مورد صحبت کنم ، تا اگر دوستان به همچین مشکلی برخوردند، بدونند راه حلش چی هست .( مدیران محترم هم اگر خواستند تاپیک رو تگ کنید)
    میکروی که به عنوان مثال در مورد اون صحبت میکنیم STM32F103 هست.
    ***
    با توجه به دیتاشیت میکرو STM32F103 ما دو عدد واچ داگ تایمر داریم
    1- واچ داگ تایمر مستقل(
    Independent watchdog)
    این سگ نگهبان یک شمارنده 12 بیتی پایین شمار(DOWN COUNTER) هست که بصورت مستقل با کلاک 32 کیلوهرتزی که توسط RC داخلی خود میکرو کنترلر تولید شده کار میکنه و البته از کلاک اصلی خود تراشه یا به اصطلاح از Main'Clock تراشه مستقل هست یعنی شما چه فرکانس رو 1 مگاهرتز در نظر بگیرید چه 72 مگاهرتز این تایمر سگ نگهبان بدون توچه به کلاک میکرو دقیقا سر 128 میلی ثانیه میکرو رو ریست میکنه.
    2-واچ داگ تایمر تحت برنامه (Window watchdog)
    تایمر
    window watchdog یک شمارنده 7 بیتی پایین شمار(DOWN COUNTER) هست که از کلاک اصلی تراشه یا همون Main Clock استفاده میکنه، و میتونه توی مد Free Running فعالیت کنه و البته از طریق برنامه هم میتونید ریجسترش هاش رو دستکاری کنید.
    دیتا شیت:

    Independent watchdog
    The independent watchdog is based on a 12-bit downcounter and 8-bit prescaler. It is
    clocked from an independent 32 kHz internal RC and as it operates independently from the
    main clock, it can operate in Stop and Standby modes. It can be used either as a watchdog
    to reset the device when a problem occurs, or as a free running timer for application time out
    management. It is hardware or software configurable through the option bytes. The counter
    can be frozen in debug mode.
    Window watchdog
    The window watchdog is based on a 7-bit downcounter that can be set as free running. It
    can be used as a watchdog to reset the device when a problem occurs. It is clocked from the
    main clock. It has an early warning interrupt capability and the counter can be frozen in
    debug mode

    خوب همون طوری که میدونید Window watchdog به علت نرم افزاری بودن از طریق STM32CubeMX قابل دسترسی و کنترل هست بنابراین صحبتی فعلا در این مورد نمی کنیم.

    اما واچ داگ تایمر مستقل(Independent watchdog) علاوه بر شیوه نرم افزاری معمولا بصورت سخت افزاری و از طریق Option Byteمورد تغییر قرار میگرد، وقتی شما از طریق یک نرم افزار مثل STM32 ST-LINK Utility وارد Option Byteمیکروی خودتون میشید با چند گزینه روبه رو میشد که توضیحاتی رو اینجا در موردش میدم:

    Option bytes یک سری تنظیمات شخصی سازی شده مورد نیاز برای برنامه نویسان رو دسترس قرار میده، در این قسمت تعداد کمی بایت قرار داده شده است که یک سری تنظیماتی از قبیل محافظت از حافظه از خواندن و نوشتن protect Flash رو میتونید انجام بدید.
    جهت مطالعه در مورد کانفیگ OPTION BYTE میتونیداین فایل را دانلود کنید.

    RDP: توسط این گزینه شما میتوانید از حافظه در مقابل خواندنوشتن محافظت کنید و برای میکرو کنترلر های STM32F0, STM32F2, STM32F3, STM32F4, STM32L4, STM32L1 دارای سه LEVEL محافظت هست و برای STM32F103 تنها یک LEVEL خفن هست که میتونید Enabled / Disabled کنیدش
    WDG_SW : اگر تیک گزنیه رو نزنیم و خاموش باشه، از زمانی که تغذیه میکرو رو وصل کنیم
    Independent watchdog ما بصورت اتوماتیک و خودکار روشن میشه، و در اصل علت اینکه برنامه Blink من بصورت درست کار نمیکرد هم همین بود، میکرو قبل از اینکه 1 ثانیه بشماره هعی ریست میکرد.
    nRST_STOP: اگر این گزینه رو خاموش کنیم، زمانی که میکرو وارد STOP MODE میشه بصورت اتوماتیک و خودکار ریست میکنه.
    nRST_STDBY: اگر تیک این گزینه رو خاموش کنیم، زمانی که میکرو وارد مود استندبای میشه، خود به خود ریست میشه.
    User Storage option bytes (Data 0, Data 1): دو بایت هست که میتونه برای نیازهای شخصی خودتون استفاده بشه.


    البته حتما نیازی نیست که از طریق نرم افزار ST-LINK Utility قسمت OPTION BYTE رو تغییر بدید توی خود میکرو هم این قسمت ها توسط آدرس های زیر در دسترس هستند:

    امیدوارم توضیحات مفید بوده باشه، اگر وقتی بشه در مورد تایمر های Stm32 هم توضیحی میدم
    این منابع:

    https://www.st.com/resource/en/datasheet/cd00161566.pdf
    جدیدترین ویرایش توسط pencil; ۱۰:۰۹ ۱۳۹۷/۰۸/۱۸.
    رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

    #2
    پاسخ : نکاتی پیرامون STM32 قسمت 2-تنظیمات و ریجسترها در GPIO در STM32

    متاسفانه منابع فارسی در مورد میکروهای آرم معمولا خیلی کم و یا اکثرا کپی از روی هم هست و چه کاری از این بهتر که بیاییم منابعی رو تولید کنیم، تا چراغ راهی بشه برای کسانی که قصد شروع دارند و چه بسا روزی برسه که از همه ما هم پیشی بگیرن
    اگر این مطلب براتون مفید بود، هزینه داره، هزینه اش هم یک روز خوش رو بودن باهمه و یک فاتحه برای مادرم هست.
    ***
    شاید یکی از اولین بخش هایی که برای آموزش میکرو کنترلر های آرم نیاز هست کار با GPIO ها هست، نباید این موضوع رو فراموش کنید، ما در اینجا قصد داریم کار با ریجستری رو یاد بدیم، شاید برای شما سوال باشه که خوب تا وقتی توابع Hal و CMSIS وجود داره چه نیازی به کار با رجیستر ها وجود داره، بزارید براتو یه مثال بزنم، دو تا کد زیر رو در نظر بگیرید:
    کد1 (بااستفاده از ریجستری)
    کد:
    while (1)
      {
      GPIOC->ODR =    0x1000;
        GPIOC->ODR =    0x0000;
    {
    کد2(با استفاده از CMSIS)
    کد:
    while (1)
      {
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13)
    {
    خوب دوتا کد بالا دقیقا یک کار را انجام میدهند و اون هم اینکه بدونه وقفه پین 13 پورت C رو 0 و 1 میکنند، اما زمانی که اسیلوسکوپ رو روی پایه شماره 13 میزاریم(MAINCLOCK=30MHZ) متوجه میشیم که فرکانس کاری در کد 1 برابر 7.5 MHZ و در کد دوم برابر 250 KHZ هست، علت تفاوت اینها در سیکل اجرای برنامه است بطوریکه برای کد1 تنها به 4 کلا نیاز هست اما برای کد 2 نیاز هست چندین توابع و IF و فراخوانی بشه که خوب این باعث کاهش سرعت شدید پین های مکیرو میشه.
    خوب این از بحث اصلی ما که تقریبا بدونیم CMSIS اگرچه کار مارو خیلی خیلی راحت کرده اما گاهی اجازه حرکت روی مرز های میکرو کنترلر رو نمیده.
    خوب بریم سراغ آموزش خودمون
    ریجسترهایی که ما باید برای کار با STM32 بدونیم عبارته از :
    • ریجتستر تعیین مود برای پورت مورد نظر (GPIOx_MODER)
    • ریجستر تعیین نوع OUTPUT برای پورت (GPIOx_OTYPER)
    • رجیستر تعیین سرعت پورت (GPIOx_OSPEEDR)
    • رجیستر تعیین پول دان و پوآپ پورت (GPIOx_PUPDR)
    • GPIO port input data register (GPIOx _IDR)
    • GPIO port output data register (GPIOx_ODR)
    • ریجستر SET یا RESET پورت مورد نظر(GPIOx _BSRR)
    • GPIO port configuration lock register (GPIOx_LCKR)
    • ریجستر ثابت نگه داشتن کانفیگوریشن وضعیت میکرو بعد از ریست
    • GPIO alternate function low register (GPI Ox_AFRL)
    • GPIO alternate function high register (GPIOx_AFRH)
    • GPIO Port bit reset register (GPIOx_BRR)

    که در هرجا که X اومده شما میتونید از پورت مورد نظر خودتون استفاده کنید با توجه به پورت های موجود روی میکرو کنترلر ها
    ریجتستر تعیین MODE برای پورت مورد نظر (GPIOx_MODER)

    این ریجستر یک ریجستر 32 بیتیه که در آن هر مجموعه از دو قطعه متوالی نشان*دهنده حالت واحد I / O است. به عنوان مثال بیت های 0 و 1 در MODER ریجیستر برای GPIOC تعیین وضعیت PIN C0 هست و بیت*های ۲۶ و ۲۷ یک رجیستر ، حالتی از PC26هست. حالا این دو بیت از GPIOX_MODER رو میشه بصورت های زیر کانفیگ کرد.


    • 00'-> پین مورد نظر را بصورت INPUT در میاورد و اجازه میدهد پین بصورت INPUT استفاده بشه.
    • '01'-> پین مورد نظر را در وضعیت OUTPUT قرار می دهد,
    • '11'->پین مورد نظر را بصورت آنالوگ در می آورد و میتوانید با توجه به پتانسیل های میکروتون ازش استفاده کنید بطور مثال برای ADC,
    • '10'-> قرار دادن پین در وضعیت های خاص برای استفاده از peripherals های داخلی مثلا زمانی که نیاز باشه از SPI ویا USART و... استفاده کنید



    ریجستر تعیین نوع OUTPUT برای پورت (GPIOx_OTYPER)
    این یک رجیستر 16 بیتی هست که توسط اون میتونید خروجی خودتون رو با پوش پول و یاOPEN DRAIN قرار بدید.

    که البته با قرار دادن 0 خروجی بصورت پوش پول قرارمیگیرد
    و با 1 قرار دادن آن بصورت اوپن درین قرار میگیرد


    رجیستر تعیین سرعت پورت (GPIOx_OSPEEDR)
    این یک ریجستر 32 بیتی هست که توسط اون شما میتونید سرعت پورتتون رو انتخاب کنید.مثلا وقتی با بیت های 0 و1 این پورت کار میکنید عملا با پین 0 کار میکنید و وقتی با بیت های 26 و 27 رو مقدار دهی میکنید دارید روی پین
    13 کار میکنید
    سرعت رو میتونیدتوی سه وضعیت
    • 'x0': سرعت 2مگاهرتز -LOW
    • '01':10 مگاهرتز-MEDUME
    • '11': 50 مگاهرتز-High

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

    خوب این پست خیلی طولانی شد اگه حوصله و انرژی باقی باشه بقیه توضیحات هم در پست بعدی مینویسم
    رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

    دیدگاه


      #3
      پاسخ : نکاتی پیرامون STM32 قسمت 3-تنظیمات و ریجسترها در GPIO در STM32

      رجیستر تعیین پول دان و پوآپ پورت (GPIOx_PUPDR)
      توسط GPIOx_PUPDR میتونین برای هر پین از I/O مشخص کنید که بصورت داخلی پول آپ یا پول دان بشه، این پول آپ یا پول دان شدن هم میتونه برای زمانی باشه که شما پین رو ورودی (Input) تعریف کردید و هم برای زمانی که پین رو به عنوان خروجی Output تعریف کردید، شاید تصور میکردید که تنها پول و پول دان تنها برای حالت ورودی باشه! مقدار مقاومت یا همون امپدانس پول آپ و پول دان در این وضعیت حدود 40 کیلو اهم هست که البته بین مقادیر 30 تا 50 کیلو اهم متفاوته و بستگی به نوع آی سی و تکنولوژی ساخت و هزار کوفت و زهرمار دیگه داره
      خوب در ریجستر PUPDRy ( که y شماره پین شما از 0 تا16 یا... هست) با مقدار دهی بصورت زیر میتونید وضعیت پول آپ یا پول دان کردن اون رو مشخص کنید.
      00-> پول دان و پول آپ غیر فعال
      01-> پول آپ
      10-> پول دان
      11-> بیت رزرو شده

      GPIO port input data register (GPIOx _IDR)
      این ریجیستر 16 بیتی هست که تنها میتونید از اون بخونید. شما توسط این دستور میتونید به بیت به بیت پورت های خودتون دسترسی داشته باشید.



      GPIO port output data register (GPIOx_ODR)
      یکی از پر کاربرد ترین دستورات ریجستری در مورد STM32 در قسمت GPIO ها هست
      توسط این ریجستر شما هم میتونید بخونید و هم میتونید بنویسید R/W
      با نوشتن GPIOC _ODR میتونید وضعیت پین های مورد نظر از پورت خودتون رو تغییر بدید بزارید یه مثالی بزنم که البته میتونید تعمیمش بدید به هرچیزی که تا الان گفتم
      میکروی STM32F103C8T6 رو دنظر بگیرید پورت A اون 16 بیت داره یعنی 0000 0000 0000 0000 که معادل این در مبنای هگز میشه OX000
      بنابراین اگر شما بخواید پین شماره 13 از پورت C رو روشن کنید باید مقدار زیر رو بریزد تو ریجستر
      کد:
      GPIOC->ODR = 0x1000
      که مقدار 1000 در مبنای باینری میشه 0000 0000 0000 0001
      که همون پین شماره 13 میشه
      GPIO port bit set/reset register (GPIOx _BSRR)
      این ریجستر دقیقا همون کار 0DR رو انجام میده با این تفاوت که توسط BSRR میتونید گروهی از پین ها رو تغییر بدید. بدون اینکه آهسته از (RMW) accesses باشه.
      خوب حالا میخوایم یه مثال ساده بزنیم تا بحث درمورد GPIO ها تموم بشه،
      قصد داریم یک Bliker ساده بنویسم که تا حد امکان دقیق باشه برای همین میایم ترکیبی از توابع hal و دستورات ریجستری استفاده میکنیم.
      کد:
      While(1)
      HAL_Delay(1000)
      GPIOC->0DR=0xFFFF
      HAL_Delay(1000)
      GPIOC->0DR=0x0000
      یه منبع خوب برای مطالعه بیشتر در مورد GPIO ها:
      هذا الموقع الالكتروني للبيع! hertaville.com هل هو أول وأفضل مصادر جميع المعلومات التي تبحث عنها. من ضوء الموضوعات العامة إلى مزيد من الموضوعات التي كنت لتتوقعها هنا، hertaville.com تمتلكها جميعًا. نأمل أن تجد ما تبحث عنه!

      جدیدترین ویرایش توسط pencil; ۱۳:۲۲ ۱۳۹۷/۰۸/۱۸.
      رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

      دیدگاه


        #4
        پاسخ : نکاتی پیرامون STM32 قسمت 4-ADC در STM32

        باز جمعه شد و کمی سرم خلوت شد
        خوب شاید بپرسید که یک ADC در میکرو کنترلرهای STM32 چه نکاتی رو میتونه اضافه تر نسبت به بقیه میکرو کنترلر ها داشته باشه، اجازه بدید یه توضیح بدم شاید براتون جالب بیاد.
        وقتی که دارید دیتاشیت میکرو رو میخونید به قسمت A/D که رسید مشخصات رو بصورت زیر نوشته:
        2ADC
        1MSP
        12BIT
        خوب شما به خودتون میگید که سرعت 1 مگ برای نمونه برداری کمه! در حالی که در اشتباه هستید چون این میکرو کنترلر بدون اورکلاک به راحتی به شما 2مگاسمپل را در ثانیه خواهد داد! میگید چجوری؟ با DUAL FAST MODE // در ادامه این پست همراه باشید
        هزینه این پست یک صلوات برای روح مادرم هست و یکروز خوش رو بودن با مردم هست.
        بطورکلی میکروکنترلر های STM32 دارای دو حالت کلی مستقل (Independent modes) و دوبل(Dual modes) هست و در هر دوحالت به جز یه مورد امپدانسی که به ADC وصل میشه زیر 10 کیلو باشه.
        ما در حالت مستقل (Independent modes) چند تا مد رو میتونیم انتخاب کنیم که هر کدوم از اونها رو به شما توضیح میدم:
        1.Single-channel, single conversion mode
        2.Multichannel (scan), single conversion mode
        3.Single-channel continuous conversion mode
        4.
        Multichannel (scan) continuous conversion mode
        5.
        Injected conversion mode
        ****
        1.Single-channel, single conversion mode

        در این مد شما بلافاصله بعد از روشن کردن ADC یک نمونه از ورودی بر میدارد و پس از تبدیل کردن متوقف میشود.


        2.Multichannel (scan), single conversion mode
        در این حالت شما ADC را به نحوی تنظیم میکنید تا از کانال های مختلف با فرکانس های دلخواه خودتون بدون دخالت CPU نمونه برداری(اسکن) کنه، در شکل زیر میتونید این روند رو مشاهده کنید



        3.Single-channel continuous conversion mode
        4.
        Multichannel (scan) continuous conversion mode
        این دومد دقیقا شبیه به دو مد بالا هستند با این تفاوت که پس از تبدیل دیگر متوقف نمی شوند و دائما نمونه برداری میکند، مشابه این مد ها را در AVR به اسم Free Runnig داشتیم.
        5.Injected conversion mode
        در این مد شما میتونید با استفاده از یک تریگر خارجی و یا نرم افزاری ADC را به حالتی ببرید که حتی اگر وسط مد اسکن هم بود با تریگ شدن بلافاصله فرایند کانورت رو متوقف کنه و بره تا حداکثر 4 تا کانالی که از قبل انتخاب کرده بودید رو کانورت کنه و بعد از اون ADC دوباره کار خودش رو انجام بده.




        ما در حالت مستقل (Dual modes) چند تا مد رو میتونیم انتخاب کنیم که هر کدوم از اونها رو به شما توضیح میدم، قبل از هرچیز باید بگم که این مد مخصوص میکرو کنترلرهای هایی هست که دو واحد ADC دارند، در این مد ADC 1 , ADC2 با همدیگر سنکرون میشوند و قابلیت اعمال یکسری آیکون مثل injected روی جفت آنها نمود پیدا میکنه. در این حالت ADC1 بصورت master و ADC2 بصورت SLAVE در میاید، البته گاهی اوقات ADC3 سومی هم در میکروکنترلرهای STM32 وجود دارند که آن مستقل از دو ADC دیگر عمل میکند.
        Dual regular simultaneous mode
        Dual fast interleaved mode
        Dual slow interleaved mode
        Dual alternate trigger mode
        Dual combined regular/injected simultaneous mode

        ***
        Dual regular simultaneous mode
        در این مد ADC1 بصورت بالا رونده از کامال شماره 0 شروع به شمارش میکند و تا کانال شماره 15 ادامه میابد و همچنین بصورت همزمان ADC شماره 2 از کانال 15 تا کانال شماره 0 بصورت پایین رونده (البته نه بصورت اسکن یعنی نمی توان کانال های دلخواهی را دراین بین انتخاب نمود) شمارش میکند و حال این دو ADC 12 بیتی را در یک ریجستر 32 بیتی ذخیره می نمایید.
        به این صورت سرعت نمونه برداری از کانال ها در regular افزایش میابد و به نصف کاهش پیدا میکند


        Dual fast interleaved mode
        در این مد سرعت ADC به دو برابر حالت عادی خود افزایش می یابد، نحوه کار این مد به این صورت می باشد که سرعت تبدیل را به نصف کاهش میدهد، یعنی برای هر کانورت نیاز به 14 تا کلاک داریم، و در این روش با استفاده از یک Delay داخلی در خود پریفال ADC باعث می شود تا ADC2 دقیقا 7 کلاک بعد از روشن شدن ADC1 روشن گردد بدین ترتیب باعث می شود تا تبدیل از 14 کلاک عملا با استفاده از دو ADC در 7 کلاک انجام گیرد و نتیجه حاصله در یک ریجستر 32 بیتی ذخیره گردد. با استفاده از این روش میتوان حداکثر سرعت نمونه برداری از پریفالADC را به 2 مگاسمپل در ثانیه افزایش داد. عکس زیر نشان دهنده کارکرد این مد می باشد:

        Dual slow interleaved mode
        ما در میکروکنترلر های STM32 در ورودی های پریفال ADC محدودیت تطبیق امپنداس داریم به این صورت که اگر شما بخواهید در بهینه ترین و در حداکثر سرعت میکرو کنترلر از خروجی ADC نمونه برداری کنید باید حداقل ورودی امپدانس به پریفال میکروکنترلر ADC ما کمتر از 10کیلو اهم باشد، با استفاده از این روش میتوان تدابیری اندیشید تا این محدودیت امپنداس را دور بزنیم.، البته توضیح در مورد و شیوه های محاسبه این روش بسیار زیاد است که برای جزئیات بیشتر باید به فایل پیوست شده مراجهع کنید.

        Dual alternate trigger mode
        Dual combined regular/injected simultaneous mode

        کاربرد این دو مد بسیار خاص است به نحوی که Dual alternate trigger mode برای اندازه گیری مقدار سنسور شنت در کنترل موتورها با pwm و مد Dual combined regular/injected simultaneous mode بیشتر جهت استفاده در ups ها مورد استفاده قرار میگیرد که از توضیح در مورد آنها صرف نظر میکنیم و جهت کسب اطلاعات بیشتر به فایل قرار داده شده از سری مقالات خود شرکت ST باید مراجعه کنید.

        مرجع و اطلاعات بیشتر:


        جدیدترین ویرایش توسط pencil; ۱۹:۴۸ ۱۳۹۷/۰۹/۰۹. دلیل: تکمیل پست
        رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

        دیدگاه

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