EEM-465 Gömülü Sistemler
2022-2023 Güz Dönemi Ders 4
RCC_AHB1 yazmacı için makro tanımlama
#define RCC_AHB1ENR (*((int*)0x40023830))
int main(){
RCC_AHB1ENR |= 1<<3;
}
LED yakmak için gereki bilgiler
- GPIO portları AHB1 veri yoluna bağlıdır. Bundan dolayı RCC’nin AHB1’le ilgili yazmacında kullanacağımız GPIO birimini etkinleştirmemiz gerekiyor.
- Kart üzerindeki LEDler D portunun 12, 13, 14 ve 15. pinlerine bağlıdır.
- RCC_AHB1ENR yazmacında D portunu etkinleştirmek için bu yazmacın 3. biti set edilir.
- RCC’nin başlangıç adresi 0x40023800
- RCC_AHB1ENR yazmacının ofseti (göreceli adresi) 0x30 dolayısıyla bu yazmacın adresi 0x40023830
- Örneğin 13. pine bağlı olan LEDi yakalım (PD13). Bu pinin modunu output olarak ayarlamak gerekiyor.
- GPIOD’nin başlangıç adresi: 0x4002 0C00
- MODER yazmacının ofseti 0’dır. Dolayısıyla D portunun MODER yazmacının adresi 0x4002 0C00
- MODER yazmacında ilgili alana 00 yazılırsa pin input moduna ayarlanır. 01 yazılırsa output moduna ayarlanır.
- D portunun MODER yazmacının reset değeri 0 olduğu için, 13. pini output modunda ayarlamak için 26. biti 1 yapmak yeterlidir.
- LEDi yakmak için ODR yazmacında 13. biti set etmek gerekli.
- Bu yazmacın ofseti 0x14 olduğundan yazmacın bellekteki adresi 0x4002 0C14
LED yakma programı
13 ve 14. pine bağlı LED’i yakmak için
int main(void){
(*((int*)0x40023830 )) |= 1<<3;
(*((int*)0x40020C00 )) |= 1<<26;
(*((int*)0x40020C00 )) |= 1<<28;
(*((int*)0x40020C14)) |= 1<<13;
(*((int*)0x40020C14)) |= 1<<14;
}
15. pine bağlı LED’i yakmak için
#define RCC_AHB1ENR (*((int*)0x40023830))
#define GPIOD_MODER (*((int*)0x40020C00))
#define GPIOD_ODR (*((int*)0x40020C14))
int main(){
RCC_AHB1ENR |= 1<<3;
GPIOD_MODER |= 1<<30;
GPIOD_ODR |= 1<<15;
}
13. pine bağlı LED’i yakmak için
#define RCC_AHB1ENR (*((int*)0x40023830))
#define GPIOD_MODER (*((int*)0x40020C00))
#define GPIOD_ODR (*((int*)0x40020C14))
int main(){
RCC_AHB1ENR |= 1<<3;
GPIOD_MODER |= 1<<26;
GPIOD_ODR |= 1<<13;
}
Derleyici optimizasyonunun kullanılmaması için volatile ifadesinin eklenmesi
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD_MODER (*((volatile int*)0x40020C00))
#define GPIOD_ODR (*((volatile int*)0x40020C14))
int main(){
volatile int i;
RCC_AHB1ENR |= 1<<3;
GPIOD_MODER |= 1<<26;
while(1){
GPIOD_ODR |= 1<<13;
for(i=0;i<1000000;i++);
GPIOD_ODR &= ~(1<<13);
for(i=0;i<1000000;i++);
}
}
4 tane LEDi yakma söndürme v1
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD_MODER (*((volatile int*)0x40020C00))
#define GPIOD_ODR (*((volatile int*)0x40020C14))
int main(){
volatile int i;
RCC_AHB1ENR |= 1<<3;
GPIOD_MODER |= 1<<24;
GPIOD_MODER |= 1<<26;
GPIOD_MODER |= 1<<28;
GPIOD_MODER |= 1<<30;
while(1){
GPIOD_ODR |= 1<<12;
GPIOD_ODR |= 1<<13;
GPIOD_ODR |= 1<<14;
GPIOD_ODR |= 1<<15;
for(i=0;i<1000000;i++);
GPIOD_ODR &= ~(1<<12);
GPIOD_ODR &= ~(1<<13);
GPIOD_ODR &= ~(1<<14);
GPIOD_ODR &= ~(1<<15);
for(i=0;i<1000000;i++);
}
}
4 tane LEDi yakma söndürme v2
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD_MODER (*((volatile int*)0x40020C00))
#define GPIOD_ODR (*((volatile int*)0x40020C14))
int main(){
volatile int i;
RCC_AHB1ENR |= 1<<3;
GPIOD_MODER |= 1<<24 | 1<<26 | 1<<28 | 1<<30 ;
while(1){
GPIOD_ODR |= 1<<12 | 1<<13 | 1<<14 | 1<<15 ;
for(i=0;i<1000000;i++);
GPIOD_ODR &= ~(1<<12 | 1<<13 | 1<<14 | 1<<15);
for(i=0;i<1000000;i++);
}
}
4 tane LEDi yakma söndürme v3
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD_MODER (*((volatile int*)0x40020C00))
#define GPIOD_ODR (*((volatile int*)0x40020C14))
int main(){
volatile int i, pin;
RCC_AHB1ENR |= 1<<3;
for(i=24;i<=30;i=i+2)
GPIOD_MODER |= 1<<i;
while(1){
for(pin=12;pin<16;pin++)
GPIOD_ODR |= 1<< pin;
for(i=0;i<1000000;i++);
for(pin=12;pin<16;pin++)
GPIOD_ODR &= ~(1<<pin);
for(i=0;i<1000000;i++);
}
}
4 tane LEDi yakma söndürme v4
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD_MODER (*((volatile int*)0x40020C00))
#define GPIOD_ODR (*((volatile int*)0x40020C14))
int main(){
volatile int i, pin;
RCC_AHB1ENR |= 1<<3;
for(pin=12;pin<16;pin++)
GPIOD_MODER |= 1<<pin*2;
while(1){
for(pin=12;pin<16;pin++)
GPIOD_ODR |= 1<< pin;
for(i=0;i<1000000;i++);
for(pin=12;pin<16;pin++)
GPIOD_ODR &= ~(1<<pin);
for(i=0;i<1000000;i++);
}
}
LEDleri sırayla yakma söndürme
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD_MODER (*((volatile int*)0x40020C00))
#define GPIOD_ODR (*((volatile int*)0x40020C14))
int main(){
volatile int i, pin;
RCC_AHB1ENR |= 1<<3;
for(pin=12;pin<16;pin++)
GPIOD_MODER |= 1<<pin*2;
while(1){
for(pin=12;pin<16;pin++){
GPIOD_ODR |= 1<< pin;
for(i=0;i<1000000;i++);
GPIOD_ODR &= ~(1<<pin);
for(i=0;i<1000000;i++);
}
}
}
LEDleri sırayla yakma
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD_MODER (*((volatile int*)0x40020C00))
#define GPIOD_ODR (*((volatile int*)0x40020C14))
int main(){
volatile int i, pin;
RCC_AHB1ENR |= 1<<3;
for(pin=12;pin<16;pin++)
GPIOD_MODER |= 1<<pin*2;
while(1){
for(pin=12;pin<16;pin++){
GPIOD_ODR |= 1<< pin;
for(i=0;i<1000000;i++);
GPIOD_ODR &= ~(1<<pin);
}
}
}
LEDleri sırayla yakma, sırayla söndürme
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD_MODER (*((volatile int*)0x40020C00))
#define GPIOD_ODR (*((volatile int*)0x40020C14))
int main(){
volatile int i, pin;
RCC_AHB1ENR |= 1<<3;
for(pin=12;pin<16;pin++)
GPIOD_MODER |= 1<<pin*2;
while(1){
for(pin=12;pin<16;pin++){
GPIOD_ODR |= 1<< pin;
for(i=0;i<500000;i++);
}
for(pin=12;pin<16;pin++){
GPIOD_ODR &= ~(1<<pin);
for(i=0;i<500000;i++);
}
}
}
Buton kontrollü, LEDleri sırayla yakma, sırayla söndürme
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD_MODER (*((volatile int*)0x40020C00))
#define GPIOD_ODR (*((volatile int*)0x40020C14))
#define GPIOA_IDR (*((volatile int*)0x40020010))
int main(){
volatile int i, pin;
RCC_AHB1ENR |= 1<<3 | 1<<0;
for(pin=12;pin<16;pin++)
GPIOD_MODER |= 1<<pin*2;
while(1){
if(GPIOA_IDR & 1<<0){
for(pin=12;pin<16;pin++){
GPIOD_ODR |= 1<< pin;
for(i=0;i<500000;i++);
}
for(pin=12;pin<16;pin++){
GPIOD_ODR &= ~(1<<pin);
for(i=0;i<500000;i++);
}
}
}
}
Yapı işaretçisi ile LED yakma söndürme
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD ((GPIO*)0x40020C00)
typedef struct{
volatile int MODER;
volatile int a;
volatile int b;
volatile int c;
volatile int d;
volatile int ODR;
} GPIO;
int main(){
volatile int i, pin;
RCC_AHB1ENR |= 1<<3;
GPIOD->MODER |= 1<<30;
while(1){
GPIOD->ODR |= 1<<15;
for(i=0;i<1000000;i++);
GPIOD->ODR &= ~(1<<15);
for(i=0;i<1000000;i++);
}
}
Buton kontrollü LED yakma söndürme
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOA_IDR (*((volatile int*)0x40020010))
#define GPIOD ((GPIO*)0x40020C00)
typedef struct{
volatile int MODER;
volatile int a;
volatile int b;
volatile int c;
volatile int d;
volatile int ODR;
} GPIO;
int main(){
volatile int i, pin;
RCC_AHB1ENR |= 1<<3 | 1<<0;
GPIOD->MODER |= 1<<30;
while(1){
if(GPIOA_IDR & 1<<0){
GPIOD->ODR |= 1<<15;
for(i=0;i<1000000;i++);
GPIOD->ODR &= ~(1<<15);
for(i=0;i<1000000;i++);
}
}
}
A ve D portunun yapı işaretçisi ile kullanımı, buton kontrollü LED yakma söndürme
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOA_IDR (*((volatile int*)0x40020010))
#define GPIOD ((GPIO*)0x40020C00)
#define GPIOA ((GPIO*)0x40020000)
typedef struct{
volatile int MODER;
volatile int a;
volatile int b;
volatile int c;
volatile int IDR;
volatile int ODR;
} GPIO;
int main(){
volatile int i, pin;
RCC_AHB1ENR |= 1<<3 | 1<<0;
GPIOD->MODER |= 1<<30;
while(1){
if(GPIOA->IDR & 1<<0){
GPIOD->ODR |= 1<<15;
for(i=0;i<1000000;i++);
GPIOD->ODR &= ~(1<<15);
for(i=0;i<1000000;i++);
}
}
}
A ve D portunun yapı işaretçisi ile kullanımı, buton kontrollü sıra ile LED yakma sıra ile LED söndürme
#define RCC_AHB1ENR (*((volatile int*)0x40023830))
#define GPIOD ((GPIO*)0x40020C00)
#define GPIOA ((GPIO*)0x40020000)
typedef struct{
volatile int MODER;
volatile int a;
volatile int b;
volatile int c;
volatile int IDR;
volatile int ODR;
}GPIO;
int main(){
volatile int i, pin;
RCC_AHB1ENR |= 1<<3 | 1<<0;
for(pin=12;pin<16;pin++)
GPIOD->MODER |= 1<<pin*2;
while(1){
if(GPIOA->IDR & 1<<0){
for(pin=12;pin<16;pin++){
GPIOD->ODR |= 1<< pin;
for(i=0;i<500000;i++);
}
for(pin=12;pin<16;pin++){
GPIOD->ODR &= ~(1<<pin);
for(i=0;i<500000;i++);
}
}
}
}