STM32F030CCT6 Usart DMA TC Interrupt problemi

Başlatan kimlenbu, 18 Aralık 2020, 18:05:16

kimlenbu

Selamlar, sıkıntımı çözdüm ama sorun bende mi yoksa STM32F0 Std Peripheral Library'de mi anlamak istedim. USART4'ü DMA1 Channel 5'e bağlamak istiyorum.

Aşağıdaki şekilde yazınca çalışmıyor.

DMA_ITConfig(DMA1_Channel5,DMA1_FLAG_TC5, ENABLE);

Böyle yazınca çalışıyor :

DMA_ITConfig(DMA1_Channel5,DMA1_FLAG_TC1, ENABLE);

DMA1_FLAG_TC1 degeri ((uint32_t)0x00000002)     
DMA1_FLAG_TC5 degeri ((uint32_t)0x00020000)   

Kodun tamamı da şu şekilde :


void USART4_DMA_Conf(void){ //INPUT A USART4 DMA1 CHANNEL 5
	//STM32F030CCT6 da sadece DMA1 var ve 5 kanala sahip sadece.
	DMA_InitTypeDef  DMA_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	  /* Enable the DMA periph */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  
  /* Enable Syscfg */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	
  /* Common DMA configuration */
  DMA_InitStructure.DMA_BufferSize = BufferASize;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA_Mode_Circular;//DMA_Mode_Normal;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

	
  /* DMA1 Channel3 configuration */
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferInputA_NMEA;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  DMA_InitStructure.DMA_PeripheralBaseAddr = USART4_RDR_Address;
  DMA_Init(DMA1_Channel5, &DMA_InitStructure);
	
  /* DMA remap Channel 5 to USART4 Rx */
  DMA_RemapConfig(DMA1, DMA1_CH5_USART4_RX); 
	
   /* Enable the USART1 Rx  DMA1 requests */
  //USART_DMACmd(USART1, USART_DMAReq_Tx|USART_DMAReq_Rx, ENABLE);
    USART_DMACmd(USART4, USART_DMAReq_Rx, ENABLE);
	
//Normalde TC5 enable edecegiz ama muhtemelen kütüphanede sikinti var, bunu TC1 yapinca Channel 5 Transfer complete interrupti aktif oluyor. Interrupt gelince DMA1_FLAG_TC5 aktif oluyor.
//Debugdan kontrol edebilirsin. TC5 yapinca Channel 5 TC interrupti aktif olmuyor, TC1 yapinca oluyor. Bos zamanda referans dökümandan kontrol et.
	DMA_ITConfig(DMA1_Channel5,DMA1_FLAG_TC1, ENABLE); 
//	DMA_ITConfig(DMA1_Channel3, DMA1_FLAG_HT1, ENABLE);
	
	
	
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x03;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
	
  DMA_Cmd(DMA1_Channel5, ENABLE); 
	
		
}


RaMu

#1
Datasheet te hangi modülün hangi kanala bağlanabileceğini gösteren bir yer vardı,
bir kontrol etmek lazım.

Öyle üstünkörü baktım, yanlış bakmışta olabilirim ama
Usart4 ün bağlanabileceği bir DMA kanalı gözükmüyor.
Sayfa 158, Figure 20:
https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.st.com/resource/en/datasheet/stm32f030f4.pdf&ved=2ahUKEwi3n9qf7NftAhWoAxAIHahyDjMQFjAAegQIBxAC&usg=AOvVaw3lCTSng8ZpoEtWDzT5GIQU
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

kimlenbu

@RaMu, söylediğine dikkat etmiştim, hatta pdf'e bookmark ekledim, birisinin işine yararsa diye görseli ekliyorum. Channel 1,3,5 USART 1,2,3,4,5,6 RX'e, Channel 2,4 ise TX'e atanabiliyor. Sıkıntı orada değil ne yazık ki.

Cube Mx ve HAL Library'e geçmemek için diretip duruyorum ama artık kaynak bulması da çok zorlaştı, projenin altyapısını kurması da zaman alıyor.