Picproje Elektronik Sitesi

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

Başlık: ADC devreye girince dma+usart hatalı veri yolluyor.
Gönderen: tekosis - 22 Kasım 2018, 14: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 
1denemeFonksiyonu1(); break;
   case 
2denemeFonksiyonu2(); break;
   case 
3denemeFonksiyonu3(); 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_IRQn00);
  
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  
HAL_NVIC_SetPriority(DMA1_Channel4_IRQn00);
  
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, 18: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!=|| dmakesmesioldumu!=1)
   {
   }
   
usartTransmitDurumu=0;
   
dmakesmesioldumu=0
 
 
adc_veri_16bit[0]=0adc_veri_16bit[1]=0adc_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);
 ..................
 ..................
 ..................
 ..................