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);
}
Ş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);
}