STM32F10X Çalışmalarım

Başlatan Mucit23, 12 Mart 2012, 11:17:48

Mucit23

I2C de problem yaşıyorum.

Kullandığım kütüphaneyi vereyim.
/******************************************************************************/
/* I2C_STM32.c: STM32 low level I2C routines                                  */
/******************************************************************************/
/* This file is part of the uVision/ARM development tools.                    */
/* Copyright (c) 2005-2009 Keil Software. All rights reserved.                */
/* This software may only be used under the terms of a valid, current,        */
/* end user licence from KEIL for a compatible version of KEIL software       */
/* development tools. Nothing else gives you the right to use this software.  */
/******************************************************************************/
#include "stm32f10x.h"
#include "I2C.h"

/************************ Local auxiliary functions ***************************/

/*******************************************************************************
* I2C communication status                                                     *
*   Parameter:                                                                 *
*   Return:               status                                               *
*******************************************************************************/

static __inline unsigned int I2C_sr (void) {
  unsigned int sr;

  sr  = I2C1->SR1;
  sr |= I2C1->SR2 << 16;
  return (sr);
}

/************************ Exported functions **********************************/

/*******************************************************************************
* Initialize I2C interface in master mode                                      *
*   Parameter:                                                                 *
*   Return:                                                                    *
*******************************************************************************/

void I2C_Setup (void) {
  unsigned int tout;

  /* Enable clock for I2C1, GPIOB and AFIO                                    */
  RCC->APB2ENR |= (1 << 3) | (1 << 0); //
  RCC->APB1ENR |= (1 << 21);

//  /* I2C1 pins remapped, use PB6, PB7                                         */
 // AFIO->MAPR   |= 0x00000000;  // Remap=1: (SCL/PB8, SDA/PB9)
  GPIOB->CRL   |= 0xFF000000;  // Alternate IO PB8 and PB9

  I2C1->CR1     = 0x8000;               /* Reset I2C peripheral               */
  for (tout = 1000000; tout; tout--);
  I2C1->CR1     = 0x0000;

  /* Configure I2C peripheral                                                 */
  I2C1->CR1     = 0x0001;		// PE - Peripheral Enable
  I2C1->CR2     = 0x0024;	  	// Freq 36 MHz
  I2C1->CR1     = 0x0000; 		// PE Disable
  I2C1->TRISE   = 0x0025;  		// Time Rise - program when PE=0 
  I2C1->CCR     = 0x00B4;  		// 0x005A = 400 KHz (36MHz / 90) 	0x00B4 = 200 KHz
  I2C1->CR1    |= 0x0401;
  I2C1->OAR1    = 0x40A0;
}


/*******************************************************************************
* Generate start condition on I2C bus                                          *
*   Parameter:                                                                 *
*   Return:                                                                    *
*******************************************************************************/

void I2C_Start (void) {
if ( I2C1->CR1 & ( 1 << 10 ) ) {
		I2C1->CR1 &= ~(1 << 10 );
	} 
  I2C1->CR1 |= 0x0100; //start genneration when bus free
  while (!(I2C_sr() & 0x0001));
}

/*******************************************************************************
* Generate stop condition on I2C bus                                           *
*   Parameter:                                                                 *
*   Return:                                                                    *
*******************************************************************************/

void I2C_Stop (void) {

  I2C1->CR1 |= 0x0200;
  while (I2C_sr() & 0x00020000);        /* Wait until BUSY bit reset          */
}


/*******************************************************************************
* Write address on I2C interface                                               *
*   Parameter:    adr:    address to be written                                *
*   Return:                                                                    *
*******************************************************************************/

void I2C_Addr (unsigned char adr) {

  I2C1->DR = adr;
  while (!(I2C_sr() & 0x0002));	//Addr sent 
}


/*******************************************************************************
* Write a byte to I2C interface                                                *
*   Parameter:    c:      data to be written                                   *
*   Return:                                                                    *
*******************************************************************************/

void I2C_Write (unsigned char c) {

  I2C1->DR = c;
  while (!(I2C_sr() & 0x00000004));     /* Wait until BTF bit set             */ 
}


/*******************************************************************************
* Read a byte from I2C interface                                               *
*   Parameter:                                                                 *
*   Return:               read data                                            *
*******************************************************************************/

unsigned char I2C_Read (int ack) {

  /* Enable/disable Master acknowledge                                        */
  if (ack) I2C1->CR1 |=  0x0400;
  else     I2C1->CR1 &= ~0x0400;

  while (!(I2C_sr() & 0x00000040));     /* Wait until RxNE bit set            */
  return (I2C1->DR);
}

/******************************************************************************/

unsigned char I2C_getbyte(unsigned char address, unsigned char cmd) {
	unsigned char uc;
	I2C_Start();		  	// Initial Start bit sequence
	I2C_Addr(address);	 	// Address I2C Device. (Base address is Write Address)
	I2C_Write(cmd);			// Transfer Command to I2C Device (Register to be Read) 
	I2C_Start(); 			// Repeated start bit sequence
	I2C_Addr(address+1);	// Address I2C Device. (Base address + 1 is Read Address)
	uc = I2C_Read(0);		// Read 1 byte without Acknowledge
	I2C_Stop();				// Stop I2C transfer
	return( uc );
}

unsigned short int I2C_getword(unsigned char address, unsigned char cmd) {
	unsigned short int uw;
	//unsigned short int uw2;
	I2C_Start();		  	// Initial Start bit sequence
	I2C_Addr(address);	 	// Address I2C Device. (Base address is Write Address)
	I2C_Write(cmd);			// Transfer Command to I2C Device (Register to be Read) 
	I2C_Start(); 			// Repeated start bit sequence
	I2C_Addr(address+1);	// Address I2C Device. (Base address + 1 is Read Address)
	uw = I2C_Read(1) << 8;		// Read MSB  without Acknowledge
	uw |= I2C_Read(0); 			// Read LSB	 with Acknowledge
	I2C_Stop();				// Stop I2C transfer
	return( uw );
	
}
void I2C_putbyte(unsigned char address, unsigned char cmd, unsigned char data) {
	I2C_Start();		  	// Initial Start bit sequence
	I2C_Addr(address);	 	// Address I2C Device. (Base address is Write Address)
	I2C_Write(cmd);			// Transfer Command to I2C Device (Register to be Read) 
	I2C_Write(data);		// Transfer Data to I2C device
	I2C_Stop();				// Stop I2C transfer
}

int I2C_getbytearray(unsigned char address, unsigned char cmd, int number, unsigned char *data) {
	int count;
	I2C_Start();		  	// Initial Start bit sequence
	I2C_Addr(address);	 	// Address I2C Device. (Base address is Write Address)
	I2C_Write(cmd);			// Transfer Command to I2C Device (Register to be Read) 
	I2C_Start(); 			// Repeated start bit sequence
	I2C_Addr(address+1);	// Address I2C Device. (Base address + 1 is Read Address)
	// Read number - 1 bytes with Acknowledge
	for ( count=0; count < number - 2; count++ ) {
		data[count] = I2C_Read(1);		// Read with Acknowledge
	}
	data[count] = I2C_Read(0);		// Last byte without Acknowledge
	I2C_Stop();				// Stop I2C transfer
	return( count+1 );
}


