Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: tekosis - 22 Kasım 2018, 11:47:15

Başlık: ADC devreye girince dma+usart hatalı veri yolluyor.
Gönderen: tekosis - 22 Kasım 2018, 11:47:15
Kolay gelsin.

Aşağıda verdiğim kodda while döngüsünün içindeki adc okuma kısmını iptal edip bir delay koyduğum zaman fonksiyondaki dma kodu ile usart üzerinden veri yolladığımda problem yok. Ancak adc okuma satırlarını aktifleştirince bazen giden verinin sonuna <00>™ kodları ekleniyor, bunlara bir anlam veremedim. 9600 baudda da aynı hataları alıyorum. Bu hatanın sebebini bulamadım neden olabilir acaba?
program kodları :
//***************************************************************
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
 HAL_UART_DMAStop(&huart1); //bunu kullanmak ya da kullanmamak hatayı etkilemiyor.
}
//***************************************************************
void denemeFonksiyonu1(){
 HAL_UART_Transmit_DMA(&huart1,(uint8_t *)adc_veri_16bit,10000);
}
//***************************************************************
int main(void)
{
  HAL_Init();  SystemClock_Config();  MX_GPIO_Init();  MX_DMA_Init();
  MX_USART1_UART_Init();  MX_ADC1_Init();
 for(sayac=0;sayac<5000;sayac++){
 adc_veri_16bit[sayac]=0x4142;// A ve B ascii değerleri
 }
 denemeDegeri=1;

  while (1)
  {
   // AŞAĞIDA KAPATILAN BLOK AKTİF EDİLDİĞİNDE HATALI VERİ ALIYORUM.
  
   /*  adc_veri_16bit[0]=0;adc_veri_16bit[1]=0;adc_veri_16bit[2]=0;
   while(!(((adc_veri_16bit[1]>TriggerDegeri) && (adc_veri_16bit[1]<TriggerDegeri+10)) && (adc_veri_16bit[1]<adc_veri_16bit[2])
 && (adc_veri_16bit[1]>adc_veri_16bit[0])))
 {
 HAL_ADC_Start(&hadc1);
 adc_veri_16bit[0]=HAL_ADC_GetValue(&hadc1);
 HAL_ADC_Start(&hadc1);
 adc_veri_16bit[1]=HAL_ADC_GetValue(&hadc1);
 HAL_ADC_Start(&hadc1);
 adc_veri_16bit[2]=HAL_ADC_GetValue(&hadc1);
 }
 adc_veri_16bit[0]=0x4142;
 adc_veri_16bit[1]=0x4142;
 adc_veri_16bit[2]=0x4142;
 */
 HAL_Delay(1000);

 switch(denemeDegeri)
   {
   case 1: denemeFonksiyonu1(); break;
   case 2: denemeFonksiyonu2(); break;
   case 3: denemeFonksiyonu3(); break;
   default : break;
   }
  }
}

init ayarları:
//***************************************************************
static void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig;
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}
//***************************************************************
static void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}
//***************************************************************
static void MX_DMA_Init(void)
{
  __HAL_RCC_DMA1_CLK_ENABLE();
  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
}
bunlar da cubemx ayarlarım:

(https://thumb.ibb.co/buLZpq/cubemx.png) (https://ibb.co/buLZpq)
Başlık: Çözüldü : ADC devreye girince dma+usart hatalı veri yolluyor.
Gönderen: tekosis - 22 Kasım 2018, 15:59:10
Çözüldü.
HAL_UART_TxCpltCallback ve DMA1_Channel4_IRQHandler içine bir kontrol biti koyup ana programda bunları izledim. şimdilik bununla problem çözüldü gibi görünüyor ama ilerleyen aşamalarda belki başka problemlere sebep olabilir. Şimdilik bu kodla ilerleyeceğim.

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
 usartTransmitDurumu=1;
 //HAL_UART_DMAStop(&huart1);
}
  
void DMA1_Channel4_IRQHandler(void)
{
 dmakesmesioldumu=1;
  HAL_DMA_IRQHandler(&hdma_usart1_tx);
}  
  
   //Aşağıdaki program satırları ilk mesajımdaki ana programın ilgili kısımlarıdır...
  
   while(usartTransmitDurumu!=1 || dmakesmesioldumu!=1)
   {
   }
   usartTransmitDurumu=0;
   dmakesmesioldumu=0;
 
 adc_veri_16bit[0]=0; adc_veri_16bit[1]=0; adc_veri_16bit[2]=0;
    
   while(!(((adc_veri_16bit[1]>TriggerDegeri) && (adc_veri_16bit[1]<TriggerDegeri+10)) && (adc_veri_16bit[1]<adc_veri_16bit[2])
 && (adc_veri_16bit[1]>adc_veri_16bit[0])))
 {
 HAL_ADC_Start(&hadc1);
 //HAL_ADC_PollForConversion(&hadc1,100);
 adc_veri_16bit[0]=HAL_ADC_GetValue(&hadc1);
 ..................
 ..................
 ..................
 ..................