STM32F1 HAL Library Sorularım

Başlatan Mucit23, 01 Ağustos 2017, 13:48:46

Mucit23

Selamlar,

Ufaktan STM32F10x'de HAL library'ye projelerimi geçirmek istiyorum. Fakat bazı endişelerim var. Yapıyı henüz tam çözemedim.

Örneğin STD Peripheral library'de kesmelerin hepsi stm32f1xx_it.c dosyasına düşüyordu. HAL library'de de bu durum mevcut ama kesme fonksinu içerisinde ekstradan başka yerlere gidiyor program. TIM kesmesi için aşağıdaki gibi bir yapı kullanılmış.
Alıntı Yapvoid TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */

  /* USER CODE END TIM2_IRQn 0 */
  HAL_TIM_IRQHandler(&htim2);
  /* USER CODE BEGIN TIM2_IRQn 1 */

  /* USER CODE END TIM2_IRQn 1 */
}

Anladığım kadarıyla TIM ile ilgili bütün kesmeler buraya düşüyor, HAL_TIM_IRQHandler fonksiyonunun içinde ise kesme kaynağına göre farklı fonksiyonlara göndermiş. Burayı anlamıyorum. Bana örneğin TIM Update kesmesi lazım. Kesme nereye düşecek? ben kodumu nereye yazacağım?

Buna benzer aklımda bir sürü sorun var. Tamam CubeMX ile ilk başta bütün ayarları yapıyorum. herşey mükemmel gidiyor. Ama kodu kişiselleştirmek istersem eğer bir sürü soru işareti ile karşılaşıyorum. Bu konularda rehberlik edebilecek birisi varmı?

CoşkuN

Temelde bu HAL gibi kütüphaneler işleri kolaylaştırmak için yazılmış olsa da tam tersi şekilde işleri daha da zorlaştırabiliyor. Özellikle yeni başlayanlar için anlaması oldukça güç olabiliyor. Dökümantasyonlarının da tam olmaması bir etken.
Tavsiyem önce çevrebiriminin çalışmasını iyi anlamaya çalışıp sonra HAL'de bu nasıl yapılmışa bakman. Zaten o zaman HAL'i kullanmaya da gerek kalmayabilir bazen.


TIM2 ile ilgili bütün kesmeler için o handler çağrılacak. Bunun içerisinde ilgilendiğin kesmenin bayrağını kontrol edip o kesme gelmiş mi anlayabilirsin. Bütünüyle HAL fonksiyonlarını kullanmak zorunda değilsin.

volkanunal

Ben cubemx değil de setupları  kendim hazırlarken ;
IRQ kısmını main.c içerisinde kullanabiliyorsunuz , orası interrupta girdiği kısım olduğu için kişiselleştirmek istediğinizde  yapılması gereken  işlemi oraya girebilirisiniz.
Dilerseniz stm32f4xx_it.c içerisinde de kullanabilirsiniz  ,  stm32f4xx_it.h tabi burada prototipi olması gerekiyor yoksa hata veriyordu hatırladığım kadarıyla.
Primum nil nocere

Mucit23

Hocam yarı STD Yarı HAL kütüphanelerini kullanmak pek mümkün değil gibi. Özellikle şu MSP dosyasını anlamıyorum. Hangi donanım kullanılırsa kullanılsın GPIO ayarları ve clock ayarları burada yapılıyor. Ben öyle yapmak istemiyorum. Örneğin Timer_Configuration diye bir fonksiyon oluşturayım ve Baştan aşağı GPIO, NVIC, ve TIMER ayarlarını bu fonksiyon içerisinde yapayım diyorum.

ST gerçekten birşeyleri iyileştireyim derken bir yandan kodları daha anlaşılmaz bir hale getirmiş. Yada bende sorun var.

Sırf STD library ile USB de sorun yaşıyorum diye üzerinde çalıştığım bütün projeyi HAL library'de çalışacak şekilde düzenliyorum. Belki bu vesileyle Hal library'e alışmış olurum.

yldzelektronik

#4
@Mucit23  HAL da kesmeler için mantık şu;


