نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
أَللّهُمَّ ارْزُقْنی شَفاعَةَ الْحُسَیْنِ یَومَ الْوُرُودِ
مهدی دمیرچیلو

آموزش آرم lpc1768 جلسه 3 وقفه gpio

306

به نام خدا : تو این مطلب از سری مطالب آموزش آرم، میخوام درباره وقفه های GPIO توضیحی بدم و پروژه هایی (2تا) قرار بدم و دیگه عرضم به حظورتون که بعد از توضیح ریجسترهای مورد نیاز، و پروژه ها، بعدش مطلب تموم میشه ^_^
آموزش آرم lpc1768 جلسه 3 وقفه gpio

آموزش آرم lpc1768 جلسه 3 وقفه gpio

عناوین این مطلب :

  1. مشخصات وقفه GPIO میکروکنترلر LPC176x/5x
  2. ریجستر های وقفه GPIO
  3. ریجیستر IOIntStatus
  4. ریجیستر IO0IntEnR
  5. ریجیستر IO2IntEnR
  6. رجیستر IO0IntEnF و رجیستر IO2IntEnF
  7. رجیستر IO0IntStatR و رجیستر IO2IntStatR
  8. رجیستر IO0IntStatF و رجیستر IO2IntStatF
  9. رجیستر IO0IntClr و رجیستر IO2IntClr
  10. یه مرور بر کل مطلب ( خلاصه کل مطلب )
  11. پروژه این مطلب ( 2 تا )

 

مشخصات وقفه GPIO میکروکنترلر LPC176x/5x

  1. هر کدوم از پایه های پورت 0و2 میتونن فراهم کنن یه وقفه(چطوری؟ مگه 4 تا وقفه خارجی نداشتیم همش؟)
  2. مدهای موجود به صورت مقابل هستش : rising edge – falling edge – هر دو مورد(هم rising و هم falling)
  3. تشخیص Edge به صورت asynchronous هستش، لذا زمان هایی که clocks در دسترس نیست میشه ازش استفاده کرد!، مثلا موقعی که مد Power-down فعال هستش.(خب وقتی تو این مد کلاک نداریم پس چطور بقیه واحد های میکرو کار میکنن؟)
  4. Each enabled interrupt contributes to a wake-up signal that can be used to bring the part out of Power-down mode
  5. Registers provide a software view of pending rising edge interrupts, pending falling edge interrupts, and overall pending GPIO interrupts
  6. وقفه GPIO0 و GPIO2 به اشتراک گزاشته شدن در NVIC با وقفه خارجی 3 ( یعنی تابع وقفه جداگانه ندارند، و باید از تابع وقفه، وقفه خارجی3 استفاده کنیم؛ در پروژه ای که ته مطلب لینکش رو گزاشتم این مورد رو مشاهده میکنید، البته این مورد فقط برا بحث استفاده از تابع وقفه هستش، برا پرچم وقفه همچین داستانی نیست)

 

ریجستر های وقفه GPIO

ریجسترهای زیر پیکربندی میکنن پایه های پورت 0 و 2 رو برای تولید وقفه.
IntEnR : فعال کردن وقفه GPIO در مد Rising Edge
IntEnF : فعال کردن وقفه GPIO در مد Falling Edge
IntStatR : وضعیت وقفه GPIO در مد Rising Edge
IntStatF : وضعیت وقفه GPIO در مد Falling Edge
IntClr : پاک کردن وقفه GPIO
IntStatus : وقفه اطلاع رسانی سراسری GPIO
GPIO interrupt register map

ریجیستر IOIntStatus

این ریجستر مشخص میکنه تمام وقفه های معلق رو که از وقفه GPIO پشتیبانی میکنن(پورت 0 و2)
توجه : با توجه به جدول 103 (عکس بالا)، این ریجستر فقط خوندنی هستش (RO)
ریجیستر IOIntStatus
بیت 0 : اگه این بیت مقدارش 0 بود که یعنی وقفه معلقی در پورت 0 وجود ندارد، و اگه 1 باشه یعنی حداقل یه وقفه معلق وجود داره در پورت 0.
بیت 1 : رزرو شده.
بیت 2 : اگه این بیت مقدارش 0 بود که یعنی وقفه معلقی در پورت 2 وجود ندارد، و اگه 1 باشه یعنی حداقل یه وقفه معلق در پورت 2 وجود داره.
بیت 3 تا 31 : رزرو شده (دیتاشیت اشتباه چاپی داره همون طور که در عکس بالا میبینید، نوشته 31:2 باید مینوشت 31:3)

ریجیستر IO0IntEnR

توجه : با توجه به جدول 103 (عکس بالا)، این ریجستر هم خوندنی و هم نوشتنی هستش (R/W)
هر کدوم از بیت های این ریجستر، وقفه پایه مترادف با خودش از پورت 0 رو در مد Rising Edge میتونه فعال/غیر فعال بکنه. (منظور از مترادف دینه : بیت 0 پایه 0، بیت 1 پایه 1، …، بیت 31 پایه 31؛ شکل زیر رو ببیند بهتر متوجه میشید، هر چند که چیز خاصی نداره)
ریجیستر IO0IntEnR
[1] در پکیج 80 پایه موجود نیست.

نحوه مقدار دهی : 
0 : غیر فعال کردن وقفه Rising Edge پایه مد نظر.
1 : فعال کردن وقفه Rising Edge پایه مد نظر.

ریجیستر IO2IntEnR

این رجیستر هم مثل رجیستر IO0IntEnR برا فعال کردن وقفه در مد Rising Edge هستش، فقط رجیستر IO0IntEnR برا پورت 0 هستش و رجیستر IO0IntEnR برا پورت 2 هستش.

رجیستر IO0IntEnF و رجیستر IO2IntEnF

این دو ریجستر هم برا فعال کردن وقفه پایه های پورت 0 و 2 در مد Falling Edge هستن، بقیه توضیحات مثل دو ریجستر قبلی هستش.( برا ساده تر شدن و کوتاه تر شدن مطلب و جلو گیری از خستگی شما، از گفتن مطالب تکراری خودداری میکنم، برا سلامتی خودمو و خودت صلوات بفرست ^_^ )

رجیستر IO0IntStatR و رجیستر IO2IntStatR

توجه : با توجه به جدول 103 (عکس بالا)، این ریجستر فقط خوندنی هستش (RO)
هر کدوم از بیت های این دو ریجستر مشخص میکنه که وقفه rising edge اون پایه(بیت) رخ داده یا نه، همون طور که میدونید IO0IntStatR برا پورت 0 هستش و IO2IntStatR برا پورت2.
حالا مثلا اگه بیت 3ام رجیستر IO0IntStatR برابر 1 بشه یعنی : پایه 3ام پورت 0، وقفه rising edge اش رخ داده؛ و مثلا اگه بیت 17ام رجیستر IO2IntStatR برابر 1 بشه یعنی : پایه 17 پورت2 وقفه rising edge رخ داده.

رجیستر IO0IntStatF و رجیستر IO2IntStatF

این دو ریجستر هم مثل دو ریجستر بالایی هستن، با این تفاوت که، این ریجستر ها برا پایه هایی بکار میره که وقفه falling edge داشته باشن، لذا اگه پایه هایی رو وقفشون رو، روی حالت falling edg تنظیم کرده بودیم، برای متوجه شدن از رخ دادن این وقفه ها باید این دو ریجستر رو بخونیم(اگه اون پایه مد نظر ما از پورت 0 بود که IO0IntStatF رو میخونیم و اگه از پورت 2 بود که IO2IntStatF رو میخونیم.)

رجیستر IO0IntClr و رجیستر IO2IntClr

خب حالا مقدار ریجستر های IntStat برابر 1 شد(هر کدوم از بیت ها) و ما مقدارشون رو خوندیم، حالا باید برا اینکه دفعه بعد هم وقفه اون پایه ها رخ بده(اونایی که مقدارشون در ریجسترهای IntStat برابر 1 شده بود) باید مقدارشون رو پاک کنیم به کمکرجیسترهای IO0IntClr (برا پورت 0) و رجیستر IO2IntClr (برا پورت2)؛ با نوشتن مقدار 1 در هر کدوم از بیت های این دو ریجستر، مقدار بیت مربوطه از ریجسترهای اطلاع رسانی(IntStat) پاک میشه و وقفه های اون پایه ها بازم دوباره قابل اجرا هستش.
توجه 1 : با توجه به جدول 103 (عکس بالا)، این ریجستر فقط نوشتنی هستش (WO)
توجه 2 : راستی به این ریجستر هایی که ما رو از وقوع وقفه مطلع میکنن میگن پرچم، تو Avr که اینطوری بود، اینجا هم احتمالا همینطور باشه.


چیزایی که تو این مطلب یاد گرفتیم : 

1) یه سری ریجستر بود که به کمکش میتونستیم بفهمیم که وقفه GPIO رخ داده(البته اگه نخوایم از تابع وقفه GPIO استفاده کنیم) به نام های IOIntStatus (که دو تا بیت داره، یکی برا پورت 0 و یکی برا پورت 2، که اگه مثلا بیت مربوط به پورت 0 مقدارش 1 بشه یعنی یه وقفه الی شونصد تا وقفه از این پایه های پورت 0 رخ بده، مقدار این بیت از این ریجستر 1 میشه، برا پورت 2 هم به همین صورت…)

2) رجیسترهای بعدی IO0IntStatR و IO2IntStatR و IO0IntStatF و IO2IntStatF بودند که به ما دقیقا میگن کدوم وقفه از کدوم پایه از کدوم پورت رخ داده، و حالتش Rising بوده یا Falling که در ظاهر خیلی بهتر هستن نسبت به IOIntStatus، ولی خب اگه به صورت کلی بخوایم از وقوع وقفه متوجه بشیم، قطعا IOIntStatus خیلی بهتر هستش.

3) یه سری ریجستر دیگه بود برا فعال کردن وقفه پایه ها که به دو دسته کلی Rising و Falling تقسیم میشد، اگه بخوایم وقفه پایه مد نظرمون به صورت Falling باشه خب طبیعتا باید از ریجسترهایی استفاده کنیم که اسمشون با F خاتمه میافت، برا حالت Rising هم پایان نام باید به R ختم شود، و خود این دو مدل هم هر کدوم دو تا ریجستر داشتن یکی برا پورت 0 و یکی برا پورت 2، اسم این رجیستر ها IO0IntEnF و IO0IntEnR و IO2IntEnF و IO2IntEnR بود.

4) یه دو تا رجیستر دیگه با نامهای IO0IntClr و IO2IntClr هم بود که برا پاک کردن بیت اطلاع رسانی رجیسترهای Stat بود(رجیستر های اطلاع رسانی)- با پاک کردن این پرچم ها، امکان رخ دادن وقفه در دفعه بعدی رو فراهم میکردیم.


خب توضیح ریجسترهای این مطلب هم تموم شد، بریم سراغ قسمت مورد علاقه من، یعنی انجام پروژه هایی با این ریجسترها و یکم ور رفتن با این ریجستر ها laugh

خب توضیح ریجسترهای این مطلب هم تموم شد، بریم سراغ قسمت مورد علاقه من، یعنی انجام پروژه هایی با این ریجسترها و یکم ور رفتن با این ریجستر ها laugh
پروژه این مطلب : پروژه ساده کنترل led با دکمه و وقفه خارجی lpc1768
توجه : تو پروژه بالا(مطلب بالا) دو تا پروزه هستش، یکی تا پرچم و یکی با تابع وقفه، و هر دو پروژه یه کار رو انجام میدن ولی خب روش انجام کار متفاوت هستش، در مورد وقفه خارجی هم زمان خودش و تو مطلب خودش توضیح میدم، فعلا درباره اون دستوری که احتمالا در مطلب بالا در پروژه اول براتون نا آشنا هستش فعلا کاری نداشته باشید.
مطلب جلسه بعد : 
اگه طبق اون دیتاشیت بخوام بگم الان باید Ethernet رو بگم، ولی چون مبحث ارتباط سریال UART بیشتر مورد نیاز هستش، مخصوصا برا بحث پیدا کردن مشکلات و ... کلا هم سادس و هم فقلا نیازه ( به قول میوه فروشه : پیازه نیازه ^_^ )

خب امیدوارم این مطلب براتون مفید بوده باشه، اگه مفید بود لطفا هزینه این مطلب رو هم بپردازید :
خوندن یه بخش از کتاب “داستان پیامبران یا اسم دیگش میشه حیات القلوب نوشته علامه مجلسی(ره)” چون میدونم اگه یه قسمت(معمولا داستان هر پیامبر ممکنه بین 2 تا 100 صفحه باشه، شما اون داستان های کوچکش رو بخونید قبوله)، و من مطمئنم که بعدش مشتری این کتاب میشید و تا آخر میخونیدش. victory
فیلم زیر رو هم ببیند، ظرر نداره؛ افشاگری زاکانی پیرامون ارتباط زنگنه ،کرسنت و آقا زاده دله دزد ( مهدی هاشمی رفسنجانی معروف به جونیور ) : http://www.aparat.com/v/qLKF7

تعداد مطالب : 367 تا
جنگ ما فتح قدس را به همراه خواهد داشت. [ امام خمینی (ره) ]
ارسال دیدگاه
7
نظرات این مطلب بسته شده است.
  1. علی

    مهمان

    علی

    خسته نباشید.
    ضرر درسته ظرر غلطه

  2. saeed

    مهمان

    saeed

    سلام مهندس
    ببخشید من میخواستم از دو تا پایه پورت ۰ مثلا به عنوان وقفه استفاده کنم. باید چیکار کنم؟ منظورم اینه که چه کدی بنویسم که مشخص کنه از کدوم پایه وقفه اومده؟ تو خود تابع وقفه باید بنویسم؟

    مشاهده پاسخ ها (1)
  3. mch

    مهمان

    mch

    سلام چرا مثال ها رو با سی ++ نوشتی دلیل خاصی داره؟

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام.یکی دو تا مطلب اولی اینطور شد و من حواسم نبود.بقیه پروژه ها با سی هستش…بتونم و وقت کنم با هر دو پروژه میزارم

  4. حسین عهدی

    مهمان

    حسین عهدی

    سلام
    خسته نباشی
    ما چند تا وقفه داریم؟
    تا اونجا که من فهمیدم 2تاست یکی برای gpio ها که دو تا پورت 0 و2 داره و یکی هم وقفه خارجی که پایه های p2.10/11/12/13 هستش.
    درست فهمیدم؟
    درضمن لینک پروژه هم که گذاشتی از وقفه gpio استفاده کردی.درسته؟

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام.
      طبق دیتاشیت و تا جایی که من فهمیدم آره.