stm32f4 ile seri port çalışan tek örnek arıyorum

Başlatan cebeci52, 15 Ağustos 2014, 20:11:26

EMP_Otto

Bu işler zordur,özveri ister...

cebeci52

üstat bu program çalışınca ekranda ne görmemiz gerekir onu anlamadım.

EMP_Otto

#17
ölcülen sıcaklık 35.568678 gibisacma birseyler :) ben simdi denedim bende sorunsuz calısıyor
Seriport için bunu kullan http://www.dosya.tc/server34/13WRfc/SeriPortV1.0.rar.html
Bu program calısmadan uyumak yok :)
Bu işler zordur,özveri ister...

cebeci52

#18
st link utilty ile hex dosyasını dedigin yerden yükledim com ledi yeşil - kırmızı yanıp sönüyor sürekli.

mesaj birleştirme:: 16 Ağustos 2014, 15:22:11

kardeş sorun olmazsa tel numaranı yazarsan müsaitsen bi görüşelim.

mesaj birleştirme:: 16 Ağustos 2014, 01:24:38

kardeş tel numaranı verir misin bugun bunu nasıl yapacam bi çözemedim müsaitsen.

EMP_Otto

Toprakları birbirine baglama olmazsa telefonla hallederiz  sadece tx-rx baglantısı kalsın
Bu işler zordur,özveri ister...

cebeci52


EMP_Otto

#21
tlfon numaramı özelden msj attım bi arada halledelim :)

mesaj birleştirme:: 16 Ağustos 2014, 15:48:04

Bu programlada veri alıp veri gönderebilirsiniz

#include <stm32f4xx.h>
#include <misc.h>
#include <stm32f4xx_usart.h>
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"


void init_USART1(uint32_t baudrate){


GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
    GPIOD->MODER = 0x55000000;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);


GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // Pins B6 (TX) and B7 (RX)
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStruct);


GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1);


USART_InitStruct.USART_BaudRate = baudrate;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART1, &USART_InitStruct);




USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


USART_Cmd(USART1, ENABLE);
}


void USART_puts(USART_TypeDef* USARTx, volatile char *s){

while(*s){

while( !(USARTx->SR & 0x00000040) );
USART_SendData(USARTx, *s);
*s++;
}
}
void send_char(char c)
{
	while(!(USART1->SR&0x80));
	   USART1->DR=c;
}
void delay()
{
unsigned int i;

     for(i=0;i<0x900000;i++);
}
void USART1_IRQHandler(void)
  {
    if( USART_GetITStatus(USART1, USART_IT_RXNE) )
        {
             char t = USART1->DR;

              if(t=='1')
                 {
            	 GPIO_SetBits(GPIOD,GPIO_Pin_15);
                 }
              if(t=='0')
              {
                 GPIO_ResetBits(GPIOD,GPIO_Pin_15);
              }
        }
}
int main(void)
{

    init_USART1(9600);
    USART_puts(USART1,"USART1 DENEME\n");
  while (1)
  {

  }
}

Bu işler zordur,özveri ister...

cebeci52

#22
Kardeşim derleyince bu hatayı veriyor ayar mı yapmak lazım gönderdiğin proje bilgisayarım-C de direk oraya kopyaladım





mesaj birleştirme:: 16 Ağustos 2014, 02:58:40

üstat yapmaya çalıştıgım projeyi senin gönderdiğin kodları ekledim derledim söyle bir sorun oluştu.

normalde micro C de voltmetre uygulaması yaptım kodlarını gönderiyorum

sbit LCD_RS at GPIOE_ODR.B8;
sbit LCD_EN at GPIOE_ODR.B10;
sbit LCD_D4 at GPIOE_ODR.B4;
sbit LCD_D5 at GPIOE_ODR.B5;
sbit LCD_D6 at GPIOE_ODR.B6;
sbit LCD_D7 at GPIOE_ODR.B7;

int sayi=0,mV=0;
char txt[7],volt[9];

int ADC_Olcum(char kanal)
{
unsigned long temp=0;
char k=0;
for (k=0;k<128;k++)
{
  temp+=ADC1_Get_Sample(kanal);
}
return temp>>7;
}

