ADC devreye girince dma+usart hatalı veri yolluyor.

Başlatan tekosis, 22 Kasım 2018, 11:47:15

tekosis

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:

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

tekosis

Çö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);
 ..................
 ..................
 ..................
 ..................
 
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.