Stm32 de Dma+I2c

erdemtr55

Aktif Üye
Katılım
3 Mart 2025
Mesajlar
167
Selamın aleyküm,
Şu aralar dma uğraşıyorum. Dma ile, ı2c ile lcd ekrana yazı yazmak istiyorum .Chat gpt bana şöyle bir kod verdi. Denedim olmadı.
Size soruyum dedim.

#include "stm32f4xx_hal.h"
#include "lcd_i2c.h" // LCD kütüphaneniz (PCF8574 için)

I2C_HandleTypeDef hi2c1;
DMA_HandleTypeDef hdma_i2c1_tx;

char lcdMessage[] = "Merhaba STM32!";

volatile uint8_t dma_tx_complete = 0; // Flag: DMA transfer tamamlandı

/* Fonksiyon prototipleri */
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_DMA_Init(void);
void MX_I2C1_Init(void);

int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_I2C1_Init();

LCD_Init(&hi2c1); // LCD başlat

// DMA ile LCD'ye veri gönder
dma_tx_complete = 0;
HAL_I2C_Master_Transmit_DMA(&hi2c1, LCD_I2C_ADDR, (uint8_t*)lcdMessage, sizeof(lcdMessage)-1);

while(1)
{
if(dma_tx_complete)
{
// DMA transfer tamamlandı
dma_tx_complete = 0;

// İstersen bir sonraki mesajı buradan gönderebilirsin
HAL_Delay(1000);
HAL_I2C_Master_Transmit_DMA(&hi2c1, LCD_I2C_ADDR, (uint8_t*)lcdMessage, sizeof(lcdMessage)-1);
}
}
}

/* DMA TX tamamlandığında HAL callback */
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
{
dma_tx_complete = 1;
}

/* DMA init fonksiyonu */
void MX_DMA_Init(void)
{
__HAL_RCC_DMA1_CLK_ENABLE();

/* NVIC interrupt ayarı (I2C1 TX için DMA1 Stream6) */
HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
}

/* I2C1 init fonksiyonu */
void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1);

/* DMA handle init */
hdma_i2c1_tx.Instance = DMA1_Stream6;
hdma_i2c1_tx.Init.Channel = DMA_CHANNEL_1;
hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_i2c1_tx.Init.Mode = DMA_NORMAL;
hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_i2c1_tx);

__HAL_LINKDMA(&hi2c1, hdmatx, hdma_i2c1_tx);
}

/* DMA1 Stream6 interrupt handler */
void DMA1_Stream6_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_i2c1_tx);
}
 
Üstadım formun kod formatlama özelliğini kullanırsanız, aşağıdaki gibi paylaşılan kodları okumak daha kolay olur.

Orjinal kodunuzda INDENT ler olsaydı çok daha anlaşılır olacaktı.

C:
#include "stm32f4xx_hal.h"
#include "lcd_i2c.h" // LCD kütüphaneniz (PCF8574 için)

I2C_HandleTypeDef hi2c1;
DMA_HandleTypeDef hdma_i2c1_tx;

char lcdMessage[] = "Merhaba STM32!";

volatile uint8_t dma_tx_complete = 0; // Flag: DMA transfer tamamlandı

/* Fonksiyon prototipleri */
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_DMA_Init(void);
void MX_I2C1_Init(void);

int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_I2C1_Init();

LCD_Init(&hi2c1); // LCD başlat

// DMA ile LCD'ye veri gönder
dma_tx_complete = 0;
HAL_I2C_Master_Transmit_DMA(&hi2c1, LCD_I2C_ADDR, (uint8_t*)lcdMessage, sizeof(lcdMessage)-1);

while(1)
{
if(dma_tx_complete)
{
// DMA transfer tamamlandı
dma_tx_complete = 0;

// İstersen bir sonraki mesajı buradan gönderebilirsin
HAL_Delay(1000);
HAL_I2C_Master_Transmit_DMA(&hi2c1, LCD_I2C_ADDR, (uint8_t*)lcdMessage, sizeof(lcdMessage)-1);
}
}
}

/* DMA TX tamamlandığında HAL callback */
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
{
dma_tx_complete = 1;
}

/* DMA init fonksiyonu */
void MX_DMA_Init(void)
{
__HAL_RCC_DMA1_CLK_ENABLE();

/* NVIC interrupt ayarı (I2C1 TX için DMA1 Stream6) */
HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
}

/* I2C1 init fonksiyonu */
void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1);

/* DMA handle init */
hdma_i2c1_tx.Instance = DMA1_Stream6;
hdma_i2c1_tx.Init.Channel = DMA_CHANNEL_1;
hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_i2c1_tx.Init.Mode = DMA_NORMAL;
hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_i2c1_tx);

__HAL_LINKDMA(&hi2c1, hdmatx, hdma_i2c1_tx);
}

/* DMA1 Stream6 interrupt handler */
void DMA1_Stream6_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_i2c1_tx);
}
 
Şu iş için gpt ye ne gerek var? İnternette bir sürü tutorial var, video var, st nin kendi formunda çıkan hatalar ve çözümleri var. Gpt ye sormuşsunuz olmamış, şimdi bize soruyorsun. Sorup birilerinden çalışaj kod/sistem alma çabası bizi bir yere götürmez. Durumun bile belirsiz normal i2c iletişimini sağlayabildin mi?
 

Çevrimiçi personel

Forum istatistikleri

Konular
8,224
Mesajlar
135,049
Üyeler
3,269
Son üye
hasandeniz1199

Son kaynaklar

Son profil mesajları

erdemtr55 taydin erdemtr55 wrote on taydin's profile.
Merhaba Taydin bey,
Gruba spms serisi yapıcak mısınız?
ben 3 sargılı toroid ile 2 adet flyback sürücek bir devre yapmayı düşünüyorum.size soracak sorularım vardı?
Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Back
Top