Bu kütüphanede I2C_Write fonksiyonu ile I2C den data göndermek istediğimde i2c modülü datayı göndermiyor. Ben fonksiyona data gönderiyorum ama I2C1->DR regsiterine data yazılıyor fakat BTF(Byte Transfer Finished) Biti set edilmediği için  işlemci orada takılıp kalıyor. Zaten I2C Data hattındada hiç hareket yok.

Ama I2C Start ve Stop fonksiyonları çalışıyor.Fonksiyonları çağırdığımda da  i2c hattında bu bitlerin oluştuğunu görebiliyorum.

Bu neden kaynaklanabilir? Kafayı yedirtecek bana...   :-X

Mucit23

#241
Dünden beri uğraşıyorum ne yaptıysam ds1307 den bilgi okuyamadım.

DS1307 nin SQW bacağına led bağladım. Eğer İlk kurulumu düzgün yaparsam bu led 1 sn aralıklarla yanıp sönmesi gerekiyor. DS1307 ye hiç yazma yapamıyorum. Zaten kristal bacaklarındada hiç salınım göremiyorum. Osilatör kapalı.
I2C Donanımını Test ediyorum Ondada sıkıntı yok gibi osiloskop ile hattı izlediğimde Start, Stop, ACK ve Data bitlerini görebiliyorum.

RTC için CCS de kulandığım kütüphaneyi kullandım. Keil de derlenecek şekilde düzenledim.
#include "stm32f10x.h"
#include "systick.h"
#include "RTC.h"
#include "I2C.h"

void RTC_init(){
	 
   uint8_t seconds = 0; 

   I2C_Start(); 
   I2C_Addr(0xD0);      // WR to RTC 
   I2C_Write(0x00);      // REG 0 
   I2C_Start(); 
   I2C_Addr(0xD1);      // RD from RTC 
   seconds = bcd2bin(I2C_Read(0)); // Read current "seconds" in DS1307 
   I2C_Stop(); 
   seconds &= 0x7F; 

   delay_us(3); 

   I2C_Start(); 
   I2C_Addr(0xD0);      // WR to RTC 
   I2C_Write(0x00);      // REG 0 
   I2C_Write(bin2bcd(seconds));     // Start oscillator with current "seconds value 
   I2C_Start(); 
   I2C_Addr(0xD0);      // WR to RTC 
   I2C_Write(0x07);     // Control Register 
   I2C_Write(0x10);     // Enable squarewave output pin 
   I2C_Stop(); 
}

void RTC_Set_Date_Time(uint8_t day, uint8_t mth, uint8_t year, uint8_t dow, uint8_t hr, uint8_t min, uint8_t sec) 
{ 
  sec &= 0x7F; 
  hr &= 0x3F; 

  I2C_Start(); 
  I2C_Addr(0xD0);                // I2C write address 
  I2C_Write(0x00);               // Start at REG 0 - Seconds 
  I2C_Write(bin2bcd(sec));       // REG 0 
  I2C_Write(bin2bcd(min));       // REG 1 
  I2C_Write(bin2bcd(hr));        // REG 2 
  I2C_Write(bin2bcd(dow));       // REG 3 
  I2C_Write(bin2bcd(day));       // REG 4 
  I2C_Write(bin2bcd(mth));       // REG 5 
  I2C_Write(bin2bcd(year));      // REG 6 
  I2C_Write(0x80);               // REG 7 - Disable squarewave output pin 
  I2C_Stop(); 
} 

unsigned int RTC_Get_Date() 
{ 
	unsigned char Day=0, WeekDay=0, Month=0, Year=0;
	unsigned int Time=0;
  I2C_Start(); 
  I2C_Addr(0xD0); 
  I2C_Write(0x03);            // Start at REG 3 - Day of week 
  I2C_Start(); 
  I2C_Addr(0xD1); 
  WeekDay = bcd2bin(I2C_Read(1) & 0x7f);   // REG 3 
  Day     = bcd2bin(I2C_Read(1) & 0x3f);   // REG 4 
  Month   = bcd2bin(I2C_Read(1) & 0x1f);   // REG 5 
  Year    = bcd2bin(I2C_Read(0));          // REG 6 
  I2C_Stop(); 

	Time=(Year*100000)+(Month*1000)+(Day*10)+WeekDay;
	return Time;
} 

unsigned int RTC_Get_Time() 
{ 
	unsigned char Sec=0,Min=0,Hour=0;
	unsigned int Time=0;
  I2C_Start(); 
  I2C_Addr(0xD0); 
  I2C_Write(0x00);            // Start at REG 0 - Seconds 
  I2C_Start(); 
  I2C_Addr(0xD1); 
  Sec = bcd2bin(I2C_Read(1) & 0x7f); 
  Min = bcd2bin(I2C_Read(1) & 0x7f); 
  Hour = bcd2bin(I2C_Read(0) & 0x3f); 
  I2C_Stop(); 
	
	Time = (Hour*10000)+(Min*100)+Sec;
  return Time;
} 

unsigned char bin2bcd(unsigned char binary_value) 
{ 
  unsigned char temp; 
  unsigned char retval; 

  temp = binary_value; 
  retval = 0; 

  while(1) 
  { 
    // Get the tens digit by doing multiple subtraction 
    // of 10 from the binary value. 
    if(temp >= 10) 
    { 
      temp -= 10; 
      retval += 0x10; 
    } 
    else // Get the ones digit by adding the remainder. 
    { 
      retval += temp; 
      break; 
    } 
  } 
  return(retval); 
} 


// Input range - 00 to 99. 
unsigned char bcd2bin(unsigned char bcd_value) 
{ 
  unsigned char temp; 

  temp = bcd_value; 
  // Shifting upper digit right by 1 is same as multiplying by 8. 
  temp >>= 1; 
  // Isolate the bits for the upper digit. 
  temp &= 0x78; 

  // Now return: (Tens * 8) + (Tens * 2) + Ones 

  return(temp + (temp >> 2) + (bcd_value & 0x0f)); 
}


Bi yardım lütfen.

Edit;

Çok Şükür Çalıştırdım. Sorun şurdaymış.
Ben RTC kütüphanesini hazırlarken Hem adres Yazma hemde data göndermek için I2C_Write Fonksiyonunu kullanıyordum. Osiloskop ile I2C Data hattını incelerken baktımki I2C_Write İle ard arda veri gönderirken I2C_Start bititnden sonra sadece ilk gönderdiğim data yollanıyor. Ondan sonra Tekrar Start biti gelene kadar hatta birşey gönderilmiyor. Çözüm ise I2C aygıtına adres bilgisi gönderilirken I2C kütüphanesinindeki I2C_Addr fonksiyonunu kullanmakmış. Onları değiştirince düzeldi.

Bir önceki mesajımdaki BTF bitinin set edilmemesi sorunuda burdan kaynaklanıyormuş. Oda düzeldi.

Mucit23

#242
Akşam akşam ilginç bir sorunla karşı karşıya kaldım   ???

Stm32F103 ün PA.1 bacağından aldığım bir sinyal aynı anda PA.6 danda çıkıyor. Yani bu iki pin kısa devreymiş gibi davranıyor. Gerçekte öyle birşey görmüyorum.

Yaptıklarımı söyliyeyim.

