Ynt: mikroc stm32f030k6t6 sorularim

Başlatan Karamel, 04 Temmuz 2015, 17:08:13

Karamel

merhaba. arm microcontrollerlari ogrenmeye basladim. platform benim icin yep yeni oldugu icin en basta microc library leri ile arm microcontrolleri calistirmak. daha sonra microcontroller i register seviyesinde programlamak istiyorum. neyi yapmaya kalksam saatlerce ugrastigim sorunlar cikiyor. dunden birkac saat oncesine kadar programlanma sorununu surada https://www.picproje.org/index.php/topic,60133.msg464683/topicseen.html#msg464683 cozdum. sorularim cok olunca. bir baslik altinda hepsini toparlamanin daha mantikli olacagini dusundum.

suan icin 1. sorum uart ile ilgili. libaryde uart advanced init function i soyle tanimlanmis.

UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA9_10);


compiler bu code a  surasi &_GPIO_MODULE_USART1_PA9_10 yanlis diyor. zaten ben PA2 ve PA3 u kullanmak istiyorum. asagidaki sekillerde denedim. hicbiri olmadi.



UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA9_10);
UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA2_3);
UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA3_2);
UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA23);
UART1_Init_Advanced(115200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART1_PA32);


microc library lerinde bu defination nasil oluyor?

mesaj birleştirme:: 04 Temmuz 2015, 17:09:01

not: cubemx software i ile uart1 i active edince uart pa2 ve pa3 te aciliyor. yani microcontrollerimda pa2 ve pa3 pinlerinde uart function var.

LukeSkywalker

#1
_GPIO_MODULE_UART1_PA2_3


Ben genelde _GPIO_ yazdıktan sonra ctrl+space kombinasyonuyla tamamlattırırım kodları. Çok faydalı.

Karamel

hocam define oldu simdi. peki example da neden hatali olarak vermisler code u?  :-\

LukeSkywalker

Derleyici güncellendi fakat help dosyası güncellenmedi. Düzelteceklerdir bir sonraki versiyonda. Siz dediğim gibi ctrl+space kullanın.

Karamel

#4
Anladim hocam.


Bu arada peripheral uart i calistiramayinca bende soft uart library i test ettim. suan microcontroller i icersindeki rc osc ile calistiyorum. (8mhz) duzgun gonderim yapamadi pc ye. hizi 1mhz e dusurunce. gonderim normal oldu. sorunun rc osc de oldugunu nasil anladim?

bir byte goderdim. dogru bir sekilde gitti.

5 byte gonderdim. birinciden sonraki 4 u bozuldu. aralara Delay_ms(10); yerlestirince. 5 byte ta duzgun bir sekilde gitti. yani anlayacagimiz sync problemi var.

pic microcontrollerda icersindeki 8mhz rc oscyi 32 myhz e katlayip. uart haberlesmesi yapabilmistim. stm32 microcontrollerda 8mhz de sorun cikmasi normal mi?  :-\

mesaj birleştirme:: 04 Temmuz 2015, 18:43:40

Evet. Simdi donanimsal uart ilede denedim. Aralara delay ekleyinca duzgun gidiyor. Eklemeyince data bozuluyor. Buradan anlayacagimiz. 8mhz rc osc duzgun kararlilikta calismiyor.

baran123

32F0 da HSI kullanarak yapıyorum ama öyle hatalar çok çok nadir oluyor.

Karamel

#6
Hocam calisan uart code unuzu. Hsi rc osc u kullanarak 8 mhz de deneyebilirmisiniz? Cunku sorun bendede olabilir.

mesaj birleştirme:: 04 Temmuz 2015, 19:16:01

Suan pc im kendini update ediyor. Update bitsin. Bende osc yi nasil ayarladigimi resimlerle gostermeye calisacagim.

baran123

Karamel senin için deneyeyim dedim USART bende de çalışmıyor şuan :D.Çözünce yazarım.

Karamel

#8
hocam 9600 baud rate te osc configuration ini asagidaki gibi yapip deneyebilirmisiniz?

mikroc de ben boyle yapmistim. sizinle bir alakasi yok





cubemx ten gorunumu boyle olmali



mesaj birleştirme:: 04 Temmuz 2015, 22:12:06

hocam sizin de calistiramamaniz iyiye alamet degil. umarim calistirirsinizda sorun bendedir.

baran123

Senın uygulamadan once bır kendımınkını calıstırıp emın olduktan sonra senınkını denıyım dedım.Benım basit uygulama calısmıyor.Sapıttı ! bir şeyleri yanlış yapıyorum ama hayırlısı ...

Karamel