"Kesme mi geldi kardeşim? Tamam hiç sorun değil ben handler üzerinden işi devir alır sana ihtiyacın kadar iş bırakırım.Al sana xxx callback fonksiyonu.Aha sana parametresi de bu (uart gibi mesala. var ise), al ne istiyorsan yap.Kesmeyi tekrar açmak mı istiyorsun.Aç kardeşim callback içinde.İşin bitince ben gerisini hallederim.Flag temizlemekmiş, vırtmış zırtmış ben çözerim sen keyfine bak.".
Mesela size uart rx mi lazım.siz ilgili call back fonsiyonu tanımlayın gerisini düşünmeyin.
Başlarda ben de çok kızmıştım bu hal libe ama gerçekten birçok dertten sizi kurtarıyor. Ayrıca eğer stdlib gibi handler yazmak da mümkün.

Ekleme: mesela void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) bu timer ile ilgili bir call back fonsiyonu.

Yani özetle hal lib size bir abstraction sağlıyor. üst tarafta istediklerinizi yapıyorsunuz.ama aşağı katman ile uğraşmıyorsunuz fazla.Yada iddiaları bu.
H(ardware)A(bstraction)L(ayer)
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mucit23

Biraz biraz alışıyorum gibi. Mantığını anladım. Aslında sadece fonksiyon isimleri farklı. Yapı biraz daha farklı.

USB Endpoint kesmeleri nerelerde oluşuyor? Onu bulamadım.

Mesela Sen Timer Update kesmesi için HAL_TIM_PeriodElapsedCallback fonksiyonu tanımlanması gerektiğini söyledin. Bunu bende bir örneğe bakarak anladım. Ayrıca HAL_TIM_IRQHandler fonksiyonu içerisindede bu fonksiyonun çağrıldığını görüyorum.

Peki diğer donanımlar için teker teker bakacağım bir yer varmı? Şuan USB ile uğraştığım için onun zerinden sorayım. Eski kütüphanede usb_end.c dosyası içinde En son gelen paketleri alıyordum. Herhangi bir paket gelirse en son buraya kesme düşüyordu. Buradan verimi alıyordum. Burada nasıl olacak?

Son olarak USB HID örneğini denediğimde Bilgisayar cihazımı USB Mouse olarak algılıyor. Bu durum nasıl düzeltirlir? Descriptor ile ilgili muhtemelen ama pek anlayamadım açıkçası.


yldzelektronik

@Mucit23  Usb de CDC den öteye geçmedim ve onu da detaylı incelemedim henüz.Ama HAL ile ilgili her şeye User Guide üzerinden erişebilirsin diye düşünüyorum.


Usb ile ilgili sorularını ben cevaplayamayacağım maalesef.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

muhittin_kaplan

@Mucit23  hocam desc dosyasında keyboard mouse ayarı vb vardır. yada vid ve pid yi değiştiriniz. (eğer desc dosyasında mouse olarak tanıtıldıysa bir işe yaramaz.)

muhittin_kaplan


Mucit23

HAL Library'de MikroSaniye Bazında gecikme yapılabiliyormu mevcut durum için? Daha önce STD Library'de SysTick için harici bir kütüphane kullanıyordum. Baya güzeldi.  HAL library'de sanırım Sadece HAL_Delay var. Oda Milisaniye cinsinden Gecikme yapıyor. 

baran123


mylord92

Bir Timer kurarak kendiniz hazırlayabilirsiniz  :)

volkanunal

Alıntı yapılan: baran123 - 03 Ağustos 2017, 18:34:21
Benim bildiğim standart bir uDelay yok ama aratınca şu çıkıyor.
https://community.particle.io/t/delay-microseconds-function-solved/13138/3

SysTick /1000 yaptığımız da saniye cinsinden değer alıyorsak 10^6 gibi değerlere bölsek elde edebiliriz sanırım
Primum nil nocere

kenan_re

Başlığı görünce mutlu oldum :)))))


Aynı kafa karışıklığını tek ben yaşamamışım. Hala şaşkın şaşkın bakınıyorum.