STM32 StdPeriph ile ODR ve IDR Register Kullanımı
Herkese merhabalar, bu yazımızda sizlerle STM32F4 serisi işlemcilerde GPIO pinlerinin tamamının çıktılarının ve girdilerinin tutulduğu Register değerleri okunacaktır.Hadi başlayalım.
İlk olarak ODR ve IDR registerları nedir
Bu çalışmamızda STM32F429 Nucleo kartımızı kullanacağız.Input ve Output stateleri okumak ve değiştirmek için Mavi User butonu ve Yeşil Ledi kullanacağız.
Görüldüğü üzere ilgili registerların son 16-bit değerleri bizim ihtiyacımız olan bitlerdir. Şimdi bu registerları kullanarak örneklerimize geçelim.
GPIO_InitTypeDef GPIO_StructureLed;
GPIO_InitTypeDef GPIO_StructureButton;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_StructureLed.GPIO_Mode = GPIO_Mode_OUT;
GPIO_StructureLed.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_7 | GPIO_Pin_14 ;
GPIO_StructureLed.GPIO_OType = GPIO_OType_PP;
GPIO_StructureLed.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &GPIO_StructureLed);
GPIO_StructureButton.GPIO_Mode = GPIO_Mode_IN;
GPIO_StructureButton.GPIO_Pin = GPIO_Pin_13;
GPIO_StructureButton.GPIO_OType = GPIO_OType_PP;
GPIO_StructureButton.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_StructureButton.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOC, &GPIO_StructureButton);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13))
GPIO_SetBits(GPIOB,GPIO_Pin_0 | GPIO_Pin_7 | GPIO_Pin_14 );
else
GPIO_ResetBits(GPIOB,GPIO_Pin_0 | GPIO_Pin_7 | GPIO_Pin_14);
}
0x4081 = 0b0100000010000001
Görüldüğü üzere binary karşılığı olan değerin 0. 7. ve14. bitleri HIGH durumdadır. Bu GPIOB pinlerinin 0. 7. ve 14. pinleri HIGH durumdadır demektir.
0xDF4F = 0b 1101 1111 0100 1111
0xFF4F = 0b 1111 1111 0100 1111
Görüldüğü üzere 0 olan 13. bit 1 olarak değişmiştir. Yani LOW durumdan HIGH duruma geçmiştir. Dolayısıyla buton basılı ve pin aktifleştirildi anlamına gelmektedir.
Aynı zamanda bu değerleri C programlama dilindeki bit kaydırma işlemleri ve maskeleme ile gerçekleştirebiliriz. Tek yapmamız gereken register değerlerini maskelemek. Maskeleme yaparken takip ettiğimiz değere dikkat etmeliyiz.
#include <stdbool.h> //bool tipi kullanabilmek için bu header a ihtiyacımız bulunmaktadır
bool checkMaskForIDR(uint16_t IDR_Value, uint16_t mask_input){
return IDR_Value & mask_input;
}
Aynı zamanda pin çıktılarını direk olarak ODR registeri ile de değiştirebiliriz. Bu registera atanan değer yardımı ile yeni çıktılarımızı belirlemekteyiz. Bu esnada gerekli pinler haricindeki pinlere bir değişiklik yapmamaya dikkat etmeliyiz. Çünkü diğer pinler başka amaçlar için kullanılıyor olabilmektedir. Bu yüzden önemli olan pinleri maskeleyerek registera atama yapılmalıdır.
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13))
GPIOB->ODR = 0x00004081;
else
GPIOB->ODR = 0x00000000;
Eğer sadece gerekli olan pinleri değiştireceksek ilgili registeri o anki değeri ile atamak istediğimiz değeri OR maskesi yapmamız yeterlidir. Bu sayede sadece istediğimiz pinler değişecektir.
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13))
GPIOB->ODR |= 0x00004081;
else
GPIOB->ODR |= 0x00000000;
Bu yazımızda bu kadar.
Burak Hamdi TUFAN.
Comments