stm32f4 работает только в отладке

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
r0cket111
Родился
Сообщения: 9
Зарегистрирован: Пт дек 13, 2013 18:37:51

stm32f4 работает только в отладке

Сообщение r0cket111 »

Здравствуйте. Помогите разобраться.

Написал код. В отладке работает. Как только заливаю в проц то уже ничего не работает. Плата stm32f4discovery
Использую Coocox. Могу приложить готовый проект.

Код: Выделить всё

#include "stm32_ub_led.h"
#include <stm32f4xx_adc.h>
#include <stm32f4xx.h>
#include <stm32f4xx_rcc.h>   // для настройки тактирования
#include <stm32f4xx_gpio.h>  // для работы с периферией
#include <misc.h>   // всё необходимое для обработки прерываний
#include <stm32f4xx_syscfg.h>
#include <stm32f4xx_exti.h>
#include <stm32f4xx_tim.h>
#include <stm32f4xx_adc.h>

int t1=0;
int t2=0;
int t3=0;
int t4=1;
int i=0;
int g=0;
int x=0x200;
int skor=0x200;
int messwert = 0;
int g1=0;
int g2=0;
int a=0;
int b=0;
int c=0;




int main(void)
{

	 SystemInit();

	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	ADC_InitTypeDef       ADC_InitStructure;

	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
	 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

	 GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
	 GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
	 GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_TIM4);

	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
	 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	 GPIO_Init(GPIOA, &GPIO_InitStructure);

	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
	 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	 GPIO_Init(GPIOD, &GPIO_InitStructure);


	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_7;
	 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	 GPIO_Init(GPIOA, &GPIO_InitStructure);


	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	 GPIO_Init(GPIOD, &GPIO_InitStructure);



	   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
	   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
	   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
	   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
	   ADC_CommonInit(&ADC_CommonInitStructure);

	   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
	   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	   ADC_InitStructure.ADC_NbrOfConversion = 1;
	   ADC_Init(ADC1, &ADC_InitStructure);

	   ADC_Cmd(ADC1, ENABLE);
	 //  ADC_EOCOnEachRegularChannelCmd(ADC1, ENABLE);





		       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);



		       TIM_TimeBaseStructure.TIM_Period = 700;  // Пер ШИМ
		   	   TIM_TimeBaseStructure.TIM_Prescaler = 0;
		   	   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
		   	   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

		   	   TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

		   	   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		   	   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		   	   TIM_OCInitStructure.TIM_Pulse = 0x180;                     // Ширина имульса заполнения
		   	   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

		   	   TIM_OC1Init(TIM4, &TIM_OCInitStructure);

		   	   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		   	   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		   	   TIM_OCInitStructure.TIM_Pulse = 0x180;                     // Ширина имульса заполнения
		   	   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

		   	   TIM_OC2Init(TIM4, &TIM_OCInitStructure);

		   	   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		   	   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		   	   TIM_OCInitStructure.TIM_Pulse = 0x180;                     // Ширина имульса заполнения
		   	   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

		   	   TIM_OC3Init(TIM4, &TIM_OCInitStructure);


		   	   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
		   	   TIM_Cmd(TIM4, ENABLE);
		   	   TIM4->CCR1=(0x00);
		   	   TIM4->CCR2=(0x00);
		   	   TIM4->CCR3=(0x00);





		   	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
		   	TIM_TimeBaseStructure.TIM_Period = 61100;  // Пер ШИМ
		   	TIM_TimeBaseStructure.TIM_Prescaler = 8;
		   	TIM_TimeBaseInit ( TIM6, &TIM_TimeBaseStructure );
		   	TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
		//   	NVIC_EnableIRQ(TIM6_DAC_IRQn);

		   	GPIO_ResetBits(GPIOA, GPIO_Pin_4);
		   	GPIO_ResetBits(GPIOA, GPIO_Pin_5);
		   	GPIO_ResetBits(GPIOA, GPIO_Pin_7);



			ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
			ADC_SoftwareStartConv(ADC1);
			while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
			messwert=ADC_GetConversionValue(ADC1);
			if(messwert<1000) a=1;

			ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 1, ADC_SampleTime_3Cycles);
			ADC_SoftwareStartConv(ADC1);
			while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
			messwert=ADC_GetConversionValue(ADC1);
			if(messwert<1000) b=1;

		    ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 1, ADC_SampleTime_3Cycles);
			ADC_SoftwareStartConv(ADC1);
			while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
			messwert=ADC_GetConversionValue(ADC1);
			if(messwert<1000) c=1;

			if(a==1)
			{
			GPIO_ResetBits(GPIOA, GPIO_Pin_4);
			GPIO_SetBits(GPIOA, GPIO_Pin_5);
			GPIO_SetBits(GPIOA, GPIO_Pin_7);
			TIM4->CCR2=0;
			TIM4->CCR3=500;
			int c = 1;
			for ( c = 1 ; c <= 300000 ; c++ );
			}
			if(b==1)
			{
			GPIO_ResetBits(GPIOA, GPIO_Pin_5);
			GPIO_SetBits(GPIOA, GPIO_Pin_4);
			GPIO_SetBits(GPIOA, GPIO_Pin_7);
			TIM4->CCR3=0;
			TIM4->CCR1=500;
			int c = 1;
			for ( c = 1 ; c <= 300000 ; c++ );
			}
			if(c==1)
			{
			GPIO_ResetBits(GPIOA, GPIO_Pin_7);
			GPIO_SetBits(GPIOA, GPIO_Pin_4);
			GPIO_SetBits(GPIOA, GPIO_Pin_5);
			TIM4->CCR1=0;
			TIM4->CCR2=500;
			int c = 1;
			for ( c = 1 ; c <= 300000 ; c++ );
			}

			//	while (1);

		   	while(1){
		   	ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
		   	ADC_SoftwareStartConv(ADC1);
		    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
		    messwert=ADC_GetConversionValue(ADC1);
		  //  messwert=(messwert >> 4);
		    if((messwert>2300) & (t1 == 0))
		    {GPIO_SetBits(GPIOD, GPIO_Pin_5);

		    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		    TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
		    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
		    TIM_OC1Init(TIM4, &TIM_OCInitStructure);
		    TIM4->CCR1=x;


		    GPIO_SetBits(GPIOA, GPIO_Pin_4);
		    GPIO_ResetBits(GPIOA, GPIO_Pin_7);


		    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		    TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
		    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
		    TIM_OC3Init(TIM4, &TIM_OCInitStructure);

		    TIM4->CCR3=(0x0);

		    t1=1;
		    TIM_Cmd(TIM6, DISABLE);
		    i=TIM6->CNT;
		    if ((i>3200) & (i<3800)) g=g+1;


		    if (i<3200) g1=g1+1;
		    if (g1>50)
		    {x=x-1;
		    g1=0;
		    }
		    if (i>3800) g2=g2+1;
		    if (g2>50)
		    {x=x+1;
		    if (x>690) x=690;
		    g2=0;
		    }


		    TIM6->CNT=0;


		    }
		    if((messwert<1000) & (t1 == 1))
		    {GPIO_ResetBits(GPIOD, GPIO_Pin_5);

		    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		    TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
		    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
		    TIM_OC1Init(TIM4, &TIM_OCInitStructure);

		    TIM4->CCR1=x;

		    GPIO_SetBits(GPIOA, GPIO_Pin_4);
		    GPIO_ResetBits(GPIOA, GPIO_Pin_7);

		    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		    TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
		    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
		    TIM_OC3Init(TIM4, &TIM_OCInitStructure);

		    TIM4->CCR3=(0x0);
		    t1=0;
		    TIM_Cmd(TIM6, ENABLE);

		    }

		    ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 1, ADC_SampleTime_3Cycles);
			ADC_SoftwareStartConv(ADC1);
			while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
			messwert=ADC_GetConversionValue(ADC1);
		//	messwert=(messwert >> 4);
			 if((messwert<1000) & (t2 == 1))
			 {GPIO_ResetBits(GPIOD, GPIO_Pin_6);

			 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		   	 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		   	 TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
		   	 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
		   	 TIM_OC2Init(TIM4, &TIM_OCInitStructure);

			 TIM4->CCR2=x;

			 GPIO_SetBits(GPIOA, GPIO_Pin_5);
			 GPIO_ResetBits(GPIOA, GPIO_Pin_4);

			 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
			 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
			 TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
			 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
			 TIM_OC1Init(TIM4, &TIM_OCInitStructure);

			 TIM4->CCR1=(0x0);
			 t2=0;
			 }
			 if((messwert>2300) & (t2 == 0))
			 {GPIO_SetBits(GPIOD, GPIO_Pin_6);

			    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
			    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
			    TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
			    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
			    TIM_OC2Init(TIM4, &TIM_OCInitStructure);
			 TIM4->CCR2= x;

			 GPIO_SetBits(GPIOA, GPIO_Pin_5);
			 GPIO_ResetBits(GPIOA, GPIO_Pin_4);

			    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
			    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
			    TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
			    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
			    TIM_OC1Init(TIM4, &TIM_OCInitStructure);
			 TIM4->CCR1= 0x00;
			 t2=1;
			 }

			ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 1, ADC_SampleTime_3Cycles);
			ADC_SoftwareStartConv(ADC1);
			while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
			messwert=ADC_GetConversionValue(ADC1);
		//	messwert=(messwert >> 4);
			 if((messwert>2300) &  (t3 == 0))
			 {GPIO_ResetBits(GPIOD, GPIO_Pin_7);

			    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
			    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
			    TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
			    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
			    TIM_OC3Init(TIM4, &TIM_OCInitStructure);
			 TIM4->CCR3=x;

			 GPIO_SetBits(GPIOA, GPIO_Pin_7);
			 GPIO_ResetBits(GPIOA, GPIO_Pin_5);


			    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
			    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
			    TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
			    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
			    TIM_OC2Init(TIM4, &TIM_OCInitStructure);
			 TIM4->CCR2=0x00;
			 t3=1;
			 }
			 if((messwert<1000) &  (t3 == 1))
			 {GPIO_SetBits(GPIOD, GPIO_Pin_7);
			 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
			 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
			 TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
			 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
			 TIM_OC3Init(TIM4, &TIM_OCInitStructure);

			 TIM4->CCR3=x;

			 GPIO_SetBits(GPIOA, GPIO_Pin_7);
			 GPIO_ResetBits(GPIOA, GPIO_Pin_5);

		   	 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		   	 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		   	 TIM_OCInitStructure.TIM_Pulse = x;                     // Ширина имульса заполнения
		   	 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
		   	 TIM_OC2Init(TIM4, &TIM_OCInitStructure);

			 TIM4->CCR2=(0x0);
			 t3=0;
			 }
		   	 }
			 }

