STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

z

Alıntı yapılan: EMG81 - 16 Aralık 2011, 21:01:18
Temel C ile sorunum yok İleri C ile sorunlarım var.

Tamam orda sorabilirsin. Ileri seviye sorularini merak ettim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

EMG81

#496
Mesela anlıyamadığım bikaç program satırı paylaşayım. (bu satırları bikaç mesaj yukarıdan çaldım.)

DMA1_Stream4->PAR=(int)&USART3->DR;// Nereye yazacagiz      // DMA1_Stream4 ın PAR registerına USART3->DR ne yapılmış ? "(int)&" C dilinde ne işlem yapmakta?
DMA1_Stream4->FCR&=~0xFFFFFF40;                                          // "&=~" bu işlem C dilinde neler yapar ?



&=~ işlemi
&= şeklinde yada =~ şeklinde kullanmış idim. ama tümleşik olarak ilk kez görüyorum.

(int)& bunu ilk kez şuan görüyorum.

z

#497
A&=~B demek

A = A AND (NOT B) demek.

A registerinde bazi bitlerin degerini degistirmek istemiyoruz fakat bazilarini sifir yapmak istiyoruz diyelim.

Ornegin 16 bitlik registerin en buyuk 4 bitini 0 yapmak isteyelim.

A = A & 0x0FFF yazabiliriz.

Fakat bunun yerine A = A &  (~0xF000) da yazabiliriz. Ikisi de ayni isi yapar.

Maske degerini 1 secmek hosuna gidiyorsa ~0xF000 kullanirsin.

Bu konuyu zamaninda ele almistik. https://www.picproje.org/index.php/topic,35908.0.html   Ne zaman OR ne zaman AND? Basligina bakmamissin.

---------------

Bir degiskenin onune & isareti getirirsen bu degiskenin adresinin kullanilacagini soyler.

Ornegin A=&B;   A pointerine B nin adresini atar. (Burada A pointer olmak zorunda)

Eger A pointer değil bir degiskense yada bir registerse fakat buna B nin adresini atamak istiyorsak
bu durumda (int) onekeini getiririz. Bu, &B adresinin integer bir degiskene yuklenecegi anlamina gelir.

-----------------------

Aslinda C derleyicinin kurallarini koyanlara kiziyorum. Esitligin sol tarafi pointer ise &B yi ata. Fakat esitligin sol tarafi pointer değilse esitligin soltarafinin tipi neyse ona cevir ata neden bu isi bana birakiyorsunuz.  Eger ben ozellikle tip degistirmek istiyorsam (int) yazayim bu kabul.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

bunalmis hocam, sizde C dilini yazanlara kizacaginiza Cnin object'ine uygun D diye bir dil yazin, bu problemleri halledin diyecektimki D dilinin zaten yazildigini hatirladim, o zaman sizede E dilini yazmak kaliyor.  :P
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Alıntı Yapinanın onlar da en az sizin kadar bu konuları düşünmüşlerdir bunun standardını belirlerken..

Kesinlikle oyle. Bu islere bir kisi değil kurul karar veriyordur. Fakat mantik ne merak ediyorum.

Kizdigimi soyledigim ornekte haksizmiyim.

A unsigned integer bir degisken olsun.  Islemcimizin adres busi da unsigned int degerlerle ifade ediliyor olsun.
B ister char ister unsigned char ister short ister unsigned short olsun.

A=&B yazmamda ne sakinca olabilir? Adamlar illa A=(unsigned int)&B yazmami istiyorlar. Gerekce ne? Neyi dusunmusler.

A=&B + 1 yazmamda ne sakinca var?

Gecenlerde benzer bir konu konusmustuk.

A 64 bit degiskense, B 32 bit degiskense

A = B * 3 islemi otomatik olarak 64 bit sonuc uretecek sekilde A ya atanmali. Ama illede digerlerini de 64 bite zorla deniyor.

Kardesim ben 32 bit A degiskenine B*3 islemini atacaksam tamam o zaman int on eki ile zorlayayim.

Bu sorunun kesin cevabi olmali.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

@bunalmis hocam bahsettiginiz konu "type conversion" bahsine girer ve degisik dillerde implicit ve explicit type conversion/casting diye bakmaniz lazim.

Maalesef bu konuda tek bir genel/kabul edilen kurallar yoktur. Ne yaptiginizi bilerek Cde tanimli olan sekil bazen unintiutive (sezgisel olmayan) durumlara sebep olabilir.

implicit type conversion in c diye bakabilirsiniz.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

EMG81

#501
Alıntı yapılan: bunalmis - 16 Aralık 2011, 21:23:20
A&=~B demek

A = A AND (NOT B) demek.

A registerinde bazi bitlerin degerini degistirmek istemiyoruz fakat bazilarini sifir yapmak istiyoruz diyelim.

Ornegin 16 bitlik registerin en buyuk 4 bitini 0 yapmak isteyelim.

A = A & 0x0FFF yazabiliriz.

Fakat bunun yerine A = A &  (~0xF000) da yazabiliriz. Ikisi de ayni isi yapar.

Maske degerini 1 secmek hosuna gidiyorsa ~0xF000 kullanirsin.

Bu konuyu zamaninda ele almistik. https://www.picproje.org/index.php/topic,35908.0.html   Ne zaman OR ne zaman AND? Basligina bakmamissin.

