Stm32 de Dma+I2c

erdemtr55

Aktif Üye
Katılım
3 Mart 2025
Mesajlar
186
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?
 

Forum istatistikleri

Konular
8,376
Mesajlar
137,562
Üyeler
3,319
Son üye
bsahin26

Son kaynaklar

Son profil mesajları

mechanic ayhanarican mechanic wrote on ayhanarican's profile.
https://www.allmystery.de almanca biliyorsan burada araştır. Yapay zekada çeviriyor gerçi.
Almanların matematik bilgisi daha iyi oluyor.
“Kendi yolunu çizen kişi, kimsenin izinden gitmez.” – Nietzsche
Kim İslâm’da güzel bir çığır açarsa (güzel bir alışkanlık başlatırsa), onun sevabı ve kendisinden sonra ona uyanların sevapları, onların sevaplarından hiçbir şey eksilmeksizin ona da yazılır.
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
Back
Top