Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: Kırambor - 27 Haziran 2022, 17:34:54

Başlık: Nuvoton M031 kaynak
Gönderen: Kırambor - 27 Haziran 2022, 17:34:54
Herkese merhabalar,

Nuvoton'u tanıma amacıyla nuvoton geliştirme kiti satın aldım. https://www.ozdisan.com/maker-ve-iot-urunleri/gelistirme-platformlari/gelistirme-kitleri-ve-aksesuarlari/NK-M031SD (https://www.ozdisan.com/maker-ve-iot-urunleri/gelistirme-platformlari/gelistirme-kitleri-ve-aksesuarlari/NK-M031SD)

Şuan Technical Reference Manual okuyorum fakat bu kartla yapılmış örnek çalışmaları da incelemek istiyorum. Led blink, pwm vb. kolay uygulamalar.

Örnek kodlar var nuvoton bsp'de fakat ben daha temel, çevre birimlerin işleyişinin anlatıldığı şeyler arıyorum. Araştırma yaparken Hakkı Kaplan'ın bloğuna denk geldim fakat kendisi uygulamalarını M23 mimari bir işlemci ile yapıyor. Benim elimdeki kart arm cortex m0.

Bildiğiniz bir kaynak var mı Nuvoton M031 ile ilgili acaba ? Her türlü dil olabilir  :)
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: yucatar - 27 Haziran 2022, 20:04:57
.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: quarko - 27 Haziran 2022, 20:05:52
BSP paketinin içinde yeteri kadar örnek var aslında. Şöyle bir baksanız çok rahat kavrarsınız. Hem standart kütüphaneler ile hem de register tabanlı örnekler mevcut. Reference Manual i açıp, kodlarla birlikte incelerseniz çok ta kolay olacaktır. Daha önce Nuvoton M031 kullandım. Şimdi bir projede de NUC029FAE kullanıyorum. Hep bu şekilde yaptım.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: Kırambor - 27 Haziran 2022, 21:13:26
Alıntı yapılan: quarko - 27 Haziran 2022, 20:05:52BSP paketinin içinde yeteri kadar örnek var aslında. Şöyle bir baksanız çok rahat kavrarsınız. Hem standart kütüphaneler ile hem de register tabanlı örnekler mevcut. Reference Manual i açıp, kodlarla birlikte incelerseniz çok ta kolay olacaktır. Daha önce Nuvoton M031 kullandım. Şimdi bir projede de NUC029FAE kullanıyorum. Hep bu şekilde yaptım.

Hangi ideyi tavsiye ediyorsunuz peki? Keil kullanmayı düşünüyorum ben.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: quarko - 27 Haziran 2022, 23:35:12
Nuvoton için keil kullanabilirsiniz. M0 ve M23 ailesi için ücretsiz lisansı var. İsterseniz ilaçlı versiyonda kullanabilirsiniz. Ben aslında başta IAR tercih edecektim fakat 7.x versiyonu kullandığım için extra uğraşmak istemedim. Direk keil ile devam ettim.

Nuvoton un eclipse tabanlı, NuEclipse adında bir ide si de var ama. Ben beğenmedim. Tavsiye etmiyorum.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: Murat Mert - 27 Haziran 2022, 23:35:59
Eclips biraz sıkıntı keili tavsiye ederim.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: respected - 29 Haziran 2022, 00:48:57
NuTool PinConfigure ve NuTool ClockConf  uygulamalarını yükleyin. Sonra BSP temel örneklerle başlayın. Ayrıca https://www.nuvoton.com/tool-and-software/bsp-and-example-code/example-code/ burada BSP de olmayan örnekleri de bulabilirsiniz.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: Kırambor - 29 Haziran 2022, 21:51:25
Tekrardan merhabalar,

Soruyu sorduktan sonra sırayla technical reference manual okuyup örnek kodlara bakıyorum. Tavsiyenizle de NuTool Clock Configure diye bir program indirdim. Clockta nereleri aktif etmem konusunda bana birkaç fikir verdi. Fakat aklıma takılan bazı noktalar var bu noktada sizlerden yardım rica edebilir miyim ?

1-Pinler Multi function özelliğine sahip ki bu gayet güzel bir pinin birden fazla işlevi olması iyi. Diyelim ki ben PB14'ü output olarak tanımlayarak o portta led yakmak istiyorum. Şimdi benim PB14'e clock sinyali verebilmek için PB14'ün diğer fonksiyonlarını kapsayan çevresel birim için gerekli clocku mu aktif etmeliyim yoksa sistem clocku otomatik olarak tüm GPIOları clock sinyali mi veriyor ?

2-Basit bir led yakma söndürme işlemi yapmak istedim. Elimde NuMaker m031 var.Karttaki işlemci M031SD2AE. Ben sadece GPIO özelliğini kullanmak istiyorum. O yüzden direkt sistem clock'unu aktif hale getirdim. PB14'ü gpio olarak tanımlamak için GPIO_SetMode() fonksiyonunu kullandım ve PB14 için output tanımladım. Örnek kodlardan birine baktığımda bunu gördüm ve portu HIGH etmek için PB14 = 1; kullandım.

#include "M031Series.h"

void SYS_Init()
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable clock source */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

    /* Waiting for clock source ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

    /* Disable PLL first to avoid unstable when setting PLL */
    CLK_DisablePLL();

    /* Set PLL frequency */
    CLK->PLLCTL = (CLK->PLLCTL & ~(0x000FFFFFul)) | 0x0008C02Eul;

    /* Waiting for PLL ready */
    CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);

    /* If the defines do not exist in your project, please refer to the related clk.h in the Header folder appended to the tool package. */
    /* Set HCLK clock */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

    /* Set PCLK-related clock */
    CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV1 | CLK_PCLKDIV_APB1DIV_DIV1);

    /* Enable IP clock */
    CLK_EnableModuleClock(ISP_MODULE);
    CLK_EnableSysTick(CLK_CLKSEL0_STCLKSEL_HIRC_DIV2, 0);

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
    SystemCoreClockUpdate();

    /* Lock protected registers */
    SYS_LockReg();
}

int main(void)
{
SYS_Init();

GPIO_SetMode(PB,BIT14,GPIO_MODE_INPUT);
PB14 = 1;

while(1);

}

Led yanıyor. Fakat ben bu ledi geri söndüremiyorum. PB14 portunu LOW durumuna getiremiyorum. Acaba bu konuda neyi tam olarak yapamıyorum? Bir de clock yapısını çok iyi anlayamadım gibi. Anlatabilirseniz çok sevinirim.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: power20 - 29 Haziran 2022, 22:14:16
Main içinde aslında  pin input seçilmiş. Çıkış değil. Belki pull up nedeniyle yanıyor.  Zaten söndürmek için de bir şey yapılmamış.

Şöyle olsa çalışabilir sanırım

GPIO_SetMode(PB,BIT14,GPIO_MODE_OUTPUT);
While(1){
 PB14 = 1;
 Delay(100);
 PB14 = 0;
 Delay(100);

}

Delay yerine geçerli bir gecikme fonksiyonu kullanılmalı. Tahmini olarak yazdım
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: Kırambor - 29 Haziran 2022, 22:17:12
Alıntı yapılan: Kılıç - 29 Haziran 2022, 22:14:16Main içinde aslında LED yakmak için bir şey yapılmamış. Sadece input seçilmiş. Belki pull up nedeniyle yanıyor.  Zaten söndürmek için de bir şey yapılmamış.

Pardon ben OUTPUT tanımladığım hali atmamışım kusura bakmayın orada GPIO_MODE_OUTPUT olacak. Sonrasında PB14 = 0; diye bir satır daha kod yazdım. Fakat led sönmedi malesef.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: power20 - 29 Haziran 2022, 22:22:51
Delay gerekli. LED sönmüş olarak beklesin...
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: Kırambor - 01 Temmuz 2022, 10:36:21
Alıntı yapılan: Kılıç - 29 Haziran 2022, 22:22:51Delay gerekli. LED sönmüş olarak beklesin...

Hocam tekrardan merhabalar,
#include "M031Series.h"

void SYS_Init()
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable clock source */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

    /* Waiting for clock source ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

    /* Disable PLL first to avoid unstable when setting PLL */
    CLK_DisablePLL();

    /* Set PLL frequency */
    CLK->PLLCTL = (CLK->PLLCTL & ~(0x000FFFFFul)) | 0x0008C03Eul;

    /* Waiting for PLL ready */
    CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);

    /* If the defines do not exist in your project, please refer to the related clk.h in the Header folder appended to the tool package. */
    /* Set HCLK clock */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

    /* Set PCLK-related clock */
    CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV1 | CLK_PCLKDIV_APB1DIV_DIV1);

    /* Enable IP clock */
    CLK_EnableModuleClock(ISP_MODULE);
    CLK_EnableModuleClock(TMR0_MODULE);
    CLK_EnableSysTick(CLK_CLKSEL0_STCLKSEL_HIRC_DIV2, 0);

    /* Set IP clock */
    CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HIRC, MODULE_NoMsk);

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
    SystemCoreClockUpdate();

    /* Lock protected registers */
    SYS_LockReg();

}
 
