STM32F103 Sorularım

Başlatan yldzelektronik, 08 Aralık 2016, 16:43:46

Klein

OCX ayarından kasıt süre hesaplamaları ise o kolay.  ARR registerine yazdığın değere bakacaksın. O senin çözünürlüğün.  1000  yazdıysan  CCR = 1ms/1000 olur. 2000 yazdıysan 1ms/2000. ( periyot 1ms için)

yldzelektronik

Hocam bu timer konusunu ben pek anlamadım.Biraz açıklayarak anlatabilir misiniz?(zor öğrenci)
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

Hocam timer konusunu biraz açıklayabilir misiniz?

Söylediklerinize istinaden yapıyorum bir şeyler.Ama beklediğim olmuyor.CCR irq içine giriyorum.Ama CCR değerini değiştirsem de frekans değişmiyor.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

Selamlar

Stm32f103 ile kesme öncelikleri konusunu anlamadım.Bu mcuda tam olarak nasıl çalışıyor bu yapı?

Datasheet ve nvic ile ilgili dokümana baktım.Ancak pek bir şey anlamadım.

Örneğin elimde systick, uart rx, tim4, tim2, exti (12 tane falan sanırım) gibi kesmeler var.Bunların servis rutinlerine gidiş önceliğini nasıl ayarlayacağım?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Tagli

Doğrudan register erişimi ile de yapılabilir ama bu işin en temiz yolu hazır CMSIS fonksiyonunu kullanmak: NVIC_SetPriority(IRQn, priority)
Buradaki IRQn genelde önceden tanımlı bir sabit oluyor, örneğin TIM14_IRQn gibi. priority de malum, işlemci tarafından desteklenen bir öncelik numarası. Sayı düşükse daha yüksek öncelikli oluyor (sanırım).
Gökçe Tağlıoğlu

Cemre.

Alıntı yapılan: Tagli - 26 Ocak 2017, 16:38:57
Doğrudan register erişimi ile de yapılabilir ama bu işin en temiz yolu hazır CMSIS fonksiyonunu kullanmak: NVIC_SetPriority(IRQn, priority)
Buradaki IRQn genelde önceden tanımlı bir sabit oluyor, örneğin TIM14_IRQn gibi. priority de malum, işlemci tarafından desteklenen bir öncelik numarası. Sayı düşükse daha yüksek öncelikli oluyor (sanırım).

Doğru, küçük değer yüksek öncelik. Bir de subpriority olayı var CubeMX'te ancak reg. düzeyinde desteklenen bir şey mi yoksa yazılımsal representation mı bilemiyorum..

magnetron

ST nin forumunda sorduğum aynı soruya gelen cevap
Standart Peripheral Library için
ingilizceyi iyi bilen bir arkadaş çevirirse faydalı olur

Alıntı YapWell, the NVIC has many possible configurations.

Basically you can assign a flat interrupt priority level, where interrupts of a higher priority will preempt ones which are already running of a lower priority level.

Then there is a less flat mode, where several interrupts can share the same priority level and won't interrupt the processing of each other, but ones (or groups) with a higher priority will.

As I recall you have 4-bits to represent these levels and sublevels. So you could program it with 8 priority levels and 2 sub levels, or 4 priority levels and 4 sub levels, etc.

The trick is to understand how you want to prioritize things, whether in normal operation some things with equivalent importance are occuring, or if other things are critically important. The other trick is to make sure no two interrupts are set with the same priority/sub setting.

For an encoder, I would want it to have a very high priority (low latency), even through I would expect it to have a low frequency of use. Basically the interrupt code would get in and out quickly


Suggest you pull ARM's documentation of the NVIC, or Joseph Yiu's book.

The PriorityGroup works along these lines..

Lower numbers, higher priority

NVIC_PriorityGroup_0 - 0 bits for pre-emptions, 4-bits for sub priority

Flat, no pre-emption, highest sub priorities pending will execute first

Pre.Sub

0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0.10
0.11
0.12
0.13
0.14
0.15

NVIC_PriorityGroup_1 - 1 bit for pre-emptions, 3-bits for sub priority

Two Groups, 0.x has preemption priority over 1.x

Pre.Sub

0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7

1.0
1.1
1.2
1.3
1.4
1.5
1.6
1.7

NVIC_PriorityGroup_2 - 2 bits for pre-emption, 2-bits for sub priority

Pre.Sub

0.0
0.1
0.2
0.3

1.0
1.1
1.2
1.3

2.0
2.1
2.2
2.3

3.3
3.3
3.3
3.3


NVIC_PriorityGroup_3 - 3 bits for pre-emption, 1-bit for sub priority

Pre.Sub

0.0
0.1

1.0
1.1

2.0
2.1

3.0
3.1

4.0
4.1

5.0
5.1

6.0
6.1

7.0
7.1

NVIC_PriorityGroup_4 - 4 bits for pre-emption, 0-bits for sub priority

Flat, higher priority will always pre-empt running interrupt code for lower priority

Pre.Sub

0.0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
10.0
11.0
12.0
13.0
14.0
15.0

yldzelektronik

Selamlar,

Haberleşme içeren projelerinizde uzaktan cihaz üzerindeki yazılımın versiyon numarasına erişmek istediğinizde nasıl bir yol izliyorsunuz?

Cihazlarınız üzerinde yazılım version numarası tutuyor musunuz?

Bu konuya çözüm üretebilmek için şöyle bir şey denemek istiyorum;

Yazılımın hangi süreçte olduğunu hangi dağıtım olduğunu belirleyebilmek için;

enum{
		Development   = 0x00,
		AlfaTest		= 0x01,
		BetaTest		= 0x02,
		Debug		= 0x03,
		Release		= 0x04		
	}Distro;


Şeklinde bir enum Distro tanımım var. Böylece yazılımın henüz hangi aşamada oldupunu bileceğim.

Ayrıca yazılımın major ve minor numaralarını tutup hepsini tek bir yerde toplayabilmek için;

struct VersionControl_t{
	uint8_t Major;
	uint8_t Minor;
	uint8_t SubMinor;
	enum{
		Development   = 0x00,
		AlfaTest		= 0x01,
		BetaTest		= 0x02,
		Debug		= 0x03,
		Release		= 0x04		
	}Distro;
};
typedef struct VersionControl_t SoftVerCtrl_TypeDef;


şeklinde bir tanımlama yaptım.

1- Yeri gelmişken struct kullanımında struct kelimesinden sonra yazdığım nedir? "}" den sonra gelen kısma yazdığım nedir?Şuan yaptığım kullanım tercihi hatalı mı?Doğru uygun olan nedir?

2- İsimlendirmeler ile ilgili (çok güzel olmadığını kabul ediyorum) neler önerirsiniz?

3- Ben istiyorum ki, yazılımın version numarasını programı derlediğimde otomatik değiştireyim ve flasha programı yüklediğimde o da yüklensin.

Yani normalde, benim bildiğim kadarıyla, birkaç makro ile tanımlanmış olan değerleri önce flashı unlock et, sonra verini yaz, sonra flashı lock et adımlarıyla belleğe yazardım. Bunu biraz otonom yapmak içinde aşağıdaki gibi yapardım.
Bir exe gidip version.h isimli dosyayı açar, major minor numarlarının tanımlandığı satırları bulup değerleri değiştirir ve kapanır.Bu programı da keil üzerinden run program before compile üzerinden çalıştırırım. (options for target->User sekmesinde).

Ama böyle yapmayayım.Ben nasılsa programı derliyorum ve nasılsa flasha yazıyorum.Öyle makrolar tanımlayayım ki gidip hafızaya yazsın.Versiyon numarasının otomatik artması işini de bir programa yaptırayım.
Program gidip version.h isimli dosyayı açsın,
#define BOOTLOADER_MAJOR		((uint8_t)(0x00))
#define BOOTLOADER_MINOR		((uint8_t)(0x00))
#define BOOTLOADER_DISTRO		((uint8_t)(0x00))
#define BOOTLOADER_SUBMINOR	((uint8_t)(0x00))
#/code]
kısımlarında gidip ilgili düzenlemeleri yapsın.Sonra kapansın.Bu programı da keil üzerinden run program before compile üzerinden yapayım (options for target->User sekmesinde).

Yani şöyle birşey yapabilir miyim ki?

[code]
#define BOOTLOADERVERSION_BASE	((uint32_t)0x08000000)	//FLASH_BASE
#define BOOTLOADER_VERSION			((SoftVerCtrl_TypeDef*)	BOOTLOADERVERSION_BASE)
(*BOOTLOADER_VERSION) = 0x10203040


Pek gerçekçi gelmese de sanki yapılabiliritesi var gibi?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

baran123

@yildizelektronik Öncelikle şu şekilde tanımalamlarını yapabilirsin. Bunlar sadece bir örnek.

1. Sorunun cevabı şu structda parantez kapandıktan sonra yazdığın şey senin o struct tipinde tanımladığın değişken oluyor.
Kod ile izah edecek olursak
struct book
{
    int page;
    char text[8];
}book1;

book1.page = 20;

bu şekilde direk kullanabilirsin.
Oraya yazmazsan şu şekilde kullanacaksın.
struct book
{
    int page;
    char text[8];
};

struct book book1;

book1.page = 20;


2. sorunun cevabı açıklayıcı ve düzgün olmalı :) Özellikle yeni bir tip tanımlaması yazıyorsan tipxX_t gibi bir ifade kullanılabilir.
Mesela şöyle
typedef enum
{
    Development = 0,
    AlfaTest,
    BetaTest,
    Debug,
    Release		
}DeviceVersion_t;

Enumda eğer verdiğin değerler sıralı ise sadece ilk tipi değer vermen yeterli enum senin için sıralama yapıyor zaten. En baştakine 2 verirsen diğerleri 3 4 5 diye gider.

3. Soruyu bilmiyorum.

Son olarak örnek bir struct şöyle olabilir.
typedef enum
{
	Development = 0,
	AlfaTest,
	BetaTest,
	Debug,
	Release
}DeviceVersion_t;

typedef struct 
{
	uint8_t Major;
	uint8_t Minor;
	uint8_t SubMinor;
	DeviceVersion_t Version;
}VersionControl_t;




yldzelektronik

@baran123  teşekkür ederim.

@Klein  hocam siz bu konuda ne yapıyorsunuz?

Yazılım versiyonları konusunda nasıl önerileriniz olur?

Bir de, gerçi daha önce @Zoroaster  konusunu açmıştı ama. Bu little endian big endian meselesi gerçekten çok berbat bir şey. Haberleşme içeren projelerde buna dikkat etmek gerekiyor.Sonra 85 derece olarak okumanız gereken int16 yı byte byte gönderip alırken 305 derece olarak okuyabiliyorsunuz.

Bu little big endian konusunda, haberleşme alt yapısını tasarlarken gerekli dönüşümleri yapmak dışında işlemci içinde otonom dönüşüm gibi alternatifleri yoktur değil mi?

Ekleme: Bu arada @muhittin_kaplan hocam. Grupta bir link vermiştiniz Irq öncelikleriyle ilgili.Onu buraya yapıştırabilir misiniz?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.


muhittin_kaplan


yldzelektronik

#27
Teşekkürler
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

Selamlar,

Rts ve Cts fonksiyonlarını kullanarak usb seri port yapabilir miyiz? Anladığım kadarıyla rts cts gibi fonksiyonlar için SET_CONTROL_LINE_STATE istekler gönderiliyor.Ama tam anlamadım.Nasıl yapabilirim?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Klein

@yildizelektronik  Versiyon konusu içimde kanayan yara.  Düzenli versiyon takibi ve dokümantasyonu yapamıyorum. SVN konusuna bi el atacağım ama üşengeçlikten hiç bir şey yapamadım bu güne kadar.
Şu sıralar Em:Bitz kullanıyorum. Otomatik versiyon modülü var ama kullanmadım daha. Bir sonraki projede kullanacağım inşallah.

Rts Cts kullanarak Usb seri port yapmaktan kastını tam anlamadım. açar mısın?