STM32f103C8 Soft reset

Başlatan z, 23 Nisan 2022, 20:22:36

z

CM3 islemcilerde bir registerin bir biti set edilince bu islem islemciye reset atiyordu.
Hatta bir projemde de kullanmistim.

Fakat not etmemisim bu islemin detayini biliyormusunuz?

internette SCB->AIRCR de 2.biti set edin diyor ama ise yaramadi.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Cevabi buldum Koruma amacli yapilmis.

AIRCR registerini okuyunca 0xFA050000 iken
2. biti 1 yapip (0xFA050004) yazmak ise yaramiyor.

0x05FA0004 yazmak gerekiyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

NVIC_SystemReset();
Gökçe Tağlıoğlu

z

Bu hali bana yaramaz ama o fonksiyona gidildiginde disasm kisminda ne var merak ettim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

#4
Niye işine yaramasın ki? Zaten muhtemelen senin yaptığının aynısını yapıyor, sadece tüm Cortex M'ler için standart olan CMSIS-Core kütüphanesini kullanmış oluyorsun.

core_cm3.h dosyasından:

/**
  \brief   System Reset
  \details Initiates a system reset request to reset the MCU.
 */
__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
{
  __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */
  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |
                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                            SCB_AIRCR_SYSRESETREQ_Msk    );  /* Keep priority group unchanged */
  __DSB(); /* Ensure completion of memory access */

  for(;;) /* wait until reset */
  {
    __NOP();
  }
}

Bu da programming manual'den. Gerçi bu kısmı zaten çözmüşsün:
Alıntı YapBits 31:16 VECTKEYSTAT[15:0]/ VECTKEY[15:0] Register key
Reads as 0xFA05
On writes, write 0x5FA to VECTKEY, otherwise the write is ignored.
Gökçe Tağlıoğlu

z

Resetle    LDR    R0, =SCB_BASE
           LDR    R1, =0x05FA0004
           STR    R1, [R0, #SCB_AIRCR]

Boylesi daha sevimli.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Yuunus

Alıntı yapılan: z - 23 Nisan 2022, 23:20:04
Resetle    LDR    R0, =SCB_BASE
           LDR    R1, =0x05FA0004
           STR    R1, [R0, #SCB_AIRCR]

Boylesi daha sevimli.

@z adamlar oturmus isiniz kolaylassin siz projenize odaklanin diye kutuphane yazmis sen tutup bilmem ne yaparim yazacaginiz :o  kutuphaneyi deyip amerikayi bastan kesfediyorsun, ayni registera atama yapiyorsun, proje buyudukce sevimliligi kalmiyor resmen cirkeflesiyor senin kod, 7 sene once registerlar ile proje yazmisim az once kodlara baktim resmen bulmacaya donmus, birak artik hocam.

Tagli

#7
Ben aslında bu konuda daha çok @z gibi düşünüyorum. Bilen bilir, ben de HAL, Cube, Peripheral Lib falan kullanmam. Ancak genel olarak kütüphane kullanımına karşı değilim. Bu saydıklarımı inceledim ve bana bir şey katmadıkları sonucuna vardım. Her halükarda Reference Manual'i iyice bilmek gerekiyor. Bu durumda üstüne bir de şişirilmiş kütüphaneleri öğrenmek istemedim. STM32'leri register seviyesinde kodlarım, ancak C++ kullanarak modüler bir tasarım elde etmeye çalışırım.

CMSIS kütüphanelerine bakışım daha farklı. Bunlar tüm ARM Cortex M çekirdekli işlemcilerde ortak. Ayrıca çok temel seviyedeler. Haliyle eğer aradığım özellik CMSIS-Core kütüphanesinde varsa, ayrıntılarına çok kafa yormadan doğrudan kullanırım. Benzer şekilde mümkün olduğunca CMSIS-DSP kütüphanesini de kullanmaya çalışıyorum. Ancak bazı fonksiyonlarının arayüzü çok çirkin, o yüzden vazgeçip kendi kodlarımı yazdığım da oluyor. Ancak dediğim gibi, benim bakış açıma göre özellikle CMSIS-Core kütüphanelerini kullanmamak için hiçbir sebep yok.

ASM olayına gelince... Böyle temel register atama işleri için çok gereksiz buluyorum. Periyodik olarak (sürekli) ve çok hızlı çalışması gereken, mümkün olduğunca donanım desteğinden yararlanabilecek fonksiyonlarda, ancak ölçümler sonucu (profiling) bir dar boğaz keşfedilirse ASM kullanılması mantıklı olabilir. Bir de RTOS kernel'i yazarken mecburi olarak kullanılması gereken durumlar olabilir. Onun dışında asla...
Gökçe Tağlıoğlu

z

@yunus

Kutuphaneyi ogrenmek kadar sacma bir sey dusenemiyorum.

Kutuphanede bir bug cikinca adamlarin duzeltmesini bekleyecem oyle mi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Yuunus

@z kutuphaneyi ogrenmiyorsun, ide icerisinde uml tarzi bir yapi var, gorsel olarak ne yapacaksan dizayn modda hazirliyorsun sonra Generate Code ile ister keil ister atollic ister baska bir derleyici icin dizayni koda donusturuyorsun sonra ne yaptiracaksan kodlarini oraya yaziyorsun, kutuphane fonksiyonlarindan daha hizli calismasini istedigin yada daha hizli calisacagini dusundugun durumlarda mudahale edip yine register seviyesinde kod ekleyebilirsin, ama isin cogunu ide kendisi yapiyor zaten. kutuphane kodlarinda bug olur ben guvenmem diyorsan yada cok optimize ve kisa kodum olsun diyorsan bilemem orasini saygim vardir, ama bir dene derim buyuk kolaylik hocam.

https://www.st.com/en/development-tools/stm32cubeide.html

fide

Hazır STM32 ve kütüphaneleri konuşuyorken araya bir soru da ben sıkıştırayım.
Uart yada SPI üzerinden uzunluğunu bilmediğimiz bir veriyi nasıl alırız?

Örnek STM32 + GSM modül ile bir SMS yada web sayfası çağırdım. Gelen veri uzunluğu SMS / web sayfası içeriğine göre değişecek. İçinde birden fazla Cr lf (ASCII 10 ve 13) var. Verinin uzunluğunu kestiremiyorum. Bitişi için de spesifik bir belirteç yok.

Bu veriyi uart yada SPI üzerinde byte byte alırken nasıl bir yöntem izlemem daha uygun olur.  :du:  :du:  :du:

Donanım haricinde programcılık sanırım burada başlıyor.
Şimdiden teşekkürler.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

MrDarK

Konu içeriği ile başlık pek alakalı değil ama cevap vereyim,

Uart için byte timeout koyup veri bitişini algılayabilirsin.

Spi için ise master veya slave olmana gore değişir. Eğer master isen (büyük olasılıkla) okuman gereken byte miktarını bir registeri okuyarak öğrenip sonra okuma görevi verebilirsin veya sabit büyük bir uzunluğu okuyup null byte gelen kısımda datayı bitti farz edebilirsin. Sonuçta printable char receive etmiş olacaksın o sebeple web sayfası içinde null byte olmamalı gibi.
Picproje Eğitim Gönüllüleri ~ MrDarK

fahri-

Ben PIC işlemcilerde şöyle yapıyorum.
RX pininden data geldiğinde interrupt oluşuyor. Interrupt fonksiyonunda gelen dataları sayıyor ve kaydediyorum. Timeout oluştuğunda saydığım data sayısı kadar dizi elde etmiş oluyorum. Datanın uzunluğu önemli olmuyor. Ne kadar olursa olsun.

kimlenbu

Alıntı yapılan: fide - 24 Nisan 2022, 22:04:26Hazır STM32 ve kütüphaneleri konuşuyorken araya bir soru da ben sıkıştırayım.
Uart yada SPI üzerinden uzunluğunu bilmediğimiz bir veriyi nasıl alırız?

Örnek STM32 + GSM modül ile bir SMS yada web sayfası çağırdım. Gelen veri uzunluğu SMS / web sayfası içeriğine göre değişecek. İçinde birden fazla Cr lf (ASCII 10 ve 13) var. Verinin uzunluğunu kestiremiyorum. Bitişi için de spesifik bir belirteç yok.

Bu veriyi uart yada SPI üzerinde byte byte alırken nasıl bir yöntem izlemem daha uygun olur.  :du:  :du:  :du:

Donanım haricinde programcılık sanırım burada başlıyor.
Şimdiden teşekkürler.

Uart/usart için uzunluğu bilinmeyen veri almak için en genel yöntem DMA'yı circular modda aktif edersin, IDLE kesmesini aktif edersin. IDLE kesmesi gelince DMA'nın counter'ını kontrol edip verin buffer içinde nerede başlıyor, nerede bitiyor bulursun. Tercihen ayrı bir buffer'a kopyalarsın.

Direkt olarak IDLE kesmesine güvenince bazen iletişimin ortasında hatalı kesmeler oluşuyor. Bunu engellemek için IDLE kesmesi geldiğinde baudrate'e göre bir timer başlatıp bir kaç milisaniyelik bir timer sonrasında tekrar idle kesmesi gelmediyse ve usart meşgul değilse o zaman verinin peşine düşersin.


Ayrıca register seviyesinde kod yazmış, std peripheral library kullanmış birisi olarak şu an hal library ile çalışıyorum. Buglarla karşılaşıyorum, örneğin usart ile dma kullanacaksanız cube mx init kodlarında dma initi bazen usart initten önceye alıyor. Kodunuz çalışmıyor, bunun için elle user code olmayan bölgedeki dma init rutinini en alta alıyorsunuz düzeliyor. Bu mcu'dan mcu'ya farklılık gösteriyor, hala saçma sapan buglar var ama oturup register seviyesinde veya asm ile kod yazmaktan çok daha hızlı. Üstüne üstlük kodunuzun taşınabilirliği de oldukça artmış oluyor, neredeyse değişiklik yapmadan başka mcu'ya aktarabiliyorsunuz.Örneğin bir lcd init edeceğinizde Init_Lcd(&hspi1) diyorsunuz bitiyor.