آموزش STM32 رجیستری : پریفرال EXTI و اینتراپت خارجی در STM32F103C8
در این مقاله پریفرال EXTI میکروکنترلر STM32F103C8 و رجیستر هاش رو بررسی میکنیم و اینکه برای تنظیم یک پین در حالت اینتراپت خارجی چه کدی باید بنویسیم و کدوم بیت ها رو در کدوم رجیسترهای پریفرال EXTI باید تغییر بدیم.

مشاهده ویدئوی تنظیمات کلاک میکروکنترلر STM32F103C8 بصورت رجیستری در یوتیوب
کد تنظیم کلاک با CMSIS استاندارد برای STM32F103C8:
کد تنظیم کلاک با CMSIS با دسترسی به بیت فیلد برای STM32F103C8:
معرفی پریفرال EXTI در میکروکنترلر STM32F103C8
در پریفرال EXTI میکروکنترلر STM32F103C8 تعداد 19 خط اینتراپت وجود داره که خط های 0 تا 15 به پین های میکروکنترلر متصل شدن. از بین تمام پین های صفر یعنی PA0 ، PB0 … فقط یکی از اونها میتونه به خط صفر متصل بشه. همینطور از بین تمام پین های یک یعنی PA1 , PB1 , … , PG1 فقط یکی از اونها میتونه به اینتراپت خط یک وصل بشه. همینطور از بین تمام پین های 15 فقط یکی از اون ها میتونه به اینتراپت خط 15 وصل بشه. تنظیم اتصال پین به هر خط اینتراپت در رجیستر های EXTICR پریفرال AFIO هست . برای هر خط اینتراپت چهار بیت وجود داره. مثلا در بیت های EXTI0 در رجیستر EXTICR1 مشخص میکنیم که کدوم یک از پین های PA0 , PB0 , … , PG0 به اینتراپت خط صفر وصل بشه.

رجیسترهای پریفرال EXTI در میکروکنترلر STM32F103C8
در دو تصویری که در ادامه اومده به ترتیب بلوک دیاگرام و رجیسترهای پریفرال EXTI در میکروکنترلر STM32F103C8 رو میبینید ، اعدادی که در تصویر رنگی هستند مفهومی ندارند فقط برای اینه که وقتی توضیحاتی کد در ادامه برای هر رجیستر اومده رو میخونید بتونید رجیستر رو تو بلوک دیاگرام پیدا کنید. هر کدوم از 6 تا رجیستر این پریفرال 20 تا بیت وجود داره برای 20 تا خط اینتراپت ، برای هر خط اینتراپت یک بیت داریم در هر رجیستر. ( در connectivity line ها پریفرال EXTI بیست عدد اینتراپت داره ، در STM32F103C8 تعداد 19 عدد اینتراپت داریم در پریفرال EXTI ).


1 – رجیستر EXTI_FTSR در میکروکنترلر STM32F1
اگر بیت مربوط به هر خط اینتراپت رو در این رجیستر یک کنیم در لبه ی پایین رونده ی پین مربوط به اون خط ، اینتراپت خواهیم داشت ( اگر اینتراپت رو فعال کنیم ) . اگر بیت مربوطه رو صفر کنیم ، در لبه ی پایین رونده اینتراپت نداریم.
2 – رجیستر EXTI_RTSR در میکروکنترلر STM32F1
اگر بیت مربوط به یک خط اینتراپت رو در این رجیستر یک کنیم ، در لبه ی بالارونده پین متصل شده به اون خط ، اینتراپت خواهیم داشت. اگر بیت مربوطه رو صفر کنیم در لبه ی بالارونده اینتراپت نداریم.
3 – رجیستر EXTI_SWIER در میکروکنترلر STM32F1
برای هر خط اینتراپت یک بیت در این رجیستر داریم ، اگر وقتی وظعیت بیت صفر هست اون رو یک کنیم. میتونیم به صورت نرم افزاری کاری کنیم که بدون اینکه لبه ی بالارونده یا پایین رونده روی پین داشته باشیم اینتراپت اتفاق بیافته .
4 – رجیستر EXTI_IMR در میکروکنترلر STM32F1
هر خط اینتراپت یک بیت در این رجیستر داره، اگر بیت مربوط به یک خط اینتراپت رو یک کنیم ، اینتراپت اون خط فعال میشه. اگر بیت مربوط به یک خط اینتراپت رو صفر کنیم ، اینتراپت مربوط به اون خط غیر فعال میشه.
5 – رجیستر EXTI_PR در میکروکنترلر STM32F1
در این رجیستر برای هر خط اینتراپت یک بیت داریم ، که بیت فلگ اینتراپت هست، وقتی درخواست اینتراپت برای یک خط به پریفرال NVIC ارسال بشه، بیت فلگ اینتراپت در این رجیستر توسط سخت افزار یک میشه. ما فقط میتونیم بیت های این رجیستر رو صفر کنیم. وقتی در بیت های این رجیستر یک بنویسیم مقدارش صفر میشه و وقتی صفر بنویسیم تاثیری نداره.
6 – رجیستر EXTI_EMR در میکروکنترلر STM32F1
هر خط اینتراپت یک بیت در این رجیستر داره، اگر بیت مربوط به یک خط اینتراپت رو یک کنیم ، ایونت اون خط فعال میشه. اگر بیت مربوط به یک خط اینتراپت رو صفر کنیم ، ایونت مربوط به اون خط غیر فعال میشه.
تنظیم پین PA0 در حالت اینتراپت خارجی با رجیستر ها در میکروکنترلر STM32F103C8
در تصویر زیر کد مورد نیاز برای تنظیم پین PA0 در حالت اینتراپت خارجی در لبه ی پایین رونده رو میبینید ، در ادامه هر خط کد رو بررسی میکنیم و در ابتدای مقاله لینک کد ها در github وجود داره.

بیت IOPAEN در رجیستر RCC_APB2ENR میکروکنترلر STM32F103
قبل از اعمال تنظیمات برای خط صفر اینتراپت باید پین PA0 رو در حالت ورودی تنظیم کنیم. برای این هدف باید رجیستر CRL پریفرال GPIOA رو تغییر بدیم ولی قبل از اعمال تغییرات در این رجیستر باید کلاک پریفرال GPIOA رو فعال کنیم. برای این هدف بیت IOPAEN در رجیستر APB2ENR پریفرال RCC رو یک میکنیم.

خط 13 : یک کردن بیت IOPAEN
بیت های MODE0 و CNF0 در رجیستر CRL پریفرال GPIOA در میکروکنترلر STM32F103
پین PA0 باید در حالت ورودی تنظیم بشه ، پس بیت های MODE0 در رجیستر CRL پریفرال GPIOA رو صفر میکنیم. میتونیم در بیت های CNF0 این پین رو در حالت input float تنظیم کنیم در این صورت باید pull up یا pull down رو خارج از میکروکنترلر انجام بدیم . همچنین میتونیم با ذخیره عدد 0b10 در بیت های CNF0 حالت ورودی با pull up یا pull down داشته باشیم.

خط 15 : صفر کردن بیت های MODE0
خط 16 : صفر کردن بیت های CNF0
خط 17 : یک کردن بیت یک CNF0
بیت ODR0 در رجیستر ODR پریفرال GPIOA در میکروکنترلر STM32F103
برای اینکه پین PA0 که در حالت ورودی با pull up یا pull down تنظیم شده رو ، pull up کنیم بیت ODR0 در رجیستر ODR پریفرال GPIOA رو یک میکنیم.

خط 18 : یک کردن بیت ODR0
بیت AFIOEN در رجیستر RCC_APB2ENR میکروکنترلر STM32F103
قدم بعدی اتصال پین PA0 به خط صفر اینتراپت در پریفرال EXTI هست . برای اینکار باید رجیستر EXTICR1 در پریفرال AFIO رو تغییر بدیم. قبل از تغییر این رجیستر باید کلاک پریفرال AFIO رو با یک کردن بیت AFIOEN در رجیستر APB2ENR پریفرال RCC فعال کنیم.