---------------

Bir degiskenin onune & isareti getirirsen bu degiskenin adresinin kullanilacagini soyler.

Ornegin A=&B;   A pointerine B nin adresini atar. (Burada A pointer olmak zorunda)

Eger A pointer değil bir degiskense yada bir registerse fakat buna B nin adresini atamak istiyorsak
bu durumda (int) onekeini getiririz. Bu, &B adresinin integer bir degiskene yuklenecegi anlamina gelir.

-----------------------

Aslinda C derleyicinin kurallarini koyanlara kiziyorum. Esitligin sol tarafi pointer ise &B yi ata. Fakat esitligin sol tarafi pointer değilse esitligin soltarafinin tipi neyse ona cevir ata neden bu isi bana birakiyorsunuz.  Eger ben ozellikle tip degistirmek istiyorsam (int) yazayim bu kabul.

Evet. C şamatalarını ilk 2 sayfasına kadar takip edebilmiştim. Sonrada farklı konulara yönelip başlığı unutmuşum. Sonuna kadar okudum, uyguladım. Şu an Birçok soru işaretim yok olmuş durumda. Fakat her an birşeyler sorabilirim. Temkinli olmak lazım. :)

MC_Skywalker

Toplayıp bir döküman haline gitirdiğim web sitesinden alınma notlar

STANDART C PROGRAMLAMA DİLİ -------> http://hotfile.com/dl/137716505/ee6424a/STANDART_C.rar.html

mcan

#503
Selamlar ,Benim basim nette buldugum dosyalari derlemek-denemek ile dertte.
Sorun şu dosyalar derlenmiyor, sebebine gelince netten öğrenebildiğim kadarıyla cmsis ve eski dosyalar olarak buldum .
Mesela stm32f10x_conf.h dosyası 2007 tarihli ancak benim örneklerimizde kullandığım stm32f10x.h dosyası 10/15/2010 tarihli ve sürekli tanımlama hataları alıyorum... Keili tekrar mı kurmam gerek yada keildeki kütüphaneleri nasıl update ederim? Keil'e bir update kurmamız mı gerekiyor?

St nin sitesinde standart preph. lib buldum ,bununla deneyeceğim bakalım nasıl olacak.

pisayisi

rvmdk klasorleri altında keil için kod template leri vardır. oraya gerçek çalışmanızın bulunduğu main.c klasöründe bulunan bütün dosyaları source klasörüne atın. header dosyaları da varsa keil içinde ekleyin. çalıışması gerekir...
Murat

mcan

mesela stm32f10x_usart.h dosyasını projeye eklediğimizde stm32f10x_usart.c dosyasını projeye nerede dahil ediyor anlamadım?

pisayisi

resimdeki mdk arm template klasörüdür. orda main.c ile işaretlenen boşluğa örnek olarak alacağınız klasördeki bütün dosyaları  copy paste yapın üstüne yazabilirsiniz dosyaların.

keil de ilgili template aşağıdaki gibi görüncektir.orda stdperiphdriver altında usart.c olarak bahsettiğiniz bütün fimware dosyaları mevcut.


sonra keil de main.c çift tıklayın stm32f4xx_conf.h dosyasını açın
/* Uncomment the line below to enable peripheral header file inclusion */
#include "stm32f4xx_adc.h"
#include "stm32f4xx_can.h"
#include "stm32f4xx_crc.h"
#include "stm32f4xx_cryp.h"
#include "stm32f4xx_dac.h"
#include "stm32f4xx_dbgmcu.h"
#include "stm32f4xx_dcmi.h"
#include "stm32f4xx_dma.h"
#include "stm32f4xx_exti.h"
#include "stm32f4xx_flash.h"
#include "stm32f4xx_fsmc.h"
#include "stm32f4xx_hash.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_i2c.h"
#include "stm32f4xx_iwdg.h"
#include "stm32f4xx_pwr.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_rng.h"
#include "stm32f4xx_rtc.h"
#include "stm32f4xx_sdio.h"
#include "stm32f4xx_spi.h"
#include "stm32f4xx_syscfg.h"
#include "stm32f4xx_tim.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_wwdg.h"
#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
kullanmadığınız firmware için include başına yorum işareti ekletin /*
Murat

mcan

Ben özel olarak template kullanmak istemiyorum, teplate de herşey düzgün çalışıyor benim anlamak istediğim o template de bazı püf noktalar var. Mesela stm32f10x_usart.c doyasının projeye nerede include edildiğini anlayamadım. stm32f10x_usart.h dosyasının içinde çağırılmıyor.Aksine stm32f10x_usart.c dosyasının içinde stm32f10x_usart.h dosyası çağırılıyor-ekleniyor. Template de ayrı bir grup oluşturup bunun içine tüm .c dosyalarını atmışlar ancak ben o şekilde bir proje oluşturursam bir sürü hata alıyorum..

pisayisi

Ben hata almadım hiç yine de biryerlerde sorunlar vardır muhakkak.ancak template kullanıp gerekli modifikasyonları yaparak ilerliyorum buşekilde debug compile aşamasında hata vermiyor hiç.
Murat

mcan

#509
Eğer stm32f10x_usart.c dosyasını projeye include ettiği noktayı yakalarsan senden ricam buraya yazabilirmisin.