Merhaba arkadaşlar,
Cubemx programı ile yaptığım bir uygulama var(HAL kütüphanesi), bunu standart kütüphanelerle yapmam çok zor(yapamam yani).
bir de standart kütüphane ile yaptığım başka iki uygulamam var.
HAL ile ürettiğim projede standart kütüpaneyi manuel eklemeye çalışıyorum ancak çakışmalar oluyor, daha önce böyle birşey deneyen oldu mu?
Nasıl çözebilirim bu sorunu?
Hocam denemedim de.Merak ettiğimden soruyorum std lib ile neden yapamıyosunuz.Açıkçası ben HAL e güvenip de büyük bi projede kullanamam.
Hocam yapacağımız proje normalde standartlarda yok, bu yüzden normalde HAL ile ürettiğimiz kodu da direkt kullanamıyoruz. Ama kütüphanede değişiklik yaparak çalıştırabildik.
USB ile ilgili bir proje, içindeki standart usb classları normalde işimi görmüyor. Çözümü ancak böyle sağladık.
Sorun ise standart kütüphane ile zamanında uğraşarak çözdüğümüz işleri bu projeye eklememiz gerekiyor, bu kısımları HAL ile yaparsak bizim için zaman kaybı olacak, dediğiniz gibi ben de çok güvenmiyorum, çalışacağı bile meçhul. Standart kütüphaneyi ekleyebilirsem sorunum çözülecek.
Anladım hocam.Daha önce böyle bişey denemedim.Ama üşenmeyip std lib'deki tüm fonsiyonların başına STD_ gibi bişey eklenebilir.
Aslında çok fazla değişiklik yapmama gerek kalmadı, en önemli sorun, stm32f4xx.h dosyası hem hal lib'de var hem st perb. lib.'de var bunu önlemek için
standart lib'deki bütün h dosyalarını açtım içlerinde #include "stm32f4xx.h" kısımlarını #include "PICPROJE_stm32f4xx.h" yaptım. Tabi dosyanın gerçek adını da o şekilde değiştirdim.
Bir de stm32f4xx.h dosyası ve PICPROJE_stm32f4xx.h dosyasında aynı isimde olan tanımlamalar vardı, yine başına "PICPROJE_" ekleyerek, çakışan tanımlamaları düzelttim.
Pic programlamayla uğraşıyorum bende arm a geçiş yapmak istiyorum. biraz araştırma fırsatım oldu benim gibi yeni başlayanlar için cubemx ile uygulama yapmak daha kolay gibi. en azından main kısmını aradan çıkarmış oluyorum bu sayede :) ama sizin bu hal lib. e olan güvensizliğinizin sebebi nedir? yeni başlayacak biri için neyi önerirsiniz. maalesef daha development kiti alamadığım için sadece araştırmayla yetiniyorum. açıkçası bi led yakıp söndürmüşlüğüm bile yok. onun için yanlış bir şey yazdıysam lütfen bu söylediklerimi dikkate alarak cevaplamanızı istiyorum :)
teşekkürler.
hal'i bırak std per. lib'e de güvenmiyorum. CMSIS ten öte köy yok.
Hocam ne gibi sorunlar yaşadınız da bu kadar kızgınsınız HAL ve StdPLib'e?
Hal guzelce calisiyor sikinti goremedim ben, ticari projede de kullaniyorum
en basitinden HAL ve std lib'de pinleri giriş çıkış olarak ayarlamak için bir sürü kod yazmak gerekir. aşağıdaki 8 satır kod için ne kadar uğraşcağınızı düşünün. hata olarak ben henüz bir hataya rastlamadım fakat başka forumlarda sıkıntı yaşadıklarını söyleyenler vardı, bir daha karşılaştığımda linkini eklerim buraya. hal ve std lib kullanmayın demiyorum, fakat kullanılan tüm fonksiyonların içeride ne yaptığını bilmek lazım, bu kütüphaneleri çalışmak C dilinde kendimizi geliştirmek ve daha iyi öğrenmek için de çok güzel bir kaynak.
RCC->APB2ENR = 0 |RCC_APB2ENR_IOPCEN |RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN|RCC_APB2ENR_AFIOEN;
GPIOC->CRH = 0x00200000;//pinC13 çıkış
GPIOA->CRH = 0x000034B0;//pinA11 çıkış, pinA9 pinA10 uart tx rx
GPIOA->CRL = 0x88888888;//A0---A7 anahtar girisleri
AFIO->EXTICR[1] &=0xFFFF0000; //exti port source exti0-exti3 (pinA0-dan pinA3'e)
AFIO->EXTICR[2] &=0xFFFF0000; //exti port source exti4-exti7 (pinA4-den pinA7'ye)
//interrupt mask register---rising trigger register
EXTI->IMR |= 0x000000FF;
EXTI->RTSR |= 0x000000FF;
Aradan zaman geçmiş ama olsun. HAL ve SPL nin birbirine göre üstünlükleri var. Hala Standart Peripheral Library leri tercih eden bir sürü kullanıcı mevcut. Fakat artık ST, HAL e destek veriyor. Belki bir zaman geçmek gerekecek. Şu sıralar uğraştığım bir problemle araştırma yaparken bu konuya denk geldim. :) HAL ile yaptığım i2c oled uygulamasını, std peripheral library ile bir türlü yapamadım. i2c biriminin clock unun aktif ettiğimde, busy biti 1 de çakılı kalıyor. HAL ile yaptığım projedeki aynı adımları uygulasam bile maalesef çözülmedi.
std lib ile i2c çalıştırabilen var mı ? ???
Alıntı yapılan: muhittin_kaplan - 09 Temmuz 2017, 14:37:35
std lib ile i2c çalıştırabilen var mı ? ???
hocam ben arada yanlışlıkla çalıştırabiliyorum ;D
HAL iyi güzelde flash belkeği sömürüyor.
(http://i.hizliresim.com/RPPdLZ.jpg)
Alıntı yapılan: muhittin_kaplan - 09 Temmuz 2017, 14:37:35
std lib ile i2c çalıştırabilen var mı ? ???
@muhittin_kaplan Hocam madem bu kadar problemli. Neden bir güncelleme yapmıyorlar. HAL ile bu i2c güzel çalışabiliyorsa, sıkıntının nerede olduğu aşikar... Çözülebilmesi lazım aslında. :-\
Ben nezaman i2c calismasi yapsam beceremedim std ile, gittim register seviyesi kodladim.
Hata bende de olabilir.
Yapılan şeyler aynı aslında. Ama problem olmaması lazım. Büyük bir ihtimalle stm32 lerin i2c birimlerinde bug var. Ve hal ile bunu çözmüşler. O kadar. Araştırma yaparken, bu tarz sorunla karşılaşanlara çok denk geldim. Genelde de bu busy flag sorunu. Errata sheet lerde bununla alakalı bir prosedür bile var.
Alıntı yapılan: okg - 09 Temmuz 2017, 16:41:19hocam ben arada yanlışlıkla çalıştırabiliyorum ;D
Merhaba,
Şu anda ben de spl (standart perip. lib.) kullanarak I2C çalıştırmaya çalışıyorum. Simülasyonu proteus üzerinden deniyorum. Kodu kendim yazdım, hazır kodlar kullandım fakat bir türlü olmadı. İnternette araştırırken yorumlarınızı gördüm. Elinizde hazır kod varsa paylaşır mısınız?
Alıntı yapılan: muhittin_kaplan - 09 Temmuz 2017, 20:35:12Ben nezaman i2c calismasi yapsam beceremedim std ile, gittim register seviyesi kodladim.
Hata bende de olabilir.
Register seviyesinde ben de denedim ama başarılı olamadım. Elinizde hazır bir kod varsa siz de paylaşır mısınız?
Teşekkürler.
Şu dersi izleyerek I2C registerlarına erişerek kodunuzu yazabilirsiniz:
https://www.udemy.com/course/embedded-systems-bare-metal-programming/
I2C'nin tam anlamda nasıl çalıştığını anlamak için ise şu dersi önerebilirim:
https://www.udemy.com/course/mastering-microcontroller-with-peripheral-driver-development/
Alıntı yapılan: ibocakir - 12 Ocak 2020, 00:12:19Şu dersi izleyerek I2C registerlarına erişerek kodunuzu yazabilirsiniz:
https://www.udemy.com/course/embedded-systems-bare-metal-programming/
I2C'nin tam anlamda nasıl çalıştığını anlamak için ise şu dersi önerebilirim:
https://www.udemy.com/course/mastering-microcontroller-with-peripheral-driver-development/
Teşekkürler ama bunun için bu kadar para vermeye gerek yok. Zaten nasıl çalıştığını anladım biliyorum. Dediğim gibi kendim de yazdım hazır kodları da kullandım fakat olmadı. Bu konuda da yazanlar olmuş I2C'de sıkıntı var diye. O yüzden çalışır bir kod arıyorum veya kendi kodumu da paylaşabilirim.
Kendi kodumdaki sıkıntıyı da yazayım. Start generation yaptıktan sonra gördüğüm kadarıyla start bit set edilmiyor. Yani en baştan hata alıyorum. Aşağıda kodun bir parçasını paylaşıyorum. Son döngüde sonsuz loop'a giriyor.
// Wait until I2Cx is not busy anymore
while (I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
// Generate start condition
I2C_GenerateSTART(I2Cx, ENABLE);
while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
günceldir.
HAL ile örnek yapmıştım bir ara
https://www.youtube.com/watch?v=C12m2lpSHqc
https://yadi.sk/d/XZaPISO13At8PN
Kutuphane yerine dogrudan registerler lara bakin.
Alıntı yapılan: digiman - 12 Ocak 2020, 18:49:23Kutuphane yerine dogrudan registerler lara bakin.
Denedim, fakat olmadı ne yapsam aynı yerde hata alıyorum. Start condition verdikten sonra start bit set edilmiyor. Sanki I2C peripheral hiç açılmıyor gibi bir durumla karşılaşıyorum.
Alıntı yapılan: muhittin_kaplan - 12 Ocak 2020, 18:48:27HAL ile örnek yapmıştım bir ara
https://www.youtube.com/watch?v=C12m2lpSHqc
https://yadi.sk/d/XZaPISO13At8PN
Teşekkürler. CubeMx düzgün çalışmadığı için silmiştim. Tekrar yükleyip bir de ordan deneyeceğim. Açıkcası Cubbemx'i hiç sevmiyorum ama deneyeceğim.
kullandığınız kütüphaneyi bilmiyorum.
yalnız I2C standartlaşmış bir seri haberleşme olduğundan, aşağıdaki toplam 7 fonksiyonla haberleşme sağlanıyordur diyebilirim.
sizin kütüphane içerisinde altdaki fonksiyonların hepsi eksiksiz olarak tanımlanmış mı?
sizin kütüphanedeki yazımları tam olarak böyle olmayabilir, ama bunlara benzer yazımda olmalı ve işlevleri aynı bunlar gibi olmalı diyebilirim.
Bu fonksiyonların içerisinde de bir kaç satır I2C registerleri ve while(x) gibi bekleme döngüsü olmalı.
Ben sizin kütüphanenizi kullanmadığımdan fonksiyon içlerindeki register kod satırlarını burada karışıklık olmasın diye göstermedim.
Sizdeki I2C fonksiyonlarını ve bu fonksiyonların içerisindeki register / wehile(x) yazım kodlarını görebilirsek belki daha fazla yardımcı olunabilir.
StartI2C_(void);
StopI2C_(void);
AckI2C_(void);
NotAckI2C_(void);
RestartI2C_(void);
MasterWriteI2C_(unsigned char data_out);
MasterReadI2C_(void);
Bunların dışında Main içerisinde I2C baudrate ve control register ayarları gerektiği gibi yapılması gerekir.
Bunların haricinde gerisi sadece okuma ve yazma rutin kodları şeklinde ve okuduğunuzu atayacağınız sizin tanımladığınız bir değişken kullanımı halinde olması yeterli olmalı diye düşünüyorum.
Okuma yazma işlemleri mikroişlemci ile haberleşme yapacağınız çipin özelliklerine göre değişebilir.
Bu kısım haberleşilecek çipe göre değiştiğinden while(1) içerisindeki kullanıcı kodlarınıda henüz değinmedim.
Siz öncelikle I2C kütüphane içerisinde yukarıdaki kontrol fonksiyonlarını ve bu fonksiyonların içerisindeki kod-komut bloklarını görebiliyor musunuz? Açıkça görülüyorsa sonuca ulaşılması daha kolay olacaktır.
Daha farklı bir C kütüphanesinde CAN SPI ve I2C kütüphanesi vardı. Ama içerisindeki fonksiyon ve bunların açılımlarına ulaşılamıyordu.
Sizdeki kütüphanede her şey açıkça yazılıdır umarım. Yazılıysa çözüm çok zor olmasa gerek.
genelde en çok yapılan hatayı yukarıdaki fonksiyon içlerinde bulunan while(x) ile beklenilmesi gereken kısımlar oluyor.
bu uygulanmadığında sürekli sağlıklı bağlantı ya kurulamıyor yada kopuk bir şekilde kurulabiliyor. olarak gördüm ben.