www.picproje.com forum sitesinde Bülent ÜNALMIŞ ın öncülüğünde alınanSTM32F4DISCOVERY kartlarla yavaş yavaş projeler ortaya çıkmaya başladı. Örnekleri çoğaltmak için elimizden geldiğinde çalışmaya devam edeceğim. Bu projede kart üzerinde bulunan MEMS LIS302DL ivme ölçer ile SPI üzerinden bilgiler alınıyor. Alınan bu bilgiler USART üzrinden vb.net 2010 express edition da yazılmış bir grafik arayüzüne aktarılıyor.
Aynı yöntemi kullanarak analog dijital çevirici ile scop yapabilirim düşüncesindeyim.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
#include "STM32F4xx.h" unsigned char WAdr,RAdr; char RxBuf[128]; char TxBuf[128]; /********************************************************************************* CPU frekansi 168Mhz AHB frekansi 84 Mhz APB frekansi 42 Mhz *********************************************************************************/ void SystemInit() { unsigned int i; for (i=0;i>0x00100000;i++); // OSC oturtma ve kurtarma rutini RCC->CFGR |= 0x00009400; // AHB ve APB hizlarini max degerlere set edelim RCC->CR |= 0x00010000; // HSE Xtal osc calismaya baslasin while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin RCC->PLLCFGR = 0x07402A04; // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim 168 Mhz RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 95) while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle FLASH->ACR = 0x00000605; // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55) RCC->CFGR |= 0x00000002; // Sistem Clk u PLL uzerinden besleyelim while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle RCC->AHB1ENR |= 0x0000001F; // GPIO A,B,C,D,E clock'u aktif edelim GPIOD->MODER = 0x55550000; // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin) GPIOD->OSPEEDR= 0xFFFFFFFF; // GPIOD nin tum cikislari en yuksek hizda kullanacagiz RCC->APB2ENR|=0x00000100; // ADC saat kaynağını aktif ettik. //PB->MODER.p0 = PORT_ANALOG; // PortB0 analog GPIOB->MODER |= 0x00000003; ADC1->CR1 |=0x00000100; // ADC scan modunda çalışacak. ADC1->SQR3 |= 0x00000008; // Çevrime ilk girecek kanal 8. (PB0) ADC1->CR2 |=0x00000003; // AD converter'i açtık. Sürekli çevirim yapacağımızı belirttik. GPIOA->AFR[0]|=0x55500000; // SPI1 secelim (Rehber Sayfa 141), Hard Sayfa 49 GPIOA->MODER|=0x0000A800; // A7,A6,A5 Alternatif fonksiyon RCC->APB2ENR|=0x00001000; // SPI1 clk enable // GPIOE3 pinini output tanimlayalim (LIS302DL SPI/I2C secimi) GPIOE->MODER = 0x00000040; // GPIOE nin 3 nolu pini cikis tanimlandi GPIOE->OSPEEDR= 0xFFFFFFFF; // GPIOE nin tum cikislari en yuksek hizda kullanacagiz GPIOE->BSRRL=0x0008; // GPIOE3=1; LIS302DL CS=1 SPI1->CR1=0x00000B7F; // SPI1 16 bit, master , fulldublex vs SPI1->CR2=0X0000; } /********************************************************************************* USART3 modulunu kullanarak asenkron haberlesme (Hata kontrolu yapilmiyor) *********************************************************************************/ void USART3_IRQHandler() { volatile int Sts; Sts=USART3->SR; RxBuf[WAdr]=USART3->DR; WAdr=(WAdr+1)&0x7F; } void UsartInit() { WAdr=0;RAdr=0; // USART3 MODULUNU AKTIF HALE GETIRELIM RCC->APB1ENR|=0x00040000; // USART3 Clk Enable (Rehber Sayfa 113) RCC->APB1RSTR|=0x00040000; // USART3 Resetlendi GPIOB->AFR[1]=0x07777700; // PB10..PB14 pinleri USART3 ile alakalandirildi (Hard Sayfa 49) GPIOB->MODER|=0x2AA00000; // GPIOB 10..14 icin alternatif fonksiyon tanimi (Rehber Sayfa 148) // USART3 MODULUNU AYARLAYALIM // 1 Start, 8 Data, 1 Stop, No parity (Default degerler) RCC->APB1RSTR&=~0x00040000; // USART3 Reseti kaldiralim // USART3->SR&=~0X03FF; // Status registeri silelim USART3->BRR=0X1112; // 9600 Baud USART3->CR1|=0x0000202C; // USART3 enable NVIC->ISER[1]|=0x80; // NVIC da USART3 interrupta izin verelim } void SendChar(char Tx) { while(!(USART3->SR&0x80)); // TX Buffer dolu ise bekle (Rehber Sayfa 646) USART3->DR=Tx; } void SendTxt(char *Adr) { while(*Adr) { SendChar(*Adr); Adr++; } } char DataReady() { return(WAdr-RAdr); } char ReadChar() { char Dat; Dat=RxBuf[RAdr]; RAdr=(RAdr+1)&0x7F; return(Dat); } // Rx ve TX pinlerini (GPIOB10 ve GPIOB11) birbirine baglarsaniz gonderdiginiz datalar geri gelecektir signed char SPI_CMD(short DAT) { signed char RxDat; GPIOE->BSRRH=0x0008; // LIS302DL CS=0 RxDat=SPI1->SR; // AMAC DELAY (kalmasinda fayda var) SPI1->DR=DAT; // Komutu yukle while(!(SPI1->SR&0x01)); // RX BUF bos ise beklemede kal while(SPI1->SR&0x80); // BSY durumu varsa kalkmasini bekleyelim RxDat=SPI1->DR; // Cipten gelen veriyi oku while(SPI1->SR!=0x02); // CS=1 yapmadan once cipin orjinal duruma donmeyi bekleyelim GPIOE->BSRRL=0x0008; // LIS302DL CS=1 return(RxDat); } signed char Write(char Adr,unsigned char Data) { return(SPI_CMD(((Adr&0x3F)>>8 )|Data)); } signed char Read(char Adr) { return(SPI_CMD(((Adr&0x3F)|0x80)>>8 )); } int main() { signed char who, b; int i; UsartInit(); if(Read(0x0F)==0x3B) // Who are you ? { Write(0x20,0x47); // Data Rate=100Hz, Full Scale=2g, Activate, x,y,z enable } while(1){ who=Read(0x27); // Statusu ogrenelim. Kim hazir kim değil? if (who&1) { b=Read(0x29); } SendChar(b); for (i=0;i>0x00200000;i++); } } |
PC programı için Seri Chart kısayoluna tıklamanız yeterlidir. Pc arayüzünün kodlarında düzenleme yapmanız için VB.net express edition un yüklü olması gerekir.
projenin çalışma videosu
[youtube https://www.youtube.com/watch?v=L8A96DOBsY4?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata&w=320&h=266]
Ziyaretci : 1985