STM32F030F4 ADC&DMA

Başlatan papsukkal, 02 Nisan 2024, 14:24:13

papsukkal

Yeniden hayata dönen işlemcim ile çalışmalara devam ediyorum. İlk etapta DMA ile PWM ve ADC çalışmaları yapmak istiyorum. Sonra USART ile çalışmalar yapacağım.

DMA + PWM oluşturdum. Az çok sistem yapısını anladım.

DMA + ADC kodlarını işlemciye yüklediğimde işlemci blokeleniyor.

In0 ve In1 iki kanal girişler.
DMA ayarında DMA1 Channel1, mode =circular, memory data witdh = word seçili.

PA4 te led var yanıp sönüyor.

HAL_ADC_Start_DMA(&hadc,ADC_deger , 2);

Adcyi başlattığım kodu yüklediğimde yükleme biter bitmez islemci kilitleniyor.

Could not halt device (19)
Target is not responding, retrying...
Target is not responding, retrying...
Shutting down...
Failed to read register cache
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...

STM32F103 işlemcisinde çalışan yöntem bu işlemcide neden çalımaz? 32f030 un ADC ve DMA ile ilgili özel bir durumu mu var?
edit: dahili kristal ile denmeler yapıyorum

Tagli

İlk aklıma gelen şey fault olup olmadığına bakmak olurdu. Debug'da çalıştırırken STM32CubeIDE fault olup olmadığını söylüyor. Fault penceresi varsayılan durumda kapalı olabilir belki. Pencere menülerinde bir yerden aılıyor. Fitilli yuvarlak bomba şeklinde bir ikonu var, hemen göze çarpıyor. Debug sırasında kod bir yerde takılıp kalıyorsa onu da görürsün.
Gökçe Tağlıoğlu

papsukkal

#2
Debug yapıyorum hocam. F8 e bastığım anda olay kopuyor. Fault penceresi de boş çıktı.

Target is not responding, retrying...

Öyle tahmin ediyorum ki ben kurtarmaya çalışırken işlemci kısmi olarak arızalandı. ADC nin her türlüsünde yani ADC_Start deyince kilitleniyor.

.......

Şimdi denediğim kod bu

ADC başlatmadan önce led yaktım söndürdüm. ledin 3. yanmasında kilitlenme bekledim, olmadı. Ama ledin ışıması düzenli değil. 2 defa 1 sn ışıyor, sonra daha uzun ışıyor. İkinci turdan itibaren bir kısa bir uzun ışıyor.
ADC_Start tan sonraki toggle komutlarını ekledim ama işlemci bu satırlara hiç ulaşamıyor

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(1000);
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(1000);
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(1000);
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(1000);
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(1000);
	  
	  HAL_ADC_Start(&hadc);
	  HAL_ADC_PollForConversion(&hadc, 100);
	  ADC_deger = HAL_ADC_GetValue(&hadc);
	  
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(200);
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(200);
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(120);
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(200);
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(200);
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  HAL_Delay(200);
  }

ADC_Start satırına kadar çalışıyor sürekli ve orada resetlenyor gibi. Zira analog değer de okuyamıyorum, 200 ms lik ledleri de göremiyorum.

Fault penceresi no fault diyor.

Tagli

Daha önceki mesajlarında VDDA ile ilgili bir sorun yaşadığından bahsetmiştin. Sanırım bağlamayı unutmuştun. VDDA hem ADC gibi analog bileşenleri, hem de PLL'yi besler. Belki o denemelerin sorasında VDDA domain'inde bir hasar oluşumuştur. Mevcut konfigürasyonda PLL aktif mi? Değilse aktifleştirmeyi dene. Eğer bu durumda ADC'siz LED blink bile çalışmazsa VDDA arızası sonucuna büyük oranda varabiliriz sanırım.
Gökçe Tağlıoğlu

papsukkal

#4
İşlemciyi yenisi ile değiştirdim. Çalıştı. Sırada DMA ADC var. Sanırım çalışır. 

Bozmuşum eski işlemciyi.