آموزش stm32 قسمت پنجم(بررسی ریجستر های GPIO میکرو STM32F103RET6 )
کار با رجیستر های GPIO
توابع HAL دستوراتی را برای تغییر وضعیت پین ها و خواندن وضعیت پین ها در اختیار ما قرار داده پس این توابع واسطه بین ما و رجیستر های اصلی میکرو می باشد.گاهی اوقات این واسطه گری باعث کاهش سرعت انتقال دیتا به GPIO ها و یا کاهش سرعت خواندن وضعیت GPIO ها می شود و ما را مجبور به استفاده مستقیم از ریجیستر های اصلی میکرو را می کند.
این اتفاق بیشتر مربوط به دستورات HAL مربوط GPIO ها است ولی در دیگر امکانات میکرو تقریبا چنین مشکلاتی نداریم.
ریجیستر های GPIO عبارتند از:
۱٫GPIOx_CRL : Port configuration register low
این رجیستر برای مشخص کردن وضعیت ورودی و خروجی و مد های کاری پورت ها است و ۳۲ بیتی می باشد.(پین های ۰ تا ۷).
۲٫GPIOx_CRH :Port configuration register high
این رجیستر برای مشخص کردن وضعیت ورودی و خروجی و مد های کاری پورت ها است و ۳۲ بیتی می باشد.(پین های ۸ تا ۱۵)
۳٫GPIOx_IDR :Port input data registe
این رجیستر فقط برای خواندن وضعیت پورت ها است و ۳۲ بیتی می باشد. ۱۶ بیت اول برای خواندن وضعیت پین و ۱۶ بیت آخر رزور است.
۴٫GPIOx_ODR : Port output data register
این رجیستر برای مقدار دهی به پورت ها است و ۳۲ بیتی می باشد. ۱۶ بیت اول برای ست و ریست پین ها و ۱۶ بیت آخر رزور است.
۵٫GPIOx_BSRR : Port bit set/reset register
این رجیستر برای صفر و ست کردن پین ها است و ۳۲ بیتی می باشد.۱۶ بیت اول فقط برای ست کردن و ۱۶ بیت بعد برای صفر کردن پین ها است.
نکته : در ۱۶ بیت آخر شما با مقدار یک گذاشتن در بیت ها پین ها را صفر می کنید.
۶٫GPIOx_BRR : Port bit reset register
این رجیستر فقط رای صفر کردن پین ها است و ۳۲ بیتی می باشد که ۱۶ بیت اول برای صفر کردن و ۱۶ بیت آخر رزرو است.
نکته : تفاوت دو رجیستر آخر با رجیستر GPIOx_ODR این است که رجیستر GPIOx_ODR برای تغییر وضعیت پورت ها است اما آن دوتای دیگر برای تغییر وضعیت پین ها به صورت تکی است و همچنین دو رجیستر آخر سرعت بیشتری نسبت به رجیستر GPIOx_ODR دارند.
به عنوان مثال تابع زیر را ببینید برای انتقال دیتا به پایه های OLED 0.96 است ( با رجیستر های اصلی میکرو )
1 2 3 4 5 6 7 8 9 10 11 |
void LCD_X_8080_8_Write00(unsigned char c) { GPIOC->CRL = 0x33333333; GPIOB->BSRR = RD_Pin; GPIOB->BSRR = (uint32_t)DC_Pin « 16; GPIOB->BSRR = (uint32_t)CS_Pin « 16; GPIOB->BSRR = (uint32_t)RW_Pin « 16; GPIOC->ODR = c; GPIOB->BSRR = RW_Pin; GPIOB->BSRR = CS_Pin; GPIOB->BSRR = DC_Pin; } |
حال دستورات با توابع HAL به صورت زیر است
1 2 3 4 5 6 7 8 9 10 11 |
void LCD_X_8080_8_Write00(unsigned char c) { GPIOC->CRL = 0x33333333; HAL_GPIO_WritePin(RD_GPIO_Port, RD_Pin, 1); HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, 0); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, 0); HAL_GPIO_WritePin(RW_GPIO_Port, RW_Pin, 0); GPIOC->ODR = c; HAL_GPIO_WritePin(RW_GPIO_Port, RW_Pin, 1); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, 1); HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, 1); } |
به این آموزش ادامه میدین؟
اره اگه خدا بخواد حتما.
سلام و ممنون بابت آموزشتون. لطفا ادامه بدید آموزش ها تون را.
سلام،چشم ان شالله میریم جلو
سلام
مطالبتون فوق العادس! لطفا قسمت های بعدی رو هم قرار بدید
ممنونم
سلام خسته نباشید .. پرقدرت اموزش رو ادامه بدید ممنونم ..
توضیحات یخورده ساده یا کم نیس؟
چرا فعلا در حال انجام خدمت سربازی هستم،فرصتی ندارم.
سلام
ممنون از اموزشتون
یه سوال داشتم
چطوری می تونم به حداکثر ارسال و دریافت روی portb میکرو stm32f103c8 دسترسی داشته باشم
یعنی حداکثر سرعت پین ها ۵۰ مگ
متاسفانه هر کاری کردم ولی سرعت خیلی پایینه
اگر می تونید راهنمایی بفرمایید ممنون