int main(void)
{
 SYS_Init();
 
 GPIO_SetMode(PB,BIT14,GPIO_MODE_OUTPUT);
 
 while(1)
 {
 PB14 = 1;
 TIMER_Delay(TIMER0,500000);
 PB14 = 0;
 TIMER_Delay(TIMER0,500000);
 }
 
}

Sizin dediğiniz gibi bir delay eklemeye çalıştım. Fakat aynı problem devam ediyor. Sonrasında while'ın içini toptan silip GPIO_SetMode() fonksiyonunu yoruma aldım. Tekrar debug ettiğimde led hala yanıyor. Aklıma gelen tek şey acaba clocktan dolayı mı. Yani ben sistem clockunu aktif hale getirdiğimde portlar otomatik high mı oluyor ?
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: power20 - 01 Temmuz 2022, 11:19:02
Ben bu işlemciyi kullanan biri değilim. Kodlara bakarak yorum yapmaya çalıştım. Kendi örneklerine, webte yayınlanan örneklere bakmak yararlı olacaktır

Timer delay  fonksiyonu belki aktif değildir. Çalışması için interrupt daha da önemlisi timer ayarlanması gerekiyor olmasın? gecikme fonksiyonunda Timer0 kullanılmış. fakat timer0 çalışyor mu ki?

Bunun yerine bir kaç tane döngü ile çalışan düz bir delay fonksiyonu kullanmanızı öneririm. Çünkü LED yakıp söndürmeden önce timer ve de interrupt çalıştırabilmek düşük ihtimaldir. (Tecrübe açısından)  Başka mcu için gittiğim yol bu idi.

Diğer bir ihtimal
GPIO_SetMode... Fonksiyonunun yetersiz kalmasıdır. Buna ilaveten başka bir fonksiyon daha gerekebilir. Kullandığınız pin analog ise iptal edilmesi pull up pulldown durumları... vb

Belki bu pin özeldir. Asla çıkış yapılmayan bir pindir? Fonksiyon bu yüzden etki etmemiştir? Hazır örneklerde hangi pin kullanılmışsa onu tercih ediniz.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: quarko - 01 Temmuz 2022, 14:44:15
Delay kısmını timer ile değilde basit bir döngü ile yapıp deneyebilir misin ? Debug yaparken PB14 = x satırlarına da breakpoint koyup öyle çalıştır. Her breakpointe geldiğinde ledin yanıp söndüğünü görmen lazım.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: Kırambor - 01 Temmuz 2022, 17:55:47
Alıntı yapılan: quarko - 01 Temmuz 2022, 14:44:15Delay kısmını timer ile değilde basit bir döngü ile yapıp deneyebilir misin ? Debug yaparken PB14 = x satırlarına da breakpoint koyup öyle çalıştır. Her breakpointe geldiğinde ledin yanıp söndüğünü görmen lazım.

Problem timer delay fonksiyonundaymış. Kendim bir delay fonksiyonu yazarak halletim. teşekkürler.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: merve damar - 20 Mayıs 2023, 19:55:32
Merhabalar herkese,
M031 kullanıyorum. hafızaya veri kaydedip okuma yapmak istiyorum. Fcm read ve write fonksiyonlarını kullanıyorum. ama hafıza herhangi bir yazma işlemince bulunamıyorum. Bu konuda çalışan var mı acaba?
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: yucatar - 20 Mayıs 2023, 20:56:52
Alıntı yapılan: merve damar - 20 Mayıs 2023, 19:55:32Merhabalar herkese,
M031 kullanıyorum. hafızaya veri kaydedip okuma yapmak istiyorum. Fcm read ve write fonksiyonlarını kullanıyorum. ama hafıza herhangi bir yazma işlemince bulunamıyorum. Bu konuda çalışan var mı acaba?

Burada bir örnek var https://nuvotonforum.com/threads/flash-hafizaya-4-farkli-byte-kaydetme.39/
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: Kırambor - 21 Mayıs 2023, 00:22:43
Alıntı yapılan: merve damar - 20 Mayıs 2023, 19:55:32Merhabalar herkese,
M031 kullanıyorum. hafızaya veri kaydedip okuma yapmak istiyorum. Fcm read ve write fonksiyonlarını kullanıyorum. ama hafıza herhangi bir yazma işlemince bulunamıyorum. Bu konuda çalışan var mı acaba?
Data Flash enable ettiniz mi? Ben Keil kullandım. Options For Target->Utilities->Use Debug Driver'ın sağındaki Settings->Açılan ekranda sağ altta Chip Setting kısmındaki Setting-> Sağ üstte Data Flash ile alakası bir kısım olmalı oradan data flash enable yapmalısınız.

Ama benim beğenmediğim bir şey var bununla alakalı. Eğer yazdıktan sonra yazdığınız yere tekrar bir veri yazmak istiyorsanız sayfayı/sektörü önce komple silip sonra tekrar yazma işlemi yapmalısınız. Tabi bunun kaç defa yapılabileceği de önemli. Sanırım nuvotonda sınır 100 bin falan olmalı(Bunda emin değilim siz kontrol edin).
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: quarko - 21 Mayıs 2023, 15:30:35
Aynı işlemci ile bu tarz bir çalışma yapmıştım. APROM bölgesine yazma yapacaksan, öncesinde "FMC_EnableAPUpdate()" fonksiyonunu çağırmalısın. Sonra yazma işlemini yapabilirsin. Yazma işlemi bittiğinde de "FMC_DisableAPUpdate()" yapmalısın. Yazma kilitleri açık değilse yazma işlemi gerçekleşmez. Bu işlemlerin öncesinde "SYS_UnlockReg()" ile başlayıp "SYS_LockReg()" ile bitirebilirsin. Eğer kritik kesmelerin vs yoksa, kesmeleri de kapatmanı tavsiye ederim ki, yazma işlemleri arada kesilmesin.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: Kırambor - 22 Mayıs 2023, 01:03:41
Alıntı yapılan: quarko - 21 Mayıs 2023, 15:30:35Aynı işlemci ile bu tarz bir çalışma yapmıştım. APROM bölgesine yazma yapacaksan, öncesinde "FMC_EnableAPUpdate()" fonksiyonunu çağırmalısın. Sonra yazma işlemini yapabilirsin. Yazma işlemi bittiğinde de "FMC_DisableAPUpdate()" yapmalısın. Yazma kilitleri açık değilse yazma işlemi gerçekleşmez. Bu işlemlerin öncesinde "SYS_UnlockReg()" ile başlayıp "SYS_LockReg()" ile bitirebilirsin. Eğer kritik kesmelerin vs yoksa, kesmeleri de kapatmanı tavsiye ederim ki, yazma işlemleri arada kesilmesin.
Özel bir bilgi değilse nasıl bir çalışma yaptığınızı söyleyebilir misiniz? Bir de data flashı eeprom gibi kullanmanın bir yolu var mı?
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: quarko - 22 Mayıs 2023, 07:38:10
Alıntı yapılan: Kırambor - 22 Mayıs 2023, 01:03:41Özel bir bilgi değilse nasıl bir çalışma yaptığınızı söyleyebilir misiniz? Bir de data flashı eeprom gibi kullanmanın bir yolu var mı?

Aslında amacım STM32 lerdeki gibi eeprom emulation tarzı birşey yapmaktı ama vakit sıkıntısından sadece APROM hafızada birtakım verileri tutmak için kullanabilmiştim.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: merve damar - 22 Mayıs 2023, 16:43:11
Teşekkürler oldu    ::ok
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: merve damar - 24 Mayıs 2023, 08:55:42
Alıntı yapılan: Kırambor - 21 Mayıs 2023, 00:22:43Data Flash enable ettiniz mi? Ben Keil kullandım. Options For Target->Utilities->Use Debug Driver'ın sağındaki Settings->Açılan ekranda sağ altta Chip Setting kısmındaki Setting-> Sağ üstte Data Flash ile alakası bir kısım olmalı oradan data flash enable yapmalısınız.

Ama benim beğenmediğim bir şey var bununla alakalı. Eğer yazdıktan sonra yazdığınız yere tekrar bir veri yazmak istiyorsanız sayfayı/sektörü önce komple silip sonra tekrar yazma işlemi yapmalısınız. Tabi bunun kaç defa yapılabileceği de önemli. Sanırım nuvotonda sınır 100 bin falan olmalı(Bunda emin değilim siz kontrol edin).
Evet komple silmem gerekiyor yanına farklı bişey yazamıyorum. Sadece yazmak istediğim adresi silince de olmuyor :(
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: quarko - 24 Mayıs 2023, 13:33:39
Flash hafıza biriminin çalışma şekli bu tarzda olur. Silinmiş sektöre veri yazdıktan sonra, tekrar aynı veri hücresine veri yazamazsın. Yeniden tüm sektörü silmen gerekir. O yüzden STM32 ler için geliştirilmiş Flash hafızayı EEPROM gibi kullanmak için EEPROM Emulation diye birşey var.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: Kırambor - 24 Mayıs 2023, 13:43:43
Alıntı yapılan: quarko - 24 Mayıs 2023, 13:33:39Flash hafıza biriminin çalışma şekli bu tarzda olur. Silinmiş sektöre veri yazdıktan sonra, tekrar aynı veri hücresine veri yazamazsın. Yeniden tüm sektörü silmen gerekir. O yüzden STM32 ler için geliştirilmiş Flash hafızayı EEPROM gibi kullanmak için EEPROM Emulation diye birşey var.
https://www.nuvoton.com/export/resource-files/AN_0002_Using_DataFlash_to_Emulate_EEPROM_EN_Rev1.00.pdf

Ben buradaki PDF'i okuyarak yapmaya çalıştım ama beceremedim. Nasıl yapmaya çalıştıklarını da pek anlayamadım. SRAM data bank'e falan giriyor. Ama sanırsam dikkate almamız gereken doğru pdf bu.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: quarko - 24 Mayıs 2023, 14:18:37
Nuvoton'daki mantığı incelemedim ama STM32 tarafında şöyle oluyor.

İki adet sektör kullanılıyor. Örneğin (N) ve (N+1). sektör kullanılıyor olsun. İlk olarak kaydedilecek parametreler 16bit veri + 16bit sanal adres verisi, toplam 32bit olarak N.sektöre kaydedilmeye başlıyor. Her veri sanal adresiyle birlikte kaydedildiği için, hep aynı hücreye yazmak zorunda kalınmıyor. N.sektörün sonuna gelindiğinde kaç adet veri kaydedilmişse (N+1).sektöre kopyalanıp, N.sektör formatlanıyor. Sonrasında (N+1).sektörün sonuna gelindiğinde bu sefer tam tersi yapılarak (N+1).sektöre kaydedilen verilerin güncel değeri, N.sektöre kopyalanıyor. Ve (N+1).sektör formatlanıyor. Bu şekilde bir (N). bir (N+1).sektör sırayla kullanılmış oluyor.

Hep aynı hücreye yazılmadığı için, write cycle değerlerinden maksimum olmuş oluyor. Nuvoton da da benzer bir mantık yürütülmüş olabilir.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: merve damar - 24 Mayıs 2023, 14:28:04
http://forum.nuvoton.com/viewtopic.php?t=8258
sanırım burda da öyle bişey yapıyor. Napalım çözücez bi şekilde
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: quarko - 24 Mayıs 2023, 15:45:57
Çözülür elbette ama nuvoton un flash endurance değerleri biraz düşük. Çok sık yazma yapacaksan, flash ömrünü hesaplamanı tavsiye ederim. Uygun olmazsa harici bir i2c eeprom a geçilebilir.
Başlık: Ynt: Nuvoton M031 kaynak
Gönderen: merve damar - 26 Mayıs 2023, 08:30:56
Selamlar çok fazla yazma işlemi yapmayacağım harici flash veya eeprom kullanmayı düşünüyorum ama yine de işlemcinin dahili hafızasına kaydetmem gerekenler var. 2 tane sayfa veya sektör  ne derseniz onu belirledim. sıralı yazabiliyorum. tekrar yazma yapmadan önce tüm hafızayı okuyup diğer sayfaya kaydedebilirsiniz veya her enerjilendiğinde düm hafıza okunup diziye kaydedilebilir. Bu şekilde çözdüldü. bide okuma yapmadan önce FMC_Open(); ve FMC_Close(); arasıda okuma yapmanız gerekiyor.