Ynt: STM32f4 Timer ADC Tetiklemesi

Başlatan Mucit23, 14 Şubat 2014, 00:24:28

Klein

@Mucit23 Aşağıda  bir proje için yazdığım Init kodları  ve diğer işletme kodları var. Bit Timer başka bir Tİmeri tetikliyor. O Timer ADC'yi tetikliyor. ADC DMA ile veriyi alıyor. Veri alımı bittikten sonra başka bir DMA ile veriler tampon bölgeye alınıp USART'ı tetikliyoor vs.. vs..
Fakat şu aralar o kadar yoğunum ki günde bazen 36 saat aralıksız çalışıyorum. Kodlarla ilgili açıklama istersen datasheet'e gömülüp neyi neden yaptığımı kontrol etmem gerek. Bu aralar bunu yapamam.
Yoğunluğum geçince istediğin kadar açıklama yapabilirim. Zaten biraz incelersen sen de konuyu kavrarsın.

Init kodları.
void Init_ADC(void)
{
ADC_InitTypeDef Adc_InitStruct;
ADC_CommonInitTypeDef AdcCommonInitStruct;

	ADC_DeInit();

	AdcCommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
	AdcCommonInitStruct.ADC_Mode = ADC_Mode_Independent;
	AdcCommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div2;

	ADC_CommonInit(&AdcCommonInitStruct);

	Adc_InitStruct.ADC_ContinuousConvMode = DISABLE;
	Adc_InitStruct.ADC_ScanConvMode = DISABLE;
	Adc_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
	Adc_InitStruct.ADC_NbrOfConversion = 1;
	Adc_InitStruct.ADC_Resolution = ADC_Resolution_8b;
	Adc_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC3;
	Adc_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Falling;

	ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_15Cycles);

	ADC_Init(ADC1, &Adc_InitStruct);

	ADC_SoftwareStartConv(ADC1);

	ADC_EOCOnEachRegularChannelCmd(ADC1, DISABLE);
	ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
	ADC_Cmd(ADC1, ENABLE);
}


void Init_USART(void)
{
	USART_QuickConfig(USART6, 1000000, USART_WordLength_8b, USART_Parity_No, USART_StopBits_1);
	USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
	USART_Cmd(USART6, ENABLE);
	NVIC_QuickConfig(USART6_IRQn, ENABLE);
}


void Init_TIM2(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef	TIM_OCInitStruc;

	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStruct.TIM_Period = 9;
	TIM_TimeBaseStruct.TIM_Prescaler = 7;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct);

	TIM_OCInitStruc.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStruc.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStruc.TIM_Pulse = 5;
	TIM_OCInitStruc.TIM_OutputState = ENABLE;
	TIM_OCInitStruc.TIM_OCIdleState = TIM_OCIdleState_Set;

	TIM_OC3Init(TIM2, &TIM_OCInitStruc);
	TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);

	TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

	TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
	TIM_Cmd(TIM2, ENABLE);
}

void Init_TIM3(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef	TIM_OCInitStruc;
NVIC_InitTypeDef TIM_NVICStruct;

    TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1);

 	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStruct.TIM_Period = 5499;
	TIM_TimeBaseStruct.TIM_Prescaler = 0;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct);


	TIM_OCInitStruc.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStruc.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStruc.TIM_Pulse = 10;
	TIM_OCInitStruc.TIM_OutputState = ENABLE;
	TIM_OCInitStruc.TIM_OCIdleState = TIM_OCIdleState_Set;

	TIM_OC3Init(TIM3, &TIM_OCInitStruc);


	TIM_NVICStruct.NVIC_IRQChannel = TIM3_IRQn;
	TIM_NVICStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&TIM_NVICStruct);
	TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE);

	TIM_Cmd(TIM3, ENABLE);
}

void Init_TIM4(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef	TIM_OCInitStruc;
NVIC_InitTypeDef TIM_NVICStruct;

	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV4;
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStruct.TIM_Period = 99;
	TIM_TimeBaseStruct.TIM_Prescaler = 2624;
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStruct);

	TIM_OCInitStruc.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStruc.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStruc.TIM_Pulse = 50;
	TIM_OCInitStruc.TIM_OutputState = ENABLE;
	TIM_OCInitStruc.TIM_OCIdleState = TIM_OCIdleState_Reset;

	TIM_OC4Init(TIM4, &TIM_OCInitStruc);
	TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);

	TIM_NVICStruct.NVIC_IRQChannel = TIM4_IRQn;
	TIM_NVICStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&TIM_NVICStruct);
	TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE);

}

void Init_TIM5(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
NVIC_InitTypeDef TIM_NVICStruct;

	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV4;
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStruct.TIM_Period = 99;
	TIM_TimeBaseStruct.TIM_Prescaler = 2099;
	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStruct);

	TIM_NVICStruct.NVIC_IRQChannel = TIM5_IRQn;
	TIM_NVICStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&TIM_NVICStruct);
	TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
}

void DMA_ADC1_Configuration(void) {
	DMA_InitTypeDef DMA_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	DMA_DeInit(DMA2_Stream0);

	DMA_InitStructure.DMA_Channel = DMA_Channel_0;
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
	DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) & ScanFile.Buf;
	DMA_InitStructure.DMA_BufferSize = (uint16_t)(5400);
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & ADC1->DR;
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
	DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
	DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
	DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

	DMA_Init(DMA2_Stream0, &DMA_InitStructure);

	/* Enable DMA Stream Transfer Complete interrupt */
	DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);

	/* Configure the Priority Group to 2 bits */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

}

void DMA_ScanFile_Configuration(void) {
	DMA_InitTypeDef DMA_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	DMA_DeInit(DMA2_Stream7);

	DMA_InitStructure.DMA_Channel = DMA_Channel_3;
	DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & ScanFile.Buf + COL_START; // Source
	DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) & ImageFile.Buf; //Dest;
	DMA_InitStructure.DMA_BufferSize = (uint16_t)(COL_COUNT);
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
	DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
	DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
	DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

	DMA_Init(DMA2_Stream7, &DMA_InitStructure);

	/* Enable DMA Stream Transfer Complete interrupt */
	DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);

	/* Configure the Priority Group to 2 bits */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

}

void DMA_USART6_Configuration(void) {
	DMA_InitTypeDef DMA_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	DMA_DeInit(DMA2_Stream6);

	DMA_InitStructure.DMA_Channel = DMA_Channel_5;
	DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; // Transmit
	DMA_InitStructure.DMA_BufferSize = (uint16_t) 0;
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & USART6->DR;
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
	DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
	DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
	DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

	DMA_Init(DMA2_Stream6, &DMA_InitStructure);

	/* Enable the USART TX DMA request */
	USART_DMACmd(USART6, USART_DMAReq_Tx, ENABLE);

	/* Enable DMA Stream Half Transfer and Transfer Complete interrupt */
	DMA_ITConfig(DMA2_Stream6, DMA_IT_TC, ENABLE);

	/* Configure the Priority Group to 2 bits */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	/* Enable the UsRT6 RX DMA Interrupt */
	NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream6_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	/* Enable the DMA RX Stream */
}

İşletme kodları


void USART6_SendDMA(char *Source, unsigned int Len) {
	ResetFlags(SCNFLAG_COMRDY);
	DMA2_Stream6->M0AR = (uint32_t) Source;
	DMA2_Stream6->NDTR = Len;
	DMA_Cmd(DMA2_Stream6, ENABLE);
}

void ADC_IRQHandler(void) {

	ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
}

void TIM2_IRQHandler(void) {
	TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
}

void TIM3_IRQHandler(void) {
	ADC_ClearFlag(ADC1, ADC_FLAG_OVR | ADC_FLAG_EOC);
	ADC_DMACmd(ADC1, ENABLE);
	DMA_Cmd(DMA2_Stream0, ENABLE);
	TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
}

void TIM4_IRQHandler(void) {
	TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);

}

void DMA2_Stream6_IRQHandler(void) {
	if (DMA_GetITStatus(DMA2_Stream6, DMA_IT_TCIF6)) {
		SetFlags(SCNFLAG_COMRDY);
		DMA_ClearITPendingBit(DMA2_Stream6, DMA_IT_TCIF6);
	}

}

void DMA2_Stream7_IRQHandler(void) {

	DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);
}

void DMA2_Stream0_IRQHandler(void) {
	if (DMA2->LISR & (uint32_t) 0x00000020) {
		ADC1->CR2 &= (uint32_t)(0xFFFFFEFF);
		DMA2_Stream0->NDTR = 5400;

		DMA2->LIFCR = (uint32_t) 0x00000020;
		DMA_Cmd(DMA2_Stream7, ENABLE);
	}
}

void USART6_IRQHandler(void) {
	if (USART_GetITStatus(USART6, USART_IT_RXNE)) {
		Comm_OnRxData((uint8_t)USART_ReceiveData(USART6));
		USART_ClearITPendingBit(USART6, USART_IT_RXNE);
	}
}

void EXTI1_IRQHandler(void) {
	EXTI_ClearITPendingBit(EXTI_Line1);
	if (GPIO_ReadInputDataBit(SW_HOME) == RESET) {
		ResetFlags(SCNFLAG_PPOSHOME);
		CCDLedOn();
		SetFlags(SCNFLAG_DMNDINFO);
	} else {
		GPIO_ResetBits(STP_EN);
		CCDLedOff();
		SetFlags(SCNFLAG_PPOSHOME);
		Scanner.Pos = 0;
		Scanner.Distance = 0;
	}
}

void TIM5_IRQHandler(void) {
	TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
	if(GetFlagStatus(SCNFLAG_COMRDY) != 0)
	{
		if(GetFlagStatus(SCNFLAG_PLTRDY | SCNFLAG_GETIMG) != 0)
		{
			Scanner.InfoTout = 20;
			ResetFlags(SCNFLAG_GETIMG);
			ImageFile.Mark = 0xDAC90278;
			ImageFile.Flags = Scanner.Flags;
			ImageFile.Pos = (Scanner.Pos / 16);
			USART6_SendDMA((char *) &ImageFile , COL_COUNT + 12);
		}else if(Scanner.InfoTout-- == 0){
			SendInfo();
			Scanner.InfoTout = 20;
		}
	}
	GPIO_ToggleBits(LED_RUN);
}

int main(void) {
	SystemInit();
	SysTick_Config(SystemCoreClock / 1000);
	Init_RCC();
	Init_GPIO();

	DMA_ADC1_Configuration();
	Init_ADC();
	DMA_ScanFile_Configuration();
	DMA_Cmd(DMA2_Stream0, ENABLE);

	Init_USART();
	DMA_USART6_Configuration();
	Init_TIM2();
	Init_TIM3();
	Init_TIM4();
	Init_TIM5();
	TIM_Cmd(TIM5, ENABLE);
while (1) {

Mucit23

Teşekkürler hocam akşam üzeri deneyeceğim.