Перейти к содержанию
    

Доброго времени суток, ув. форумчане

Осваиваю по немногу искусство программирования STM32, столкнулся с вот такой проблемой

имеется код настройки ацп, запускающегося от таймера:

void ADC_Tim()
{
 //TIM2 - 1kHz
 TIM_TimeBaseInitTypeDef TIM_Time_user;

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

 TIM_Time_user.TIM_Prescaler = 20-1;//8000000/1000;//20-1;
 TIM_Time_user.TIM_CounterMode = TIM_CounterMode_Up;
 TIM_Time_user.TIM_Period = 100;
 TIM_Time_user.TIM_ClockDivision = TIM_CKD_DIV1;

 TIM_TimeBaseInit(TIM2, &TIM_Time_user);

 NVIC_EnableIRQ(TIM2_IRQn);

 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

 TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
 TIM_Cmd(TIM2, ENABLE);
}

extern "C" void TIM2_IRQHandler(void)
{
 if(TIM_GetITStatus(TIM2, TIM_IT_Update)==SET)
 {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
GPIO_ToggleBits(GPIOD, GPIO_Pin_15);
 }
}

void ADC_Ini()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_Init_user;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);

ADC_Init_user.ADC_Resolution = ADC_Resolution_12b;
ADC_Init_user.ADC_ScanConvMode = ENABLE;
ADC_Init_user.ADC_ContinuousConvMode = DISABLE;
ADC_Init_user.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConvEdge_Rising);
ADC_Init_user.ADC_ExternalTrigConv = ADC_ExternalTrigInjecConv_T2_TRGO;
ADC_Init_user.ADC_DataAlign = ADC_DataAlign_Right;
ADC_Init_user.ADC_NbrOfConversion = 2;

ADC_Init(ADC1, &ADC_Init_user);

ADC_InjectedSequencerLengthConfig(ADC1, 2);	  
ADC_InjectedChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_56Cycles);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_7, 2, ADC_SampleTime_56Cycles);

NVIC_EnableIRQ(ADC_IRQn);
  // __enable_irq();
ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);

ADC_Tim();

ADC_Cmd(ADC1, ENABLE);
}

extern "C" void ADC_IRQHandler(void)
{
 if(ADC_GetITStatus(ADC1, ADC_IT_JEOC) == SET)
 {
ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);
  GPIO_SetBits(GPIOD, GPIO_Pin_14);

data_adc1 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
data_adc1 = data_adc1*1.365;

data_adc2 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);
data_adc2 = data_adc2*1.365;
 }
}

в дебаге пошагово выполняю программу и после строки

ADC_Cmd(ADC1, ENABLE);

мк вываливается в прерывание Hard_Fault, никак не могу понять причину происходящего

ссылка на проект целиком: https://www.dropbox.com/s/jw9kvfrg4tatht6/MIG_BU.7z?dl=0

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гуглоком дает первой ссылкой

http://blog.frankvh.com/2011/12/07/cortex-...-fault-handler/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. судя по этой статье нужно стратапр файл менять? или куда эти куски ассемблерного кода девать?

з.ы. я с stm32 только начинаю освиваться и для меня пока ещё это все темный лес%)

гугл листал перед тем как на форум писать, ответа не нашел

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно и в startup, можно и в файл .с, можно в отдельный .s

кому как нравится. и кто чем пользуется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите что у вас находится по адресам

 

0x08004269 -> 0x080047DC -> HardFault

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поставьте точку останова и смотрите, что и как вызывается и параметры

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а для начала поставьте

while(1) { }

после

ADC_Ini();

и проверьте работу Timer2 и ADС

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сделал вот так

ADC_Cmd(ADC1, ENABLE);

while(1) { }

и всеравно Hard_Fault вываливается

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...