#10
yok bir yerde birseyler yanlis gidiyor. rc de olsa osc nin frequance i bu denli bozulmamali. apb1 presceller ile bolup daha yavas bir frequance elde edeyim dedim ama sanirim elde ettigim dusuk frequance usart modulune uymadi.neden boyle oluyor anlamadim. p.tesi crystal osc alacagim. o zamana kadar deneylere devam edecegim.  :-\

mesaj birleştirme:: 05 Temmuz 2015, 03:37:37

simdi isin rengi degisti!

osc de sorun yokmus. logic analyzer im ile pin in logic time larini inceledim. 9600 baut rate te logic1 icin 104usn yani normal. asagiya fotosunuda gonderdim. peki bilgileri ard arda aralarina delay koymadan gonderince neden sapitiyor? simdi bunu bulmam gerekli.



mesaj birleştirme:: 05 Temmuz 2015, 03:38:52

resimde U characterinin asenkron uart karsiligi dogru bir sekilde gittigi goruluyor. yani sorun bende yada mikroc librarysinde. osc ye bosuna yuklendik  :-\

mesaj birleştirme:: 05 Temmuz 2015, 04:01:35

madem her byte tan sonra biraz beklememiz lazim. bende stop bitini 2 ye cikarttim. sistemi kandirdim. suan icin normalmis gibi gozukuyor ama bunun neden boyle oldugunu bulmak gerekli.


UART1_Init_Advanced(9600, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_TWO_STOPBITS, &_GPIO_MODULE_UART1_PA2_3);

LukeSkywalker

while(1)
{
  while (UART1_Tx_Idle() == 0); 
  UART1_Write(data[i]);
  i++;
]


Bunu dene.

Karamel

#12
ise yaramadi hocam. stop bitini one yapinca isler bozuluyor. birazdan reference manual i talan etmeye baslayacagim  ::)

mesaj birleştirme:: 05 Temmuz 2015, 13:51:42

two or one and half ta calisiyor.

suan bunlari arm microcontroller in yapisini anlamak icin yapiyorum ama pekte iyi basladigim soylenemez. nereye elimi atsam tam olarak beceremedim  :-\

LukeSkywalker

void main()
{
 UART1_Init_Advanced(9600, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_AND_A_HALF_STOPBITS, &_GPIO_MODULE_USART1_PA9_10);
 while(1)
         {
          UART1_Write('X');
          UART1_Write('Y');
          UART1_Write('Z');
          UART1_Write('I');
         }
}


Bu kodu STM32L053 ile dahili 16MHz kullanarak denedim. Sıkntı yok.

Karamel

arm microcontroller imin flash hafizasini eeprom hafiza gibi kullanip. degisken bilgilerini saklamayi ogrenmek istiyorum.

help file dan baktigima gore example soyle:

#include <built_in.h>

unsigned long buff[32];
unsigned long i, tmp;
unsigned long Address = 0x08008000;
unsigned long Address2 = 0x08009000;
unsigned long* ptr;

void main() {
  GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_ALL);    // digital output PORTD
  GPIO_Digital_Output(&GPIOE_BASE, _GPIO_PINMASK_ALL);    // digital output PORTE

  for(i=0; i<32; i++)
    buff[i]=i+(i<<16);

  FLASH_ErasePage(Address);            // erase block (Address must be 2048 byte aligned)
  for(i=0; i<32; i++)
    FLASH_Write_Word(Address + i*4, buff[i]);     // write buffer with 32 long words

  ptr = (unsigned long*)Address;
  for(i=0; i<32; i++) {
    tmp = *ptr;
    GPIOD_ODR = HiWord(tmp);
    GPIOE_ODR = LoWord(tmp) << 8;
    ptr++;
    Delay_ms(50);
  }

  Delay_ms(1000);
  FLASH_ErasePage(Address2);            // erase block (Address must be 2048 byte aligned)
  FLASH_Write_HalfWord(Address2, 0xAAAA); // write one word
  GPIOD_ODR = 0;
  ptr = (unsigned long*)Address2;
  i = *ptr;
  GPIOE_ODR = (LoWord(i)) << 8;
  
}




simdi anladigim kadariyla. arm microcontrollerin flash hafizasinda herhangi bir yere istedigimiz long degiskeni yazabiliyoruz? pointer kullanarak address te istedigimiz yeri okuyabiliyoruz. yalniiiiiiz! istedigimiz hucreyi silemiyoruz. sadece page page silme islemi yapabiliyoruz.


library explaining ten  ve yukaridaki code dan bunlari anladim. yalniz aklimda iki adet soru olustu.

1- silecegim page i nasil belirleyecegim? ya orada program varsa?
2- long degiskeni char degiskene nasil cevirecegim?