خط 20 : یک کردن بیت AFIOEN
بیت EXTI0 در رجیستر AFIO_EXTICR1 در میکروکنترلر STM32F103
برای وصل شدن پین PA0 به خط صفر اینتراپت در پریفرال EXTI باید چهار بیت EXTI0 در رجیستر EXTICR1 در پریفرال AFIO رو صفر کنیم.

خط 21 : صفر کردن چهار بیت EXTI0 در رجیستر EXTICR1
بیت TR0 در رجیستر EXTI_FTSR در میکروکنترلر STM32F103
برای فعال کردن اینتراپت در لبه ی پایین رونده پین PA0 بیت TR0 در رجیستر EXTI_FTSR رو یک میکنیم.

خط 23 : یک کردن بیت TR0 در رجیستر EXTI_FTSR
بیت TR0 در رجیستر EXTI_RTSR در میکروکنترلر STM32F103
برای غیر فعال کردن اینتراپت در لبه ی بالارونده پین PA0 بیت TR0 در رجیستر EXTI_RTSR رو صفر میکنیم.

خط 24 : صفر کردن بیت TR0 در رجیستر EXTI_RTSR
بیت MR0 در رجیستر EXTI_IMR در میکروکنترلر STM32F103
برای فعال کردن اینتراپت خط صفر در پریفرال EXTI بیت MR0 رو در رجیستر EXTI_IMR یک میکنیم.

خط 25 : یک کردن بیت MR0 در رجیستر EXTI_IMR
بیت PR0 در رجیستر EXTI_PR در میکروکنترلر STM32F103
قبل از فعال کردن اینتراپت خط صفر در پریفرال NVIC باید فلگ اینتراپت رو صفر کنیم.فلگ اینتراپت برای خط صفر در بیت PR0 هست و برای صفر کردن این بیت باید در اون عدد یک رو بنویسیم. دقت کنید که وقتی در بیت های این رجیستر یک بنویسیم اون بیت صفر میشه پس نباید از |= یا &= روی این رجیستر استفاده کرد.

خط 26 : صفر کردن بیت PR0 در رجیستر EXTI_PR با یک نوشتن داخل بیت
تابع NVIC_GetPriorityGrouping
این تابع ورودی نداره و Priority Grouping رو بر میگردونه . Priority Grouping یعنی چند تا بیت برای preemption و چند بیت برای sub priority داریم. این تابع عددی رو برمیگردونه که برای گروه بندی بیت های اولویت در بیت های PRIGROUP در رجیستر SCB_AIRCR ثبت شدن.
خط 28 : خواندن گروه بندی اولیت های اینتراپت ها
تابع NVIC_EncodePriority
ورودی دوم تابع NVIC_SetPriority رو با استفاده از تابع NVIC_EncodePriority میسازیم. این تابع سه تا ورودی داره که ورودی اولش رو با تابع NVIC_GetPriorityGrouping ساختیم و ورودی دوم و سومش هم به ترتیب preemption و sub priority هستند.
تابع NVIC_SetPriority
با استفاده از این تابع اولیت اینتراپت خط صفر در پریفرال EXTI رو تنظیم میکنیم. ورودی اول شماره اینتراپت هست و ورودی دوم اولیت که با تابع قبلی ساختیم.
خط 29 : مشخص کردن اولیت بندی اینتراپت EXTI0
تابع NVIC_EnableIRQ
این تابع یک ورودی داره که شماره اینتراپت هست و با این تابع میتونیم اینتراپت ها رو در پریفرال NVIC فعال کنیم.
خط 31 : فعال کردن اینتراپت EXTI0 در پریفرال NVIC
پین PA0 در میکروکنترلر STM32F103C8 در حالت اینتراپت خارجی در لبه ی بالارونده تنظیم شد.
0 Comments