#define Set  GPIOA->BSRR  = 0x00000002;
#define Clr  GPIOA->BRR   = 0x00000002;

Main döngüsünde bu iki makroyu kullanarak sürekli kare sağlıyorum. Fakat Her nedense buradan aldığım sinyal PA6 danda çıkıyor. Arada fiziksel bir bağlantı yok. Yazılımıda inceledim buna sebeb verecek birşey göremiyorum. Bu yüzden PA5,PA6 ve PA7 dek spi donanımıda düzgün çalışmıyor.

Acaba işlemcimi bozuldu?

Edit;
Uğraştıkça çözülüyor.

Sorun Keildenmiş.

Şuanki proje dosyasını 2  hafta önce bilgisayarın başka bir bölümüne yedeklemiştim. Proje dosyası ismi vs herşey aynı olduğu için keil oradaki proje dosyasındaki kodlarla şuan uğraştığım proje dosyasındaki kodları harmanlayıp işlemciye gömüyor. Bende yukarıda anlattığım sorunlarla karşılaşıyorum. Akşam akşam deli etti beni  >:( >:(

mistek

Alıntı yapılan: Mucit23 - 05 Ağustos 2013, 13:29:05
Yahu Çözdüm işi  :D Tamam Şimdi Herşey yerine oturdu.

Her kanal için farklı Tim_OC init fonksiyonları varmış. 2.Kanal için TIM_OC2Init, 3. Kanal için TIM_OC3Init vs. Bunların değişmesi gerekiyormuş.

@Mucit23
Bende PWM sinyali aldığım pini kapatmak(isteğime göre 0 veya 1) istiyorum.

İlgili pini AF moddan çıkarıp Normal Out moda alıyorum ama arada PWM sinyali kaçırıyor.

Siz nasıl çözmüştünüz?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Mucit23

Hocam I2C dede benim başıma Geldi. GPIO AF modundan çıkırınca rastgele sinyal çıkıyor. Yani konumu lojik 1 de ise anlık olarak lojik 0'a inip tekrar lojik 1 çıkıyor gibi.

Ben STM32F10x'de P10 Panelin parlaklığını ayarlamak için modüleli pwm sinyali almaya çalışıyordum. Gerçekte Timeri Durdurup Ardından çıkışı lojik 0 a çekmek işe yarıyordu sanırım. Ama ben öyle yapmadım. Harici olarak VE kapısı kullanıp iki adet sinyali üst üste bindirdim.

Bu başlıkta Sayfa 13 ve 14'e bak istersen 

tekosis

#245
belki karşılaşmışsınızdır. DMA ile DAC yi sürmek istiyorum. bu arada osc ekranında pir peryot boyunca istediğim, tamda tanımlı bilgileri alıyorum ama araya yine tam bir periyotluk başka bir sinyal giriyor. yani bir periyot benim sinyalim, bir periyot kare dalga benzeri bir sinyal alıyorum. mantıksal olarak böyle bir şeye ne sebep olabilir. kodları sadeleştirmek istemedim arkadaşlar biraz uzun ama tamamını paylaşmak istiyorum. program mikroc.

/ DAC Test for STM32F407VG STM32F4-Discovery Board

// default options of HSE osc 168MHz

// DAC1 outputs on PA4   - you will need an oscilloscope to see the output waveform
// DAC2 outputs on PA5   - not used here
// DAC1 requires access to DMA1 Stream 5, Channel 7
// DAC_DHR8R1bits absolute 0x40007410;
// DAC_DHR8R2bits absolute 0x4000741C;
// DAC_DHR12R1bits absolute 0x40007408;                   // PA4
// DAC_DHR12R2bits absolute 0x40007414;                   // PA5
// DAC_DHR12L1bits absolute 0x4000740C;
// DAC_DHR12L2bits absolute 0x40007418;

unsigned int *pointer;
unsigned short int x;

// sine wave look up table
const Sine12bit[181] = {
1927,1992,2056,2121,2185,2249,2312,2375,2437,2499,2559,2619,2678,2736,2793,2848,
2903,2956,3008,3059,3108,3155,3201,3245,3288,3329,3368,3405,3441,3474,3506,3535,
3563,3588,3611,3633,3652,3668,3683,3695,3706,3713,3719,3723,3724,3723,3719,3713,
3706,3695,3683,3668,3652,3633,3611,3588,3563,3535,3506,3474,3441,3405,3368,3329,
3288,3245,3201,3155,3108,3059,3008,2956,2903,2848,2793,2736,2678,2619,2559,2499,
2437,2375,2312,2249,2185,2121,2056,1992,1927,1862,1797,1732,1667,1603,1539,1475,
1411,1349,1286,1225,1164,1105,1046,988,931,875,821,767,716,665,616,568,523,478,
436,395,356,318,283,249,218,188,161,136,112,91,72,55,41,28,18,10,5,1,0,1,5,10,
18,28,41,55,72,91,112,136,161,188,218,249,283,318,356,395,436,478,523,568,616,
665,716,767,821,875,931,988,1046,1105,1164,1225,1286,1349,1411,1475,1539,1603,
1667,1732,1797,1862,1862};
  


// *****************************************************************************
//    Timer 6 Configure Subroutine
// *****************************************************************************
void Timer6_Configure(void) {

  CEN_TIM6_CR1_bit = 0;                                   // Disable timer before configuring it

/* Time base configuration */
// Bits 15:8 Reserved, must be kept at reset value
// Bits 6:4 Reserved, must be kept at reset value
// Bit 2 URS: Update request source 1: Only counter overflow/underflow generates an update interrupt or DMA request if enabled.
  ARPE_TIM6_CR1_bit = 1;                                  // Bit 7 ARPE: Auto-reload preload enable = 1
  OPM_TIM6_CR1_bit = 0;                                   // One-pulse mode -0: Counter is not stopped at update event
  URS_TIM6_CR1_bit = 0;
  UDIS_TIM6_CR1_bit = 0;                                  // Bit 1 UDIS: Update disable
  
// TIM6_CR2bits
// Bits 15:7 Reserved, must be kept at reset value
// Bits 6:4 MMS: Master mode selection
  MMS2_TIM6_CR2_bit = 0;                                  // Bits 6:4MMS: Master mode selection
  MMS1_TIM6_CR2_bit = 1;                                  // Update - The update event is selected as a trigger output (TRGO).
  MMS0_TIM6_CR2_bit = 0;                                  // For instance a master timer can then be used as a prescaler for a slave timer
// Bits 3:0 Reserved, must be kept at reset value

//TIM6 DIER bits
// Bit 15:9 Reserved, must be kept at reset value
// Bit 7:1 Reserved, must be kept at reset value
// Bits 3:0 Reserved, must be kept at reset value
  TIM6_DIER.UDE = 0;    //dma kesmesi istemiyor                                  // Bit 8 UDE: Update DMA request enable
  TIM6_DIER.UIE = 0;    //dma kesmesi sitemiyor                                  // Bit 0 UIE: Update interrupt enable

// Auto-Reload Register (TIMx_ARR)
// Auto load register  65522 (32 bit register) count down to zero
//  TIM6_ARR = 631;                                       // 631 = 2200 Hz @64 steps
  TIM6_ARR = 1157;                                        // 1157 = 1200 Hz @64 steps
  TIM6_PSC =0;                                           // Set timer prescaler
}
// *****************************************************************************
//    DAC Channel 1 Configure Subroutine
// *****************************************************************************

void DAC_Ch1_Config(void) {
  EN2_bit = 0;
  EN1_bit = 0;
//                                                        // Bits 31:30 Reserved must be kept at default value
  DMAUDRIE2_bit = 0;                                      // Bits 29 DMAUDRIE2  DAC channel2 DMA underrun interrupt enable
  DMAEN2_bit = 1;                                         // Bit 28 DMAEN2  DAC channel2 DMA enable
  MAMP23_bit = 0;                                         // Bit 27 MAMP2 3 DAC channel2 mask/amplitude selector
  MAMP22_bit = 0;                                         // Bit 26 MAMP2 2 DAC channel2 mask/amplitude selector
  MAMP21_bit = 0;                                         // Bit 25 MAMP2 1 DAC channel2 mask/amplitude selector
  MAMP20_bit = 0;                                         // Bit 24 MAMP2 0 DAC channel2 mask/amplitude selector
  WAVE21_bit = 0;                                         // Bit 23 WAVE2 1 DAC channel2 noise/triangle wave generation enable
  WAVE20_bit = 0;                                         // Bit 22 WAVE2 0 DAC channel2 noise/triangle wave generation enable
  TSEL22_bit = 0;                                         // Bit 21 TSEL2 2 DAC channel1 trigger selection
  TSEL21_bit = 0;                                         // Bit 20 TSEL2 1 DAC channel1 trigger selection
  TSEL20_bit = 0;                                         // Bit 19 TSEL2 0 DAC channel1 trigger selection
  TEN2_bit = 1;                                           // Bit 18 TEN2: DAC channel 2 trigger enable
  BOFF2_bit = 0;                                          // Bit 17 BOFF2: DAC channel 2 output buffer disable
//                                                        // Bits 15:14 Reserved must be kept at default value
DMAUDRIE1_bit = 0;//  DMAUDRIE1_bit = 0;                                      // Bit 13 DMAUDRIE1 DAC channel 1 DMA Underrun Interrupt enable
 DMAEN1_bit = 1;// DMAEN1_bit = 1;                                         // Bit 12 DMAEN1  DAC channel 1 DMA enable  - DMA Mode Enabled
  MAMP13_bit = 0;                                         // Bit 11 MAMP1 3 - DAC channel 1 mask/amplitude selector
  MAMP12_bit = 0;                                         // Bit 10 MAMP1 2 - DAC channel 1 mask/amplitude selector
  MAMP11_bit = 0;                                         // Bit 9 MAMP1 1 - DAC channel 1 mask/amplitude selector
  MAMP10_bit = 0;                                         // Bit 8 MAMP1 0 - DAC channel 1 mask/amplitude selector
  WAVE11_bit = 0;                                         // Bit 7 WAVE1 1 DAC channel 1 noise/triangle wave generation enable
  WAVE10_bit = 0;                                         // Bit 6 WAVE1 0 DAC channel 1 noise/triangle wave generation enable
  TSEL12_bit = 0;//  TSEL12_bit = 0;                              // Bit 5 TSEL bit 2 - DAC channel 1 trigger selection -  TIMR6 Output Event
  TSEL11_bit = 0; //TSEL11_bit = 0;                                         // Bit 4 TSEL bit 1 - Note: Only used if bit TEN1 = 1 (DAC channel1 trigger enabled)
  TSEL10_bit = 0;                                         // Bit 3 TSEL bit 0
  TEN1_bit = 1;                                           // Bit 2 TEN 1: DAC channel 1 trigger enable
  BOFF1_bit = 0;//BOFF1_bit = 0;                                          // Bit 1 BOFF 1: DAC channel 1 output buffer disable - 0 = Enabled
}

/* ************************************************************************* */
/* DMA1_Stream 5 channel 7 configuration                                     */
/* ************************************************************************* */
void DMA1_Stream5_Ch7_Config(void) {

//  DMA_Cmd(DMA1_Stream5, DISABLE);
  EN_DMA1_S5CR_bit = 0;                                   // disable audio stream
  while (EN_DMA1_S5CR_bit==1) {                           // wait for audio stream to be disabled
  }                                                       // before changing DMA settings
// All Stream5 Status dedicated registers to be cleared
  CTCIF5_DMA1_HIFCR_bit = 1;                              // Channel 5 transfer complete clear
  CHTIF5_DMA1_HIFCR_bit = 1;                              // Channel 5 half transfer clear
  CTEIF5_DMA1_HIFCR_bit = 1;                              // Channel 5 transfer error clear
  CDMEIF5_DMA1_HIFCR_bit = 1;
  CFEIF5_DMA1_HIFCR_bit = 1;
//  DMA1_LIFCR = 0x00000F40;                              // clear DMA IRQ flags

//  DMA_InitStructure.DMA_PeripheralBaseAddr              (uint32_t)DAC_DHR12R2_ADDRESS;
//  DMA1_S5PAR = &DAC_DHR12R2;                            //DAC_DHR12R2_ADDRESS = 0x40007414  - PA5
  DMA1_S5PAR = &DAC_DHR12R1;                              //DAC_DHR12R2_ADDRESS = 0x40007408  - PA4
    
//  DMA_InitStructure.DMA_Memory0BaseAddr                 (uint32_t)&Sine12bit;
//  M0AR is the address register used for circular mode
  DMA1_S5M0AR = &Sine12bit;                               // Bit 31: Memory 0 address

//  DMA_InitStructure.DMA_BufferSize = 64;
  DMA1_S5NDTR = 181;

//  DMA_InitStructure.DMA_Channel = DMA_Channel_7;
//  #define DMA_Channel_7                                 ((uint32_t)0x0E000000)
  CHSEL2_DMA1_S5CR_bit=1;                                 // Bit 27 Channel selection
  CHSEL1_DMA1_S5CR_bit=1;                                 // Bit 26 Channel selection
  CHSEL0_DMA1_S5CR_bit=1;                                 // Bit 27 Channel selection

//  DMA_MemoryBurst Single                                ((uint32_t)0x00000000)0
  MBURST1_DMA1_S5CR_bit=0;                                // Bit 24 Memory burst transfer configuration
  MBURST0_DMA1_S5CR_bit=0;                                // Bit 23 Memory burst transfer configuration

//  DMA_PeripheralBurst Single                            ((uint32_t)0x00000000)
  PBURST1_DMA1_S5CR_bit=0;                                // Bit 22 Peripheral burst transfer configuration
  PBURST0_DMA1_S5CR_bit=0;                                // Bit 21 Peripheral burst transfer configuration
  
// ACK
  ACK_DMA1_S5CR_bit = 0;                                  // DMA1_S5CR.B20;
    
// CT
  CT_DMA1_S5CR_bit = 0;                                   // Bit 19  DMA1_S5CR.B19;
    
// DBM
  DBM_DMA1_S5CR_bit = 0;                                  // Bit 18  DMA1_S5CR.B18;
    
//  #define DMA_Priority_High                             ((uint32_t)0x00020000)
  PL1_DMA1_S5CR_bit=1;                                    // Bit 17  Priority level (HIGH)
  PL0_DMA1_S5CR_bit=0;                                    // Bit 16  Priority level (HIGH)
    
//  PINCOS
  PINCOS_DMA1_S5CR_bit = 0;                               //
    
//  #define DMA_MemoryDataSize_HalfWord                   ((uint32_t)0x00002000)
  MSIZE1_DMA1_S5CR_bit=0;                                 // Bits 14 = 0 Memory data size
  MSIZE0_DMA1_S5CR_bit=1;                                 // Bits 13 = 1 Memory data size

//  #define DMA_PeripheralDataSize_HalfWord               ((uint32_t)0x00000800)
  PSIZE1_DMA1_S5CR_bit=1;                                 // Bit 12 Peripheral data size
  PSIZE0_DMA1_S5CR_bit=0;                                 // Bit 11 Peripheral data size

//  DMA_MemoryInc Enabled                                 ((uint32_t)0x00000400)
  MINC_DMA1_S5CR_bit = 1;                                 // Bit 10 MINC: Memory increment mode

//  DMA_PeripheralInc Disabled                            ((uint32_t)0x00000000)
  PINC_DMA1_S5CR_bit = 0;                                 // Bit 9 PINC: Peripheral increment mode

//  DMA_Mode_Circular enabled                             ((uint32_t)0x00000100)
  CIRC_DMA1_S5CR_bit = 1;//CIRC_DMA1_S5CR_bit = 1;                                 // Bit 8 CIRC: Circular mode

//  DMA_DIR MemoryToPeripheral                            ((uint32_t)0x00000040)
  DIR1_DMA1_S5CR_bit=0;                                   // Bits 7 DIR[1:0]: Data transfer direction
  DIR0_DMA1_S5CR_bit=1;                                   // Bits 6 DIR[1:0]: Data transfer direction

  PFCTRL_DMA1_S5CR_bit = 0;                               // Peripheral Control: Bit 5
  TCIE_DMA1_S5CR_bit = 0;                                 // Transfer complete interrupt enable
  HTIE_DMA1_S5CR_bit = 0;                                 // Half transfer interrupt enbale
  TEIE_DMA1_S5CR_bit = 0;                                 // Transfer error interrupt enable
  DMEIE_DMA1_S5CR_bit = 0;                                // direct error interrupt enable
    
//  #define DMA_FIFOMode_Disable                          ((uint32_t)0x00000000)
  DMDIS_DMA1_S5FCR_bit = 0;                               // Bit 2 DMDIS: Direct mode disable

//  #define DMA_FIFOThreshold_HalfFull                    ((uint32_t)0x00000001)
  FTH1_DMA1_S5FCR_bit = 0;                                // Bit 1 FIFO threshold selection
  FTH0_DMA1_S5FCR_bit = 1;                                // Bit 0 FIFO threshold selection
}

void main() {
// Turn on the DAC and GPIO clocks before configuring the peripherals
  RCC_AHB1ENR.DMA1EN = 1;                                 // Enable DMA1 clock
  RCC_AHB1ENR.GPIOAEN = 1;                                // Enable GPIO A clock
  RCC_AHB1ENR.GPIOBEN = 1;                                // Enable GPIO D clock
  RCC_APB1ENR.DACEN = 1;                                  // Enable DAC clock
  RCC_APB1ENR.TIM6EN = 1;                                 // Enable TIM6 clock
  RCC_APB1ENR.PWREN = 1;                                  //
  SYSCFGEN_bit = 1;                                       //
  
  // Set GPIO_PORTD pins 12 through 15 as digital output
GPIO_Digital_Output(&GPIOB_ODR,_GPIO_PINMASK_3|_GPIO_PINMASK_4);
GPIO_Digital_Output(&GPIOG_ODR,_GPIO_PINMASK_15);
//  GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_0 | _GPIO_PINMASK_13);
//  GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_0 | _GPIO_PINMASK_14);
//  GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_0 | _GPIO_PINMASK_15);

  Timer6_Configure();                                     // Configure Timer 6
  DAC_Ch1_Config(void);                                   // Configure the DAC
  DMA1_Stream5_Ch7_Config(void);                          // Configure the DMA
  EN_DMA1_S5CR_bit = 1;                                   // Enable DMA  Stream 5
  EN1_bit = 1;                                            // Bit 0 EN1: DAC channel 1 enable
  EN2_bit = 1;                                            // Bit 16 EN2: DAC channel 2 enable
  TIM6_CR1.CEN = 1;                                       // Enable timer
  GPIOB_ODR.B4=1;                                        // Toggle Green on Port D13
  Delay_ms(100);
  
// START MAIN PROGRAM LOOP
  while(1){                                               // endless loop {
    GPIOB_ODR.B4=!GPIOB_ODR.B4;                         // Toggle LED2 (Yellow)on Port D13
    //if(GPIOB_ODR.B4==0) {                                // alternate tones
     // TIM6_ARR = 1157;                                    // transmit 1200 Hz tone
    //}
    //else {
    //  TIM6_ARR = 631;                                     // Transmit 2200 Hz Tone
    //}
    Delay_ms(500);                                        // Blink LED 12 at 1 Hz rate
  }
}
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

tekosis

Z hocama teşekkür ediyorum yardımı ile arkadaşlar sorun halloldu.
önceki kodda bulunan
const Sine12bit[181] = {
1927,1992,2056,2121,2185,2249,2312,2375,2437,2499,2559,2619,2678,2736,2793,2848,
2903,2956,3008,3059,3108,3155,3201,3245,3288,3329,3368,3405,3441,3474,3506,3535,
3563,3588,3611,3633,3652,3668,3683,3695,3706,3713,3719,3723,3724,3723,3719,3713,
3706,3695,3683,3668,3652,3633,3611,3588,3563,3535,3506,3474,3441,3405,3368,3329,
3288,3245,3201,3155,3108,3059,3008,2956,2903,2848,2793,2736,2678,2619,2559,2499,
2437,2375,2312,2249,2185,2121,2056,1992,1927,1862,1797,1732,1667,1603,1539,1475,
1411,1349,1286,1225,1164,1105,1046,988,931,875,821,767,716,665,616,568,523,478,
436,395,356,318,283,249,218,188,161,136,112,91,72,55,41,28,18,10,5,1,0,1,5,10,
18,28,41,55,72,91,112,136,161,188,218,249,283,318,356,395,436,478,523,568,616,
665,716,767,821,875,931,988,1046,1105,1164,1225,1286,1349,1411,1475,1539,1603,
1667,1732,1797,1862,1862};


kısmını iki katına çıkardım

const Sine12bit[362] = {
1927,1992,2056,2121,2185,2249,2312,2375,2437,2499,2559,2619,2678,2736,2793,2848,
2903,2956,3008,3059,3108,3155,3201,3245,3288,3329,3368,3405,3441,3474,3506,3535,
3563,3588,3611,3633,3652,3668,3683,3695,3706,3713,3719,3723,3724,3723,3719,3713,
3706,3695,3683,3668,3652,3633,3611,3588,3563,3535,3506,3474,3441,3405,3368,3329,
3288,3245,3201,3155,3108,3059,3008,2956,2903,2848,2793,2736,2678,2619,2559,2499,
2437,2375,2312,2249,2185,2121,2056,1992,1927,1862,1797,1732,1667,1603,1539,1475,
1411,1349,1286,1225,1164,1105,1046,988,931,875,821,767,716,665,616,568,523,478,
436,395,356,318,283,249,218,188,161,136,112,91,72,55,41,28,18,10,5,1,0,1,5,10,
18,28,41,55,72,91,112,136,161,188,218,249,283,318,356,395,436,478,523,568,616,
665,716,767,821,875,931,988,1046,1105,1164,1225,1286,1349,1411,1475,1539,1603,
1667,1732,1797,1862,1862,
1927,1992,2056,2121,2185,2249,2312,2375,2437,2499,2559,2619,2678,2736,2793,2848,
2903,2956,3008,3059,3108,3155,3201,3245,3288,3329,3368,3405,3441,3474,3506,3535,
3563,3588,3611,3633,3652,3668,3683,3695,3706,3713,3719,3723,3724,3723,3719,3713,
3706,3695,3683,3668,3652,3633,3611,3588,3563,3535,3506,3474,3441,3405,3368,3329,
3288,3245,3201,3155,3108,3059,3008,2956,2903,2848,2793,2736,2678,2619,2559,2499,
2437,2375,2312,2249,2185,2121,2056,1992,1927,1862,1797,1732,1667,1603,1539,1475,
1411,1349,1286,1225,1164,1105,1046,988,931,875,821,767,716,665,616,568,523,478,
436,395,356,318,283,249,218,188,161,136,112,91,72,55,41,28,18,10,5,1,0,1,5,10,
18,28,41,55,72,91,112,136,161,188,218,249,283,318,356,395,436,478,523,568,616,
665,716,767,821,875,931,988,1046,1105,1164,1225,1286,1349,1411,1475,1539,1603,
1667,1732,1797,1862,1862};[/code]

şeklinde değiştirdim. programda sadece bu değişiklik yapılarak cihaz çalıştı. 
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

z

Ama dedigim gibi sorunu cozmedik. Sadece bu ihtimali dusunup hatayi bulma adina deney yaptik.

Simdi DMA neden iki kati uzunlukta veri tasimaya zorlaniyor onu arastirmak lazim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

tekosis

doğru yaklaşım hocam. inşallah sorunu tam olarak çözersem paylaşacağım.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

tekosis

hocam osilaskoptan bakınca sinyalde olması gereken örnek sayısının yarısını görüyorum. yani 64 örnek noktası varsa sinyal 32 örnek noktasından oluşuyor. bu da bana dma tablodan verileri 1-3-5-7 şeklinde çekiyormuş gibi geldi.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

z

#250
DMA, Tablodan integer (32 bit) deger cekip, hedefe aktarirken short (16 bit) deger yaziliyor olabilirmi? Bu durumda 2 tane 16 bit okunur, ust 16 cope gider alt 16 da hedefe yazilir.

Sanki target ve destination icin veri uzunluklarinin tanimlarinin yapildigi registerlar vardi diye hatirliyorum. Dokumani bir kurcala istersen.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

//  #define DMA_PeripheralDataSize_HalfWord               ((uint32_t)0x00000800)
  PSIZE1_DMA1_S5CR_bit=1;                                 // Bit 12 Peripheral data size
  PSIZE0_DMA1_S5CR_bit=0;                                 // Bit 11 Peripheral data size

Senin ilk (eski) programin yukaridaki gibi

Bu satirlari bulup asagidaki gibi degistirmeyi denermisin?

//  #define DMA_PeripheralDataSize_HalfWord               ((uint32_t)0x00000800)
 
  PSIZE1_DMA1_S5CR_bit=0;                                 // Bit 12 Peripheral data size
  PSIZE0_DMA1_S5CR_bit=1;                                 // Bit 11 Peripheral data size


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mistek

Alıntı yapılan: Mucit23 - 08 Mart 2014, 14:18:43
Hocam I2C dede benim başıma Geldi. GPIO AF modundan çıkırınca rastgele sinyal çıkıyor. Yani konumu lojik 1 de ise anlık olarak lojik 0'a inip tekrar lojik 1 çıkıyor gibi.

Gerçekte Timeri Durdurup Ardından çıkışı lojik 0 a çekmek işe yarıyordu sanırım.

Timer'ı durdurmadan yaptığımda sinyal kaçıyor Timer diğer işler için lazım olduğundan bende PWM output pinini enable/disable yaptım. Sonra pini normal moda alıp istediğim kontrolü yapıyorum.

boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Klein

Alıntı Yap
const Sine12bit[181] = {.......


Veri tipi bildirilmemiş.  derleyici bunu 32 bit olarak yerletirecek muhtemelen.
16 bit veri transferi yaptığın için dalga şeklinde bozulma olur. Ama beklediğim bozulma osilaskopta gördüğümüz gibi değil. 

tekosis

#254
sayın z ve klein hocam, yardımlarınız için teşekkür ederim. elimde şu an osilaskop yok ama sinüs sinyalin bir periyodunu 5 saniyeye gelecek şekilde ayarladım ve sinyali 0-3V aralığında çıkarttım. z hocamın dediği ayarları yapınca 0-3V aralığında 5 saniyeye yayılan düzenli  bir sinyali ölçü aleti ile gözlemleyebildim. ama dediğim gibi şimdilik sadece avometre ile ölçüm yaptım. ama daha önce hatalı programda avometre ile ölçümde resimde gösterdiğim dalgalanmaları gözlemleyebilmiştim şimdi olmadı. bu arada tanımladığım yapıda 180 değişken var ve programda da DMA'ya tanımlı aynı şekilde 180 değişken mevcut. aşağıda çalışan kodu paylaşıyorum. Saygılarımla...
#include "dac_objects.h"
//denemenin yapıldığı cihaz mikromedia plus for stm32
//KULLANILAN PROGRAM mikroc pro for arm
// kristal ayarı 150MHz
// timer 6 kesme  27.7 msn ayarlandı bu sayede 180 örnek noktası ile oluşturulan bir peryodun süresi de 180 x 27.7msn den 5 saniye oldu

// DAC1 outputs on PA4   - you will need an oscilloscope to see the output waveform
// DAC2 outputs on PA5   - not used here
// DAC1 requires access to DMA1 Stream 5, Channel 7
// DAC_DHR8R1bits absolute 0x40007410;
// DAC_DHR8R2bits absolute 0x4000741C;
// DAC_DHR12R1bits absolute 0x40007408;                   // PA4
// DAC_DHR12R2bits absolute 0x40007414;                   // PA5
// DAC_DHR12L1bits absolute 0x4000740C;
// DAC_DHR12L2bits absolute 0x40007418;

unsigned int *pointer;
unsigned short int x;

// sine wave look up table
const Sine12bit[180] = {1881,1945,2008,2071,2133,2196,2258,2319,2379,2439,2499,
2557,2615,2671,2727,2781,2834,2886,2937,2986,3034,3080,3125,3169,3210,3250,3288,
3325,3359,3392,3423,3452,3478,3503,3526,3547,3565,3582,3596,3608,3618,3626,3631,
3634,3636,3634,3631,3626,3618,3608,3596,3582,3565,3547,3526,3503,3478,3452,3423,
3392,3359,3325,3288,3250,3210,3169,3125,3080,3034,2986,2937,2886,2834,2781,2727,
2671,2615,2557,2499,2439,2379,2319,2258,2196,2133,2071,2008,1945,1881,1818,1754,
1691,1628,1565,1502,1440,1378,1317,1256,1196,1137,1078,1021,964,909,854,801,749,
699,649,601,555,510,467,425,385,347,311,276,244,213,184,157,132,110,89,70,54,40,
28,18,10,4,1,0,1,4,10,18,28,40,54,70,89,110,132,157,184,213,244,276,311,347,385,
425,467,510,555,601,649,699,749,801,854,909,964,1021,1078,1137,1196,1256,1317,
1378,1440,1502,1565,1628,1691,1754,1818};

// *****************************************************************************
//    Timer 6 Configure Subroutine
// *****************************************************************************
void Timer6_Configure(void) {

  CEN_TIM6_CR1_bit = 0;                                   // Disable timer before configuring it

/* Time base configuration */
// Bits 15:8 Reserved, must be kept at reset value
// Bits 6:4 Reserved, must be kept at reset value
// Bit 2 URS: Update request source 1: Only counter overflow/underflow generates an update interrupt or DMA request if enabled.
  ARPE_TIM6_CR1_bit = 1;                                  // Bit 7 ARPE: Auto-reload preload enable = 1
  OPM_TIM6_CR1_bit = 0;                                   // One-pulse mode -0: Counter is not stopped at update event
  URS_TIM6_CR1_bit = 0;
  UDIS_TIM6_CR1_bit = 0;                                  // Bit 1 UDIS: Update disable

// TIM6_CR2bits
// Bits 15:7 Reserved, must be kept at reset value
// Bits 6:4 MMS: Master mode selection
  MMS2_TIM6_CR2_bit = 0;                                  // Bits 6:4MMS: Master mode selection
  MMS1_TIM6_CR2_bit = 1;                                  // Update - The update event is selected as a trigger output (TRGO).
  MMS0_TIM6_CR2_bit = 0;                                  // For instance a master timer can then be used as a prescaler for a slave timer
// Bits 3:0 Reserved, must be kept at reset value

//TIM6 DIER bits
// Bit 15:9 Reserved, must be kept at reset value
// Bit 7:1 Reserved, must be kept at reset value
// Bits 3:0 Reserved, must be kept at reset value
  TIM6_DIER.UDE = 0;                                      // Bit 8 UDE: Update DMA request enable
  TIM6_DIER.UIE = 0;                                      // Bit 0 UIE: Update interrupt enable

// Auto-Reload Register (TIMx_ARR)
// Auto load register  65522 (32 bit register) count down to zero
//  TIM6_ARR = 631;                                       //
  TIM6_ARR = 61274;                                        //
  TIM6_PSC = 67;                                           // Set timer prescaler
}

// *****************************************************************************
//    DAC Channel 1 Configure Subroutine
// *****************************************************************************

void DAC_Ch1_Config(void) {
  EN2_bit = 0;
  EN1_bit = 0;
//                                                        // Bits 31:30 Reserved must be kept at default value
  DMAUDRIE2_bit = 0;                                      // Bits 29 DMAUDRIE2  DAC channel2 DMA underrun interrupt enable
  DMAEN2_bit = 1;                                         // Bit 28 DMAEN2  DAC channel2 DMA enable
  MAMP23_bit = 0;                                         // Bit 27 MAMP2 3 DAC channel2 mask/amplitude selector
  MAMP22_bit = 0;                                         // Bit 26 MAMP2 2 DAC channel2 mask/amplitude selector
  MAMP21_bit = 0;                                         // Bit 25 MAMP2 1 DAC channel2 mask/amplitude selector
  MAMP20_bit = 0;                                         // Bit 24 MAMP2 0 DAC channel2 mask/amplitude selector
  WAVE21_bit = 0;                                         // Bit 23 WAVE2 1 DAC channel2 noise/triangle wave generation enable
  WAVE20_bit = 0;                                         // Bit 22 WAVE2 0 DAC channel2 noise/triangle wave generation enable
  TSEL22_bit = 0;                                         // Bit 21 TSEL2 2 DAC channel1 trigger selection
  TSEL21_bit = 0;                                         // Bit 20 TSEL2 1 DAC channel1 trigger selection
  TSEL20_bit = 0;                                         // Bit 19 TSEL2 0 DAC channel1 trigger selection
  TEN2_bit = 1;                                           // Bit 18 TEN2: DAC channel 2 trigger enable
  BOFF2_bit = 0;                                          // Bit 17 BOFF2: DAC channel 2 output buffer disable
//                                                        // Bits 15:14 Reserved must be kept at default value
  DMAUDRIE1_bit = 0;                                      // Bit 13 DMAUDRIE1 DAC channel 1 DMA Underrun Interrupt enable
  DMAEN1_bit = 1;                                         // Bit 12 DMAEN1  DAC channel 1 DMA enable  - DMA Mode Enabled
  MAMP13_bit = 0;                                         // Bit 11 MAMP1 3 - DAC channel 1 mask/amplitude selector
  MAMP12_bit = 0;                                         // Bit 10 MAMP1 2 - DAC channel 1 mask/amplitude selector
  MAMP11_bit = 0;                                         // Bit 9 MAMP1 1 - DAC channel 1 mask/amplitude selector
  MAMP10_bit = 0;                                         // Bit 8 MAMP1 0 - DAC channel 1 mask/amplitude selector
  WAVE11_bit = 0;                                         // Bit 7 WAVE1 1 DAC channel 1 noise/triangle wave generation enable
  WAVE10_bit = 0;                                         // Bit 6 WAVE1 0 DAC channel 1 noise/triangle wave generation enable
  TSEL12_bit = 0;                                         // Bit 5 TSEL bit 2 - DAC channel 1 trigger selection -  TIMR6 Output Event
  TSEL11_bit = 0;                                         // Bit 4 TSEL bit 1 - Note: Only used if bit TEN1 = 1 (DAC channel1 trigger enabled)
  TSEL10_bit = 0;                                         // Bit 3 TSEL bit 0
  TEN1_bit = 1;                                           // Bit 2 TEN 1: DAC channel 1 trigger enable
  BOFF1_bit = 0;                                          // Bit 1 BOFF 1: DAC channel 1 output buffer disable - 0 = Enabled
}

/* ************************************************************************* */
/* DMA1_Stream 5 channel 7 configuration                                     */
/* ************************************************************************* */
void DMA1_Stream5_Ch7_Config(void) {

//  DMA_Cmd(DMA1_Stream5, DISABLE);
  EN_DMA1_S5CR_bit = 0;                                   // disable audio stream
  while (EN_DMA1_S5CR_bit==1) {                           // wait for audio stream to be disabled
  }                                                       // before changing DMA settings
// All Stream5 Status dedicated registers to be cleared
  CTCIF5_DMA1_HIFCR_bit = 1;                              // Channel 5 transfer complete clear
  CHTIF5_DMA1_HIFCR_bit = 1;                              // Channel 5 half transfer clear
  CTEIF5_DMA1_HIFCR_bit = 1;                              // Channel 5 transfer error clear
  CDMEIF5_DMA1_HIFCR_bit = 1;
  CFEIF5_DMA1_HIFCR_bit = 1;
//  DMA1_LIFCR = 0x00000F40;                              // clear DMA IRQ flags

//  DMA_InitStructure.DMA_PeripheralBaseAddr              (uint32_t)DAC_DHR12R2_ADDRESS;
//  DMA1_S5PAR = &DAC_DHR12R2;                            //DAC_DHR12R2_ADDRESS = 0x40007414  - PA5
  DMA1_S5PAR = &DAC_DHR12R1;                              //DAC_DHR12R2_ADDRESS = 0x40007408  - PA4

//  DMA_InitStructure.DMA_Memory0BaseAddr                 (uint32_t)&Sine12bit;
//  M0AR is the address register used for circular mode
  DMA1_S5M0AR = &Sine12bit;                               // Bit 31: Memory 0 address

//  DMA_InitStructure.DMA_BufferSize = 64;
  DMA1_S5NDTR = 180;

//  DMA_InitStructure.DMA_Channel = DMA_Channel_7;
//  #define DMA_Channel_7                                 ((uint32_t)0x0E000000)
  CHSEL2_DMA1_S5CR_bit=1;                                 // Bit 27 Channel selection
  CHSEL1_DMA1_S5CR_bit=1;                                 // Bit 26 Channel selection
  CHSEL0_DMA1_S5CR_bit=1;                                 // Bit 27 Channel selection

//  DMA_MemoryBurst Single                                ((uint32_t)0x00000000)0
  MBURST1_DMA1_S5CR_bit=0;                                // Bit 24 Memory burst transfer configuration
  MBURST0_DMA1_S5CR_bit=0;                                // Bit 23 Memory burst transfer configuration

//  DMA_PeripheralBurst Single                            ((uint32_t)0x00000000)
  PBURST1_DMA1_S5CR_bit=0;                                // Bit 22 Peripheral burst transfer configuration
  PBURST0_DMA1_S5CR_bit=0;                                // Bit 21 Peripheral burst transfer configuration

// ACK
  ACK_DMA1_S5CR_bit = 0;                                  // DMA1_S5CR.B20;

// CT
  CT_DMA1_S5CR_bit = 0;                                   // Bit 19  DMA1_S5CR.B19;

// DBM
  DBM_DMA1_S5CR_bit = 0;                                  // Bit 18  DMA1_S5CR.B18;

//  #define DMA_Priority_High                             ((uint32_t)0x00020000)
  PL1_DMA1_S5CR_bit=1;                                    // Bit 17  Priority level (HIGH)
  PL0_DMA1_S5CR_bit=0;                                    // Bit 16  Priority level (HIGH)

//  PINCOS
  PINCOS_DMA1_S5CR_bit = 0;                               //

//  #define DMA_MemoryDataSize_HalfWord                   ((uint32_t)0x00002000)
  MSIZE1_DMA1_S5CR_bit=0;                                 // Bits 14 = 0 Memory data size
  MSIZE0_DMA1_S5CR_bit=1;                                 // Bits 13 = 1 Memory data size

//  #define DMA_PeripheralDataSize_HalfWord               ((uint32_t)0x00000800)
  PSIZE1_DMA1_S5CR_bit=0;                                 // Bit 12 Peripheral data size
  PSIZE0_DMA1_S5CR_bit=1;                                 // Bit 11 Peripheral data size

//  DMA_MemoryInc Enabled                                 ((uint32_t)0x00000400)
  MINC_DMA1_S5CR_bit = 1;                                 // Bit 10 MINC: Memory increment mode

//  DMA_PeripheralInc Disabled                            ((uint32_t)0x00000000)
  PINC_DMA1_S5CR_bit = 0;                                 // Bit 9 PINC: Peripheral increment mode

//  DMA_Mode_Circular enabled                             ((uint32_t)0x00000100)
  CIRC_DMA1_S5CR_bit = 1;                                 // Bit 8 CIRC: Circular mode

//  DMA_DIR MemoryToPeripheral                            ((uint32_t)0x00000040)
  DIR1_DMA1_S5CR_bit=0;                                   // Bits 7 DIR[1:0]: Data transfer direction
  DIR0_DMA1_S5CR_bit=1;                                   // Bits 6 DIR[1:0]: Data transfer direction

  PFCTRL_DMA1_S5CR_bit = 0;                               // Peripheral Control: Bit 5
  TCIE_DMA1_S5CR_bit = 0;                                 // Transfer complete interrupt enable
  HTIE_DMA1_S5CR_bit = 0;                                 // Half transfer interrupt enbale
  TEIE_DMA1_S5CR_bit = 0;                                 // Transfer error interrupt enable
  DMEIE_DMA1_S5CR_bit = 0;                                // direct error interrupt enable

//  #define DMA_FIFOMode_Disable                          ((uint32_t)0x00000000)
  DMDIS_DMA1_S5FCR_bit = 0;                               // Bit 2 DMDIS: Direct mode disable

//  #define DMA_FIFOThreshold_HalfFull                    ((uint32_t)0x00000001)
  FTH1_DMA1_S5FCR_bit = 0;                                // Bit 1 FIFO threshold selection
  FTH0_DMA1_S5FCR_bit = 1;                                // Bit 0 FIFO threshold selection
}

void main() {
     start_TP();
// Turn on the DAC and GPIO clocks before configuring the peripherals
  RCC_AHB1ENR.DMA1EN = 1;                                 // Enable DMA1 clock
  RCC_AHB1ENR.GPIOAEN = 1;                                // Enable GPIO A clock
  RCC_AHB1ENR.GPIODEN = 1;                                // Enable GPIO D clock
  RCC_APB1ENR.DACEN = 1;                                  // Enable DAC clock
  RCC_APB1ENR.TIM6EN = 1;                                 // Enable TIM6 clock
  RCC_APB1ENR.PWREN = 1;                                  //
  SYSCFGEN_bit = 1;                                       //

  Timer6_Configure();                                     // Configure Timer 6
  DAC_Ch1_Config(void);                                   // Configure the DAC
  DMA1_Stream5_Ch7_Config(void);                          // Configure the DMA
  EN_DMA1_S5CR_bit = 1;                                   // Enable DMA  Stream 5
  EN1_bit = 1;                                            // Bit 0 EN1: DAC channel 1 enable
  EN2_bit = 1;                                            // Bit 16 EN2: DAC channel 2 enable
  TIM6_CR1.CEN = 1;                                       // Enable timer

  Delay_ms(1000);

// START MAIN PROGRAM LOOP
  while(1)
  {                                               // endless loop / Blink LED 12 at 1 Hz rate
  }
}


mesaj birleştirme:: 11 Mart 2014, 21:25:38

bu da lazım olursa diye kullanılan h dosyası
typedef struct Screen TScreen;

typedef struct {
  unsigned int X_Min;
  unsigned int X_Max;
  unsigned int Y_Min;
  unsigned int Y_Max;
  char         Rotate;
} TTPConstants;

struct Screen {
  unsigned int           Color;
  unsigned int           Width;
  unsigned int           Height;
  unsigned int           ObjectsCount;
};

extern   TScreen                Screen1;


/////////////////////////
// Events Code Declarations
/////////////////////////

/////////////////////////////////
// Caption variables Declarations
/////////////////////////////////

void DrawScreen(TScreen *aScreen);
void Check_TP();
void Start_TP();
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.