Mucit23
Üye
- Katılım
- 7 Ekim 2022
- Mesajlar
- 53
Selamlar.
STM32F103VET6'da DMA ile paralel veri aktarımı üzerine çalışıyorum. Amacım Clock eşliğinde 8 bit paralel data çıkışı sağlamak. Yüksek frekanslı paralel data çıkışına ihtiyacım var. Bunu arka planda otomatik olarak yapmak istediğim için DMA ile nasıl yaparım arayışına girdim.
ST'nin X-ParaCom şeklinde bir firmware örneği var o örnekten yola çıkarak bir şeyler yapmaya çalışıyorum.
Temel mantık şu. Paralel veriyi bir clock sinyali eşliğinde gönderiyoruz. Clock üretmek için bir timer ile PWM üretiyorsun. PWM çıkış sinyalin senin clock sinyali oluyor. Daha sonra TIM CC1 tetik kaynağını DMA1 kanal 5'i tetikleyecek şekilde ayarlıyoruz. TIM2 CH1, DMA1 Kanal 5 ile çalışıyor. Tim2'de her PWM puls darbesinde DMA tetikleniyor ve Veri aktarımını yapıyor. DMA Transfer Complete kesmesinde timeri durduruyoruz ve puls üretimi sonlanıyor..
Bu dediklerim çalışıyor gibi fakat veri aktarımı sağlanmıyor. Çıkamadım işin içinden.
Ayarlarım bu şekilde
Ayarlarım bu şekilde. Bu arada transfer tamamlandığında DMA Transfer Completed kesmesi oluşuyor. Clock sinyali uygun olmasına rağmen data aktarımı hiç sağlanmıyor. Referans manual içinde kayboldum.
Acaba mimaride mi sıkıntı var. Referans manual'de APB2 üzerinden GPIOE'ye yazma yapılabildiğini göstermiş.
Bunu F1 serisi desteklemiyor mu anlamadım. ST vermiş olduğu örnekte STM32L476 ile yapmış. Ben F1 de yapmaya çalışıyorum. DMA ile GPIOE'nin (Yada başka bir GPIO) ODR sine nasıl veri yazarım? Şuan için tetik kaynağı önemli değil. DMA ile doğrudan GPIO'ya veri aktarmak mümkün mü?
STM32F103VET6'da DMA ile paralel veri aktarımı üzerine çalışıyorum. Amacım Clock eşliğinde 8 bit paralel data çıkışı sağlamak. Yüksek frekanslı paralel data çıkışına ihtiyacım var. Bunu arka planda otomatik olarak yapmak istediğim için DMA ile nasıl yaparım arayışına girdim.
ST'nin X-ParaCom şeklinde bir firmware örneği var o örnekten yola çıkarak bir şeyler yapmaya çalışıyorum.
Temel mantık şu. Paralel veriyi bir clock sinyali eşliğinde gönderiyoruz. Clock üretmek için bir timer ile PWM üretiyorsun. PWM çıkış sinyalin senin clock sinyali oluyor. Daha sonra TIM CC1 tetik kaynağını DMA1 kanal 5'i tetikleyecek şekilde ayarlıyoruz. TIM2 CH1, DMA1 Kanal 5 ile çalışıyor. Tim2'de her PWM puls darbesinde DMA tetikleniyor ve Veri aktarımını yapıyor. DMA Transfer Complete kesmesinde timeri durduruyoruz ve puls üretimi sonlanıyor..
Bu dediklerim çalışıyor gibi fakat veri aktarımı sağlanmıyor. Çıkamadım işin içinden.
Ayarlarım bu şekilde
Kod:
/* USER CODE BEGIN 4 */
void HAL_TIM_DMA_Init(void)
{
TIM_OC_InitTypeDef sConfigOC = {0};
GPIO_InitTypeDef GPIO_InitStruct;
static DMA_HandleTypeDef hdma_tim;
__HAL_RCC_TIM2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
htim2.Instance = TIM2;
htim2.Init.Prescaler = 72-1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000-1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if(HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
/**TIM2 GPIO Configuration
PA0-WKUP ------> TIM2_CH1 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* TIM2 DMA Init */
/* TIM2_CH1 Init */
hdma_tim2_ch1.Instance = DMA1_Channel5;
hdma_tim2_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_tim2_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tim2_ch1.Init.MemInc = DMA_MINC_ENABLE;
hdma_tim2_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_tim2_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_tim2_ch1.Init.Mode = DMA_NORMAL;
hdma_tim2_ch1.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_tim2_ch1) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&htim2,hdma[TIM_DMA_ID_CC1],hdma_tim2_ch1);
htim2.hdma[TIM_DMA_ID_CC1]->XferCpltCallback = DMA_Transfer_Complete;
htim2.hdma[TIM_DMA_ID_CC1]->XferErrorCallback = DMA_Transfer_Error;
if (HAL_DMA_Start_IT(htim2.hdma[TIM_DMA_ID_CC1], (uint32_t)&buffer, (uint32_t)&GPIOE->ODR, 100) != HAL_OK)
{
/* Transfer Error */
Error_Handler();
}
__HAL_DMA_DISABLE_IT(htim2.hdma[TIM_DMA_ID_CC1], DMA_IT_HT);
__HAL_TIM_ENABLE_DMA(&htim2, TIM_DMA_CC1);
/* Configure the NVIC for DMA */
/* NVIC configuration for DMA transfer complete interrupt */
HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
}
Ayarlarım bu şekilde. Bu arada transfer tamamlandığında DMA Transfer Completed kesmesi oluşuyor. Clock sinyali uygun olmasına rağmen data aktarımı hiç sağlanmıyor. Referans manual içinde kayboldum.
Acaba mimaride mi sıkıntı var. Referans manual'de APB2 üzerinden GPIOE'ye yazma yapılabildiğini göstermiş.
Bunu F1 serisi desteklemiyor mu anlamadım. ST vermiş olduğu örnekte STM32L476 ile yapmış. Ben F1 de yapmaya çalışıyorum. DMA ile GPIOE'nin (Yada başka bir GPIO) ODR sine nasıl veri yazarım? Şuan için tetik kaynağı önemli değil. DMA ile doğrudan GPIO'ya veri aktarmak mümkün mü?
Son düzenleme: