ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 20
  1. #1
    2008/11/04
    491
    488

    برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    من فکر میکنم بیشتر اونهایی که برای کد نویسی ARM سعی در کار کردن مستقیم با رجیسترها دارند، به دو گروه تقسیم میشوند:
    یا خیلی مبتدیند (مثل من) و یا خیلی حرفه ایند (مثل شما که میخواهید بنده و بقیه مبتدیهای این زمینه رو راهنمایی کنید، خدا خیرتون بده).
    ... .
    اساتید محترم، اگه کسی بخواد برای STM32 توی محیط Keil 5 یه پایه از یه پورت رو صفر و یک کنه (همون چشمک زدن LED ، البته برای تأخیر از حلقه تکرار بالا استفاده بشه!) و کمترین استفاده رو از کتابخانه ها و توابع سطح بالا داشته باشه،
    1
    - پوشه پروژه چه شکلی میشه؟ (یعنی حداقل فایلهایی که باید اضافه بشن چی هستند)؟
    2
    -فایل main.c چه شکلی میشه؟ (بدون استفاده از;() system.init و ... )؟
    ... .
    و فکر کنم این سوالات من یه ارتباطی هم به این صفحه از نرم افزار داشته باشه:



    3- و دست آخر اینکه یه جوانمردی لطف کنه و اون گزینه هایی که به component مشخص شده رو یه توضیح اجمالی بده که به چه درد میخورند؟ و مهم اشو باز کنه!
    اجرکم عند الله ... .
  2. #2
    2016/12/10
    23
    16

    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    سلام علیکم شما اگر میخواید وارد مبحث برنامه نویسی با stm32 بشین اول این رو بدونید که کلا سعی کنید فقط با کیوب ام ایکس پروژتون را درست کنید مثل کاری که من انجام میدم برای کنترل کردن یک پین پورت هم بدون توابع سطح بالا میتونید مستقیما با رجیسترها کار کنید مثالش را هم پایین میگذارم
    #define ON_OUT8 GPIOA->BSRR = GPIO_PIN_8; 
    #define OFF_OUT8 GPIOA->BRR = GPIO_PIN_8;
    #define TOGGLE_OUT8 GPIOA->ODR ^= GPIO_PIN_8;
  3. #3
    2013/03/18
    babol
    1,387
    652

    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    نقل قول نوشته اصلی توسط ubub

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    اساتید محترم، اگه کسی بخواد برای STM32 توی محیط Keil 5 یه پایه از یه پورت رو صفر و یک کنه (همون چشمک زدن LED ، البته برای تأخیر از حلقه تکرار بالا استفاده بشه!) و کمترین استفاده رو از کتابخانه ها و توابع سطح بالا داشته باشه،
    من هم مثل شما میخواستم از پایین ترین سطح کد نویسی اس تی ام سر در بیارم و شروع به یادگیری کردم -
    ببینید اگه قبلا با رجیسترهای avr کار میکردین و فکر میکنید که با اون روش قبل میتونید برای arm هم کد بزنید باید بگم که کلا رجیسترهای avr شاید همشونو بشه با یکی از رجیسترهای rcc از لحاظ حجم مقایسه کرد.
    پس برنامه نویسی با رجیسترها رو باید بیخیال شی چون خیلی باید برای انجام دادن کار کوچیک با رجیسترها کد بزنی. تازه بیشتر رجیسترها بهم مرتبطن و باید همشونو ست کنی.تازه باید سی رو هم خوب بدونی.حالا من نمونه کد برات برای مقدار دهی رجیستر میزارم. که خودم وقتی فهمیدم چجوری کار میکنه دیگه سمت مقدار دهی رجیستر ها نمیرم . چون خیلیی زیادن و پر دردسر.
    پیشنهاد من اینه که اگه میخای از پایین ترین سطح کد بنویسی بیای از cmsis استقاده کنی . (cmsis رو سرچ کن) و برای استفاده از این کتابخونه برای arm باید بتونی بعضی کارهارو انجام بدی:
    - باید منابع کلاک و بگیری پخش کنی برای قسمت های مختلف میکرو - بنابراین باید اطلاعات خوبی از datasheet va user manul داشته باشی تو این قسمت. که من برای راحتی هردوتارو پرینت گرفتم.
    - یکم داخل این فایل بگرد stm32f10x.h ببین چی به چیه . چون تو مقداردهی رجیسترها باید بدونی این دیفاین ها برای چیه.
    - اگه بیای کتابخونه cmsis یا spl رو از سایت st دانلود کنی همه فایل های مورد نیاز رو داره

    خوب چون داستان خیلی زیاده پراکنده یچیزایی نوشتم . حالا اگه بخوای به رجیستر مقدار بدی باید اینظور کار کنی :
    کد:
    ;  
      address = (int*)(0x40021000 + 0x18); //address of RCC for gpio clock source
     *address = 0x4;
    0x18 : مقدار ofset تو یوزر منوال میتونی ببینیش.
    0x40021000 : آدرس پایه rcc . از رو دیتاشیت میتونی پیداش کنی.

    اینجا داشتم یکی از رجیسترهای rcc رو برای میکرو تنظیم میکردم.


    و حداقل فایل main مورد نیاز برای راه اندازی میکرو :
    کد:
    #include "stm32f10x.h"
    #include "stm32f10x_rcc.h"
    
    
    void init_rcc(void);
    
    
    int main()
    { 
      init_rcc(); 
    
      
      while(1){
       
        
      }
      
    }
    
    
    
    void init_rcc(void){
      RCC_HSEConfig(RCC_HSE_ON);
      RCC_WaitForHSEStartUp();
      FLASH->ACR = 0x1;
      RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
      RCC_PLLCmd(ENABLE);  
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  
      RCC_HCLKConfig(RCC_SYSCLK_Div1);
      RCC_PCLK2Config(RCC_HCLK_Div1);
      
      
    }
    با cmsis نوشتمش.
    موفق باشید.
    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
    (پيش به سوي هدف)
  4. #4
    2008/11/04
    491
    488

    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    نقل قول نوشته اصلی توسط hosseinam

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    میخواستم از پایین ترین سطح کد نویسی اس تی ام سر در بیارم
    جناب مهندس خیلی ممنون از وقتی که گذاشتید.
    کاملا حق با شماست، با این طرز تفکر (کدنویسی از صفر) نمیشه خیلی ادامه داد!
    اما هراس من از اینه که چون موقعی داری از توابع سطح بالا استفاده میکنی و نمیدونی طرف چی نوشته همه شرایط در نظر گرفته نمیشه و میکرو در زمان اجرا و در یک شرایط خاص یه رفتار نامشخص از خودش بروز میده! مخصوصا توی پروژه هایی که از حالت آموزشی و تفننی خارج شده! (گذشته از مسائل بهینه و سبک بودن کد!).
    و از طرفی سر در آوردن از روش کار این کتابخانه ها و مسلط شدن به اونها، دردسرش کم از سروکله زدن با رجیسترها نیست!
    توی بعضی از پروژه ها هم تعداد پریفرالهای استفاده شده اون قدری هست که کد نویسی رجیسترهاش قابل تحمل باشه. چند تا تابع (مثل اون کاری که شما توی کدتون انجام دادید) تعریف میکنی ودیگه رجیسترها رو نمیبینی، ولی به ازاش به کدت و میکروت تسلط داری!
    من آخرین پروژه ام رو که با XMEGA هست با همین رجیسترها کار کردم و تا اینجا 65 کیلوبایت فلش شده، از اونجایی که چیپهاش، وضعیت قیمت و فروش مناسبی ندارند، میخوام به STM32 مهاجرت کنم.
    حالا از اظهار فضل خودم که بگذرم ...
    بابت کدی که زحمت کشیدید ممنون، تستش میکنم اگه مشکلی بود مزاحمتون میشم!
    در مورد او

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    اگه امکانش هست یه توضیحی بفرمائید، گزینه هاش و ضروریاش.
    و من توی اون حداقل حالتی که شما فرمودید (استفاده از CMSIS) توی اون شکل چه تیکهایی رو باید فعال کنم؟
    اجرکم عند الله ...
  5. #5
    2013/03/18
    babol
    1,387
    652

    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    نقل قول نوشته اصلی توسط ubub

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    جناب مهندس خیلی ممنون از وقتی که گذاشتید.
    کاملا حق با شماست، با این طرز تفکر (کدنویسی از صفر) نمیشه خیلی ادامه داد!
    خواهش میکنم دوسته عزیز.
    بله حق با شماست - همین که بدونی چه اتفاقی تو رجیسترها میاوفته خیلی خوبه و به قول شما حرکات نامشخص میکرو رو هم میتونی تشخیص بدین.و همینطور تخصصتون بالا میره. البته خودمم میخوام ببینم منطق فلان تابع چیه و چیکار میکنه میرم داخل تابع رجیستر ها رو میبینم و کارشونو متوجه میشم.
    مهاجرات به stm تصمیم خوبی هست . ولی اگه بیای cmsis یاد بگیری به راحتی میتونید روی lpc و دیگر میکروهای که از معماری arm استفاده میکنن سوپیچ بشید - چون یکی از سیاست های arm برای شرکت ها کتابخونه cmsis هست.
    من بهتون پیشنهاد میدم که بعد اینکه رجیسترها رو فهمیدید بیاید cmsis رو خوب یاد بگیرید که همه ی کارهای مورد نیاز رو داره- حالا میتونید به راحتی با کیوب کار کنید و به راحتی اشکال یابی کنید.
    راستش من مستقیما از avr رفتم arm نمیدونم xmega چطوری هست - اگه خیلی پایه میگم به این دلیل هست وگرنه شما بزرگوارید

    -ما در خدمت شما هستیم اگه بتونیم پاسخ خواهیم داد
    -متاسفانه من با کیل کار نمیکنم . دارم با IAR کار میکنم.ضروری ترین فایل ها برای راه اندازی میکرو که دیفاین ها و آدرس ها رو معرفی کرده باشن اینها هستن که باید در کنار پروژه باشن:
    کد:
    #include "stm32f10x.h"
    #include "stm32f10x_gpio.h"
    #include "stm32f10x_rcc.h"
    فایل stm32f10x_gpio.h هم برای gpio هست (پین میکرو) که مثلا بخای اولین پروژه led blink رو بنویسی .
    مکان فایل core_cm3.h رو هم به کامپایلرتون بشناسونین .تا بقیه فایلها بتونن اینو به خودشون اضافه کنن.البته فایل startup هم ضروری هست ولی من خودم تا قبل اینکه بیام از اینتراپت ها استفاده کنم و ازش استفاده نکردم.چون فقط بردارهای اینتراپت که به اسمبلی نوشتن رو داخلشون دارن.
    من این فایل ها رو براتون گذاشتم که خودم از سایت st گرفته بودم و با هزار دردسر فهمیدم ورژن قدیمی هست و کامپایلر خطا میداد و بعضی فایل های جدید رو جایگذین کردم باهاش.

    خوب اینا همه فایل هایی هستن که cmsis برامون نوشته . ولی اگه خودتون میخایید از پایه و بدونه استفاده از cmsis کد زنی تونو شروع کنید باید زحمت نوشتن این فایل هارو هم بکشید .
    از دیتا شیت و یوزمنوال کمک بگیرید و آدرس ها رو دیفانشونو بنویسید بعد با روش پست قبلیم بیاید دونه دونه رجیسترها رو مقدار دهی کنید . از کلاک و فلش و غیره ... . در این حالت شما به یه فایل main نیاز دارید و حالا به هدرهای مختلفی که قرار کدتون رو داخلش بنویسید و دسته بندی کنید.
    به هیچ فایل کمکی نیاز نخواهی داشت که اضافه کنید به پروژه جز اطلاعاتتون از دیتاشیت و یوزر منوال میکروی مورد نظر و تخصصتون از کد زنی.میتونید روش آدرس دهی رو از فایل include "stm32f10x.h"هم متوجه شید.
    موفق باشید.

    فایل cmsis مورد نیاز:

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    ویرایش توسط hosseinam : 2017/12/10 در ساعت 10:50
    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
    (پيش به سوي هدف)
  6. #6
    2008/11/04
    491
    488

    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    عرض سلام یلدایی خدمت همه اساتید،
    مخلص جناب hosseinam هستیم!
    آقا ما در پی پیشرفت شتابان و سریع، حلزون وارمون، به مبحث Interrupt در STM32F10x رسیدیم!
    دوستان و اساتید گرانقدر لطف کنند اگه امکانش هست یه شمای کلی از مکانیزم کنترل وقفه ها در STM32F10x بیان بفرمایند:

    آنچه بنده حقیر سرچ کردم عرض میکنم، اساتید تصحیح بفرمایند :


    (قابل توجه کهنه کارای ATMEL-8 و تازه کارای 32 STM ):
    1- اول عرض کنم که Interrupt ها توی میکروهای ARM خودشون شدند زیر مجموعه بحث جامع تری به نام
    Exception !
    یعنی ما یکسری وضعیت Exception داریم که اگر اتفاق بیافتند، روال اجرای عادی برنامه رو متوقف میکنند و باید توسط پردازنده سرویس دهی شوند و Interrupt ها گروهی از این Exception ها هستند. (البته فکر کنم Exception ها در عمل موضوع جدیدی نیستند! فقط اسمشون عوض شده، شما میتونید فکر کنید یک سری Interrupt خیلی مهم هستند).

    2-طبق روال همه میکروها هر پریفرالی که قابلیت کار با وقفه ها رو داشته باشه، توی بخش رجیسترهای کنترلی مربوط به خودش، چندتا بیت برای تنظیم وقفه هاش داره! مثلا برای USART2 بیتهای 4 تا 8 رجیستر USART2_CR1 (خوب از اینها بگذریم).

    3-بخش کنترل کننده Exception ها و وقفه ها توی STM32 اسمش هست NVIC ،
    که یکسری رجیستر داره که ما میتونیم با تنظیم اونها تعیین کنیم که کدام Exception ها فعال باشند و همچنین Prioroiy هر کدام چقدر باشد!
    الف - فعال و غیر فعال و وضعیت : ISER0-ISER2 _ ICER0-ICER2 _ ISPR0-ISPR2 _ ICPR0-ICPR2 _ IABR0-IABR2
    ب - تعیین سطح اولویت : IPR0-IPR16 _ SHPR1-SHPR3
    پ - گروه بندی اولویتها ... .

    4- هر Exception ( یا هر منبع تولید کننده وقفه ) توی NVIC با یک شماره شناخته میشه (که توی منوال هر قطعه، باید پیدا کنید!) و همچنین مطابق با هر شماره ( شماره Exception مربوطه در NVIC ) یک بیت در رجیسترهای الف جهت فعال و غیر فعال سازی و یک فیلد چهار بیتی در رجیسترهای ب جهت تعیین سطح اولویت وقفه وجود دارد! (از 4 بیت برمی آید که 16 سطح اولویت وقفه قابل تنظیم وجود دارد).
    و مثلا برای USART2 این شماره برابر 38 است.

    5 - همون طور که میدونید قراره پس از وقوع هر کدام از Exception ها، روال عادی اجرای برنامه متوقف بشه و Exception مربوطه سرویس دهی بشه، پس ما به ازای هر Exception نیاز به یک زیر روال مخصوص داریم تا در زمان وقوع، پردازنده به نحوی به اون زیر روال بره و با اجرای اون زیر روال مخصوص، اون Exception رو سرویس دهی کنه و بعد پردازنده دوباره به وضعیت عملکرد عادی خودش برگرده!
    پس ما کلی آدرس رفت داریم و کلی آدرس برگشت (با توجه به وقوع اینتراپتهای تو در تو!).
    خوب در اینجا 4 تا هویت وجود داره:
    5-1- روالهای سرویس دهی Exception ها (که در هر جایی از فضای فلش میتونند باشند فقط باید به نحوی آدرسشون رو بدونیم)
    5-2- فضای پشته سخت افزاری (که محتوی آدرسهای برگشت و متغیرهای محلی مربوط به این زیر روالهاست و در هر جایی از فضای RAM میتونه باشه و فقط ما باید آدرس شروعش رو بدونیم )
    5-3- Vector Table (جدولی که خانه اول آن به آدرس پشته سخت افزاری اشاره میکند و خانه های بعدی آن به ترتیب شماره Exception ها، به آدرس شروع زیر روال مربوطه اشاره دارد!. این جدول در هر جایی از فضای حافظه فلش یا RAM میتواند قرار گیرد)
    5-4- رجیستر SCB_VTOR (رجیستری در هسته آرم که حاوی آدرس Vector Table میباشد (به عبارتی حاوی آفست آدرس نسبت به آدرس پیش فرض 0x000000) که به صورت داینامیک قابل تنظیم میباشد).
    این چها تا رو که به هم وصل کنید میبینید هیچی گم نمیشه!!!

    6- پس باید بعد از انجام همه تنظیمات بالا بیایید برای همه Exception هایی که فعال کردید و مد نظرتون هست زیر روال بنویسد و آدرس اونها رو تک تک، توی جای مخصوص به اون Exception (با توجه به شماره Exception) توی Vector Table وارد کنید، توی C دستوراتش هست!
    و علاوه آدرس بخشی از حافظه RAM رو که به عنوان پشته سخت افزاری در نظر دارید توی خونه اول Vector Table وارد کنید.

    تقریبا دیگه داره کامل میشه!

    البته هنوز یه مقدار رجیستر مربوط به این بخش مونده!
    تازه یک سری فلگ کلی هم، مربوط به فعال و غیر فعال سازی کلی وقفه ها، توی ثبات وضعیت برنامه (SPR توی مغز آرم) داره!

    7- انشا الله به کمک دوستان بقیه ش هم حله!

    به قول اساتید کار کردن با رجیسترهای ARM واقعا درد سر داره!
    البته همش هم به خاطر غول بودن تراشه نیست! یه بخشش هم مربوط به معماری غیر یکپارچه این نوع میکرو هاست!
    ...

    حالا نقدا اساتید لطف کنند و توضیح بدهند که روالهای سرویس دهی وقفه ها رو چطوری و با چه عنوانی توی Keil تعریف کنیم و آدرس دهی به اونها به چه صورت هست؟ (خواهشا اگر به صورت RAW و استفاده از دستورات رایج C باشه بهتره! و به درک بهتر مکانیزم وقفه ها در STM32 کمک میکنه!)
    و یا اگه نشد حداقل CMSIS باشه! ( البته با یه توضیح اجمالی از روش آدرس دهی ).
    ....
    از این که مطلبم یلدایی شد ببخشید!
    ویرایش توسط ubub : 2017/12/27 در ساعت 20:18
  7. #7
    2013/03/18
    babol
    1,387
    652

    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    نقل قول نوشته اصلی توسط ubub

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    و اساتید باید لطف کنند و توضیح بدهند که روالهای سرویس دهی وقفه ها رو چطوری و با چه عنوانی تعریف کنیم و آدرس دهی به اونها به چه صورت هست؟ (خواهشا اگر به صورت RAW و استفاده از دستورات رایج C باشه بهتره! و به درک بهتر مکانیزم وقفه ها در STM32 کمک میکنه!)
    و یا اگه نشد حداقل CMSIS باشه! ( البته با یه توضیح اجمالی از روش آدرس دهی ).
    ...
    بزرگوارید دوسته عزیز.
    اول بیام یکم در مورد رجیستر ها بگم.
    ببینید آرم در واقع یه معماری هست - یعنی یکسایی میآن این معماری رو مینویسن یا طراحی میکنن بعد شرکت هایی مثل st که قطعات نیمه هادی میسازه میآد این معماری رو میخره از شرکت آرم و بعد طبق همون سیاست ها میکرو رو طراحی میکنه .
    خوب یکی از سیاست های آرم اینه که هر میکرویی باید بیاد از این معماری پیروی کنه و یه بخشی از حافظه ی میکروشو رو به هسته ی آرم بده تا آرم بتونه کارهاشو انجام بده . و بخش دیگه از میکرو امکاناتی هست که خود شرکت کننده به میکرو اضافه میکنه . که این بخش رو باید معماری آرم رهبری کنه.
    خوب حالا برای کار کردن سی پی یو و اتصال به دنیای خارج میکرو باید رجیسترهایی باشه دیگه. معماری آرم هم یسری رجیسترهای مخصوص به خودشو داره و همینطور شرکت سازنده هم رجیسترهای مخصوص به خودشو داره.که باید به هسته آرم وصل شن.
    مثلا شما میتونید تو یوزرمنوال رجیسترهای شرکت st رو ببینید . ولی اگه دقت کنید در بخش nvic در یوزرمنوال هیچ رجیستری نیست و لینک میده به راهنمای proggraming . و اگه رجیستر های nvic رو سرچ بزنید شما لینک میگیرید به سایت آرم که باید اطلاعات اونجا رو هم بدونید تا بیایید ادامه بدید کد نویسی رو.
    رجیستر های مخصوص به معماری آرم توی هدر core_cm3.h میتونید پیدا کنید . و رجیسترهای مربوط به شرکت سازنده میکرو (امکانات میکرو) رو میتونید تو هدر stm32f10x.h پیدا کنید.
    اگه از cmsis استفاده نکنید باید هردو راهنمای مربوطه رو بخونید تا با رجیستر ها به خوبی آشنا شید و بتونید با میکرو کار کنید .
    cmsis اومده همه این رجیسترها رو با توجه به معماری آرم و امکانات میکرو به هم ربط داده و با توجه به توابع فراخانی شده از طرف برنامه نویس به خوبی به همه ی رجیستر ها مقدار میده.


    خوب از اینتراپت حرف زدین و شبیه سازی اون به میکرو هشت بیتی اتمل. اصلا یه شما نیا ایندوتارو باهم مقایسه کن چون سطح انتظاراتت نسبت به این میکرو ی آرم پایین میآد و نمیتونید همشو درک کنید .
    خوب شما برای کار کردن با اینتراپت ها نیاز دارین که اولا ازهدر misc.h بیاید واحد nvic رو بگیرید مقدار دهی کنید و اینتراپت مربوطه رو از اینجا معرفی کنید .
    و بعد فایل استارت آپ میکروی مورد نظر رو به پروژه اضافه کنید . و از داخل این فایل بیاید اسم اینتراپت مربوطه رو پیدا کنید و در main یه تابع از نوع ورودی و خروجی void با همون نام مورد نظر بسازید .
    تا با رخ دادن اینتراپت به تابع مربوطه پرش کنه.
    یه مثال از exti که خودم کار کردم با این واحد رو برات میزارم . تا به خوبی موضوع رو درک کنید.
    کد:
    #include "stm32f10x.h"
    #include "stm32f10x_gpio.h"
    #include "stm32f10x_rcc.h"
    #include "LCDlib.h"
    #include "delay.h"
    #include "misc.h" 
    #include "stm32f10x_exti.h"
    
    int i;
    
    void init_rcc(void);
    void gpiob(void);
    void EXTI9_5_config(void);
    
    void EXTI9_5_IRQHandler (void){
      
      GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);
      
      while(1){
        
        if( EXTI_GetITStatus(EXTI_Line7) == SET){
          lcdPutInt(i);
          i++;
          delay_ms(200);
          lcdClear();
        }
      }
      
    }
    
    int main()
    {
      
      //init_rcc(); 
      gpiob();
      lcd_init();  
      lcdPutString("EXTI test for STM32:");
      
      
      EXTI9_5_config();
      
      while(1){
        //GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);
        
      }
      
    }
    
    
    void EXTI9_5_config()
    {
      
      GPIO_InitTypeDef GPIO_EXTI;
      EXTI_InitTypeDef EXTI_INIT;
      NVIC_InitTypeDef NVIC_InitStructure;
      
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
      GPIO_EXTI.GPIO_Pin = GPIO_Pin_6;
      GPIO_EXTI.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_EXTI.GPIO_Speed = GPIO_Speed_10MHz;
      GPIO_Init(GPIOA , &GPIO_EXTI);
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOA , GPIO_PinSource6);
      
      EXTI_INIT.EXTI_Line = EXTI_Line6 ;
      EXTI_INIT.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_INIT.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
      EXTI_INIT.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_INIT);
      
      /* Enable and set EXTI0 Interrupt to the lowest priority */
      NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      
      NVIC_Init(&NVIC_InitStructure);
      
    }
    
    
    void init_rcc(void){
      RCC_HSEConfig(RCC_HSE_ON);
      RCC_WaitForHSEStartUp();
      FLASH->ACR = 0x1;
      RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
      RCC_PLLCmd(ENABLE);  
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  
      RCC_HCLKConfig(RCC_SYSCLK_Div1);
      RCC_PCLK2Config(RCC_HCLK_Div1);
      
      
    }
    
    
    void gpiob(void){
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
      
      GPIO_InitTypeDef gpiob;
      gpiob.GPIO_Pin = GPIO_Pin_All;
      gpiob.GPIO_Speed = GPIO_Speed_10MHz ;
      gpiob.GPIO_Mode = GPIO_Mode_Out_PP ;
      GPIO_Init(GPIOB, &gpiob);
      
      
    }
    کد با CMSIS نوشته شد.
    در ضمن شما با میکروتون اولین پروژه که Blink رو انجام دادین ؟واحد های کلاک رو راه انداختین؟ خواسته بودین با رجیستر ها این کارارو انجام بدین. خواشتم ببینم اینارو انجام دادین یا خیر.

    از این لینک هم میتونی از هدر مربوط به LCD که تو این پروژه استفاده کردم رو بگیری:

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
    (پيش به سوي هدف)
  8. #8
    2008/11/04
    491
    488

    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    Re. post 7
    مهندس جان خيلي ممنون از وقتي که گذاشتي!
    اول عرض کنم که بنده قصد مقايسه ARM رو با 8051 ندارم که مثل مقايسه فيل و فنجون ميمونه!!
    و فقط ميخوام يه جورايي مطلبي جمع بشه واسه اونهايي که ميخوان با همون تفکر کار با Register ها از AVR به STM32 مهاجرت کنند، (از جمله خودم)،
    واسه همين سعي کردم بگم که لازم نيست همه دونسته هاتون رو راجع به اينتراپتها بيرون بريزيد!
    ...
    راجع به نوشته تون بايد عرض کنم که من خودم پردازندم 8 بيتي هست و يه خورده طول ميکشه تا بفهمم چي نوشتيد!
    استفاده ميکنم، مشکلي بود، مجدد مطرح ميکنم.
    ...
    و فرموديد:
    در ضمن شما با ميکروتون اولين پروژه که Blink رو انجام دادين ؟واحد هاي کلاک رو راه انداختين؟ خواسته بودين با رجيستر ها اين کارارو انجام بدين. خواستم ببينم اينارو انجام دادين يا خير؟

    جناب مهندس من نميدونم مطابق نظر شما شده يا نه؟
    کد رو ميزارم ببينيد شده يا نه؟
    ( فقط به جاي آدرس از Define نام رجيسترها استفاده کردم - رو سخت افزار هم تست کردم):

    #include "stm32f10x.h"

    int main(void)
    {
    int32_t dly=0;
    while(dly<10000)dly+=1; // Caution wait
    dly=0;

    RCC->CR |= 0X00000081; // enable HSI
    RCC->CR &= 0X0000FF83; // disable all other clock sources
    RCC->CFGR = 0;

    RCC->APB2ENR |= 0X00000010; // ENABLE PORTC CLOCK
    GPIOC->CRL &= 0XFFFFFFF0;
    GPIOC->CRL |= 0X00000002; // Config c.0 as output_push-pull_Low-Freq

    while(1)
    {
    GPIOC->BSRR = 0X00000001; // set c.0
    while(dly<100000)dly+=1;
    dly=0;
    GPIOC->BSRR = 0X00010000; // Reset c.0
    while(dly<100000)dly+=1;
    dly=0;
    }
    }


    اگه که شده، من افزايش فرکانس تا 48MHz رو با PLL و راه اندازي چند تا پريفرال مثل SPI و USART رو هم با مقداردهی رجیسترهاشون راه انداختم. (نه اینکه کار مهمی کرده باشم! واسه تازه کار بودن عرض میکنم!).
    ویرایش توسط ubub : 2018/01/05 در ساعت 19:05
  9. #9
    2013/03/18
    babol
    1,387
    652

    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    نقل قول نوشته اصلی توسط ubub

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    اگه که شده، من افزايش فرکانس تا 48MHz رو با PLL و راه اندازي چند تا پريفرال مثل SPI و USART رو هم با مقداردهی رجیسترهاشون راه انداختم. (نه اینکه کار مهمی کرده باشم! واسه تازه کار بودن عرض میکنم!).
    اولا من سعی میکنم توضیحی که تو هر پست میدم تا جایی که میدونم پایه ای و کامل باشه تا بتونم فهم ی که خودم دارم از موضوع رو به دوستان انتقال بدم (هرچند اطلاعات کمی که دارم) پس خدایی ناکرده دوستان از حرفام بد برداشت نکنن -هر چند که خود دوستان استاد بنده هستن.

    کدتون خانایی خوبی داره و خوب تونستین رجیسترها رو بفهمید.
    فقط این نکته رو در نظر داشته باشید که وقتی که فرکانس و افزایش میدین- باید فرکانس فلش رو طبق گفته ی دیتاشیت تقسیمش کنید. فک کنم فلش به اونقدر فرکانس بالا نیازی نداره.خودم یکم داستان کشیدم تا این موضوع رو فهمیدم.وگرنه کداتون با فرکانس بالا کار نمیکنه .هرچند فرکانس رو افزایش دادید.
    FLASH->ACR = 0x1;

    این خیلی خوبه که درک خوبی از رجیسترها دارید و اول کار تونستین با این ماژول های میکرو کار کنید.

    در ضمن هرجایی از بحث پست قبلی رو نگرفتید منظورمو- بپرسید تا جایی که میدونم براتون بگم.
    توضیح کوتاه :
    اینتراپت ها شبیه اینتراپت های کدویژن هست. ولی قبلش باید فعال کنید اینتراپت مورد نظر رو .
    اینتراپت ها تو فایل اسمبلی startup_stm32f10x_hd.s تعریف شدن. مثل هدر "stm32f10x.h" . باید به پروژه ها اضافه شن.اینتراپت هایی که میخوایین ازش استفاده کنید باید اسمشو از startup بگیرید و همنامش یه تابع تو main بنویسید.

    اگه این رجیسترها رو از یوزرمنوال اس تی ام میکروتون گرفتید- هیچ رجیستری از NVIC رو نمیتونید توش پیدا کنید. چون رجیستر NVIC برای معماری آرم هست.نه شرکت سازنده میکرو.

    چخبر از CMSIS ؟؟ هنوز تصمیم نگرفتین بیاید رو این کتابخونه کار رو شروع کنید؟؟چون کد بالاتون رو CMSIS نوشته . و الان شما غیر مستقیم دارین از سیاست های CMSIS استفاده میکنید.
    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
    (پيش به سوي هدف)
  10. #10
    2008/11/04
    491
    488

    پاسخ : برنامه نویسی STM32 با مقداردهی رجیسترها در ++C

    نقل قول نوشته اصلی توسط hosseinam

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    چخبر از CMSIS ؟؟ هنوز تصمیم نگرفتین بیاید رو این کتابخونه کار رو شروع کنید؟؟چون کد بالاتون رو CMSIS نوشته . و الان شما غیر مستقیم دارین از سیاست های CMSIS استفاده میکنید
    سلام،
    جناب مهندس بحث پاچه خواری نیست، کلا خیلی آقایی! البته اینجا آقا زیاد داریم، جناب سپهر63 هم بنده رو زیاد راهنمایی فرمودند!
    خوشحالم که تا حدودی تائید فرمودید که برنامه سطح پائین است! ولی راستش رو بخواهید خودم خیلی مطمئن نیستم!
    به عکسی که از صفحه برنامه گرفتم توجه فرمائید:

    موقعی سطح پائین می*بود که اون همه سورس و هدر و ... بهش اضافه نمیشد!
    البته من حتما اصرار ندارم که همه اونها رو حذف کنم و برنامه رو صفر تا صد خودم بنویسم!
    همین که سبکه و زود کامپایل میشه خودش خوبه!
    هرجایی از بحث پست قبلی رو نگرفتید ....
    راستش رو بخواهید من فعلا چیز زیادی از کد و توضیحاتتون متوجه نشدم، به چند دلیل:
    1- هنوز فرصت نکردم درست مطالعه شون کنم.
    2- فکر میکنم شما با IAR نوشتید و من دارم با KEIL کار میکنم ...
    3- همین که اسم چندتا فایل هدر و تابع رو توی نوشتهتون میبینم، موضع میگیرم و میگم جان رجیسترها به خطر افتاد !! ...
    ...
    البته به هر حال من حداکثر استفاده رو از مطالبتون میبرم مخصوصا از طرز نگاه Low Level تون به معماری ARM.
    و حالا دارم NVIC رو مطالعه میکنم، از رفرنسهای کرتکس و Programming manual استفاده میکنم.
    و یه کم دیگه کار کنم مورد 5 رو توی پست 6 به همون روش رجیستری تکمیل میکنم، البته به کمک شما!
    ...
    و راجع به CMSIS عرض کنم که بهترین استفاده ای که در حال حاضر من میتونم از این کتابخانه داشته باشم،
    هندل کردن همین بحث Interrupt ها هست، که متأسفانه هنوز موفق به استفاده از اون توی Keil نشدم،
    حتی هنوز نمیدونم چطوری به کامپایلر بفهمونم که فلان تابعی که نوشتم مربوط به سرویس دهی فلان وقفه هست!!
    فکر میکنم توی CMSIS یه ربطی به این تابع داشته باشه:
    void NVIC_SetVector (IRQn_Type IRQn, uint32_t vector)
    بقیه شون هم اینجان:

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت


    ویرایش توسط ubub : 2017/12/24 در ساعت 00:32
صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 20

موضوعات مشابه

  1. پاسخ: 22
    آخرين نوشته: 2018/06/11, 19:16
  2. پاسخ: 2
    آخرين نوشته: 2014/07/16, 21:34
  3. پاسخ: 1
    آخرين نوشته: 2014/04/15, 12:59
  4. مقداردهی در mikroc
    توسط yadegari در انجمن میکروکنترلرهای PIC
    پاسخ: 12
    آخرين نوشته: 2013/06/03, 11:08
  5. مقداردهی رجیستر
    توسط spman در انجمن پروسسورهای ARM
    پاسخ: 2
    آخرين نوشته: 2010/08/26, 12:17

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •