Nuvoton M031 kaynak

Başlatan Kırambor, 27 Haziran 2022, 17:34:54

Kırambor

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

Ş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  :)

yucatar

#1
.

quarko

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.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

Kırambor

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.

quarko

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.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

Murat Mert

Eclips biraz sıkıntı keili tavsiye ederim.
mert07

respected

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.

Kırambor

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.

power20

#8
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

Kırambor

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.

power20

Delay gerekli. LED sönmüş olarak beklesin...

Kırambor

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 ?

power20

#12
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.

quarko

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.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

Kırambor

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.