void LCD_Yaz(int okunan_deger)
{
mV=okunan_deger*0.7130;
if(mV>=10000)
  volt[0]=(mV/10000)+48;
  else volt[0]=' ';
  volt[1]=(mV%10000)/1000+48;
  volt[2]='.';
  volt[3]=(mV%1000)/100+48;
  volt[4]=(mV%1000)%100/10+48;
  volt[5]=(mV%1000)%100%10+48;
  volt[6]=' ';
  volt[7]='V';
 
  Lcd_Out(2,1,volt);
  }
   void main()
   {
   GPIO_Digital_Output(&GPIOE_BASE,_GPIO_PINMASK_9);
   GPIOE_ODR.B9=0;
   Lcd_init();
   ADC1_init();
   ADC_Set_Input_Channel(_ADC_CHANNEL_1);
   Lcd_Cmd(_LCD_CURSOR_OFF);
   Lcd_Out(1,1,"Voltmetre");
   do
   {
   delay_ms(500);
   sayi=ADC_Olcum(1);
   LCD_Yaz(sayi);

   }while(1);

   
   }

Senin gönderdiğin kodlara entegre ettim o da şöyle oldu ama derlerken şu hatayı aldım nerde yanlış yapıyorum acaba.

#include "stm32f4xx_usart.h"
#include "stm32f4xx_gpio.h";
#include "stm32f4xx_rcc.h";
#include "stdio.h"
#include <stdlib.h>



void usart_init()
{
   USART_InitTypeDef usart3;
   GPIO_InitTypeDef pin_ayar;
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//Usart 3 clock aktif edildi
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);

   usart3.USART_BaudRate=9600;
   usart3.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
   usart3.USART_Mode=USART_Mode_Tx;
   usart3.USART_Parity=USART_Parity_No;
   usart3.USART_StopBits=USART_StopBits_1;
   usart3.USART_WordLength=USART_WordLength_8b;
   USART_Init(USART3,&usart3);
    USART_Cmd(USART3,ENABLE);//Usart3 aktif edildi

    ///////////pin ayarları/////////////
    pin_ayar.GPIO_Mode=GPIO_Mode_AF;
    pin_ayar.GPIO_Pin=GPIO_Pin_10;
    pin_ayar.GPIO_Speed=GPIO_Speed_50MHz;
    pin_ayar.GPIO_OType = GPIO_OType_PP;
    pin_ayar.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOD,&pin_ayar);

    GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_USART3);//D8 pini tx olarak atandı
}
void USART_puts(USART_TypeDef* USARTx, volatile char *s){

while(*s){

while( !(USARTx->SR & 0x00000040) );
send_char(*s);
*s++;
}
}
void send_char(char c)
{
   while(!(USART3->SR&0x80));
      USART3->DR=c;
}
void delay()
{
unsigned int i;

     for(i=0;i<0x100000;i++);
}

int ADC_Olcum(char kanal)
{
unsigned long temp=0;
char k=0;
for (k=0;k<128;k++)
{
  temp+=ADC1_Get_Sample(kanal);
}
return temp>>7;
}

void volt_olcum(int okunan_deger)
{
   int mV=0;
   char txt[7],volt[9];

mV=okunan_deger*0.7130;
if(mV>=10000)
  volt[0]=(mV/10000)+48;
  else volt[0]=' ';
  volt[1]=(mV%10000)/1000+48;
  volt[2]='.';
  volt[3]=(mV%1000)/100+48;
  volt[4]=(mV%1000)%100/10+48;
  volt[5]=(mV%1000)%100%10+48;
  volt[6]=' ';
  volt[7]='V';

  printf("volt:%.8f \n",volt);

  }

int main(void)
{

   char dizi[20];
   //unsigned int sayi=0;
   float sayi=0;

   usart_init();

       GPIO_Digital_Output(&GPIOE_BASE,_GPIO_PINMASK_9);
      GPIOE_ODR.B9=0;

      ADC1_init();
      ADC_Set_Input_Channel(_ADC_CHANNEL_1);

      USART_puts(USART3, "-----------USART3 DENEME------------\n");
      do
      {
      delay_ms(500);
      sayi=ADC_Olcum(1);
      volt_olcum(sayi);

      delay();

      }while(1);
}