void TIM6_DAC_IRQHandler()
{
TIM6->SR &= ~TIM_SR_UIF;
i++;
}
Вложения
Demo_05_ADC_Single44.rar
(244.1 КБ) 142 скачивания
Реклама
r0cket111
Родился
Сообщения: 9
Зарегистрирован: Пт дек 13, 2013 18:37:51

Re: stm32f4 работает только в отладке

Сообщение r0cket111 »

Еще симптомы. Если прошить программу в МК, то она работает и даже если нажать ресет то тоже работает. Но как только вытаскиваю USB питание и затем снова подключаю к нему то сразу ничего не работает. На второй плате дискавери тоже самое. Колдовство
Реклама
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: stm32f4 работает только в отладке

Сообщение Mishany »

стоит попробовать HEX залить через STM32 ST-LINK Utility, отладчик по default обычно не пишет программу во flash. (так в KEIL)
r0cket111
Родился
Сообщения: 9
Зарегистрирован: Пт дек 13, 2013 18:37:51

Re: stm32f4 работает только в отладке

Сообщение r0cket111 »

заливал. ничего не меняется
Реклама
Эиком - электронные компоненты и радиодетали
r0cket111
Родился
Сообщения: 9
Зарегистрирован: Пт дек 13, 2013 18:37:51

Re: stm32f4 работает только в отладке

Сообщение r0cket111 »

Перешел на Keil. Все работает. Код программы не менял.
Реклама
Аватара пользователя
moLCHec
Мявтор!
Сообщения: 825
Зарегистрирован: Вс дек 18, 2005 20:04:42
Откуда: Свердловская обл.
Контактная информация:

Re: stm32f4 работает только в отладке

Сообщение moLCHec »

Когда начинал изучать STM в кокосе глючило тупое мигание индикатором на плате.
Перешел на Keil и с тех пор искренне сочувствую тем кто пользует кокос.
Настоящий кот всегда либо голоден,
либо невыспался ...
Реклама
Ответить

Вернуться в «ARM»