Aldıgım hata da şu şekilde resimde.





EMP_Otto

ADC Channel 1 tanımlı değil diyor.Bu kodlar micro c için keil ile derleyemezsin :) Yani microye özel fonksiyonlar.Verdiği hata klasör ismiyle alakalı galiba kullanıcı adın yiğit seklindeyse Ğ karekterinden dolayı OLABİLİR
Bu işler zordur,özveri ister...

kimlenbu

Aşağıdaki linkte hazır projeleri paylaşmıştım :

https://www.picproje.org/index.php/topic,50534.0.html

Ayrıca KEIL ile benim de ilk zamanlar çektiğim sıkıntı temel bir proje dosyası yaratmayı ve standart kütüphane dosyalarını eklemeyi bilmememdi, proje yapmaya girişmeden önce Keil'de bir proje oluşturmayı öğrenirsen bu hatalarla karşılaşmazsın.


@Klein'in açtığı şu başlığa da bakmanı öneririm :

https://www.picproje.org/index.php/topic,50915.0.html

cebeci52

Micro C de yazdıgım çalışan voltmetre uygulaması bu şekilde bunu nasıl usart com port çıkışına gönderebilirim kodları usart modülünü ekleyebilecek olan var mı?

sbit LCD_RS at GPIOE_ODR.B8;
sbit LCD_EN at GPIOE_ODR.B10;
sbit LCD_D4 at GPIOE_ODR.B4;
sbit LCD_D5 at GPIOE_ODR.B5;
sbit LCD_D6 at GPIOE_ODR.B6;
sbit LCD_D7 at GPIOE_ODR.B7;

int sayi=0,mV=0;
char txt[7],volt[9];

int ADC_Olcum(char kanal)
{
unsigned long temp=0;
char k=0;
for (k=0;k<128;k++)
{
  temp+=ADC1_Get_Sample(kanal);
}
return temp>>7;
}

void LCD_Yaz(int okunan_deger)
{
mV=okunan_deger*0.7130;
if(mV>=10000)
  volt[0]=(mV/10000)+48;
  else volt[0]=' ';
  volt[1]=(mV%10000)/1000+48;
  volt[2]='.';
  volt[3]=(mV%1000)/100+48;
  volt[4]=(mV%1000)%100/10+48;
  volt[5]=(mV%1000)%100%10+48;
  volt[6]=' ';
  volt[7]='V';
 
  Lcd_Out(2,1,volt);
  }
   void main()
   {
   GPIO_Digital_Output(&GPIOE_BASE,_GPIO_PINMASK_9);
   GPIOE_ODR.B9=0;
   Lcd_init();
   ADC1_init();
   ADC_Set_Input_Channel(_ADC_CHANNEL_1);
   Lcd_Cmd(_LCD_CURSOR_OFF);
   Lcd_Out(1,1,"Voltmetre");
   do
   {
   delay_ms(500);
   sayi=ADC_Olcum(1);
   LCD_Yaz(sayi);

   }while(1);

   
   }

cebeci52

ADC Channel 1 tanımlı değil diyor.Bu kodlar micro c için keil ile derleyemezsin :) Yani microye özel fonksiyonlar.Verdiği hata klasör ismiyle alakalı galiba kullanıcı adın yiğit seklindeyse Ğ karekterinden dolayı OLABİLİR

üstat bu coocox da bu ADC Channel 1 i nasıl tanımlayacam acaba kütüphanesi mi yok anlayamadım.

LukeSkywalker

MikroC+STM32+Uart+2*16 LCD

Şema MikroC-ARM kitabının 17. bölüm uygulama-1'in şeması. Aşağıdaki linkte hex dosyası mevcut.
http://www.dosya.tc/server34/JJz1vg/MyProject.rar.html

cebeci52

#28
eyvallah sagolun video olunca daha iyi oldu. çalıştırdım.





LukeSkywalker