реклама на сайте
подробности

 
 
> stm32 ADC Hard_Fault
Reystlin
сообщение Nov 22 2015, 12:14
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 6-09-15
Пользователь №: 88 307



Доброго времени суток, ув. форумчане
Осваиваю по немногу искусство программирования STM32, столкнулся с вот такой проблемой
имеется код настройки ацп, запускающегося от таймера:
CODE
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 - Nov 23 2015, 13:20
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Reystlin   stm32 ADC Hard_Fault   Nov 22 2015, 12:14
- - Oleg Galizin   http://infocenter.arm.com/help/index.jsp?t...a/CIH...   Nov 22 2015, 13:30
- - Reystlin   а как в IAR это узнать в дебаге?   Nov 22 2015, 18:03
- - x893   Гуглоком дает первой ссылкой http://blog.frankvh.c...   Nov 22 2015, 18:25
- - Reystlin   т.е. судя по этой статье нужно стратапр файл менят...   Nov 22 2015, 18:53
- - x893   можно и в startup, можно и в файл .с, можно в отде...   Nov 22 2015, 19:32
- - Reystlin   https://www.dropbox.com/s/g5dk0okn7r6x2k8/%....58....   Nov 22 2015, 20:03
- - x893   Смотрите что у вас находится по адресам 0x0800426...   Nov 22 2015, 21:40
- - Reystlin   как это определить в IAR? где эти адреса смотреть?   Nov 22 2015, 21:50
- - x893   например в окне диассемлера задать адрес и посмотр...   Nov 22 2015, 21:52
- - Reystlin   https://www.dropbox.com/s/lrnptgci2m4hqqn/%....52....   Nov 22 2015, 21:56
- - x893   Поставьте точку останова и смотрите, что и как выз...   Nov 22 2015, 22:03
- - Reystlin   на какой строке поставить точку останова?   Nov 22 2015, 22:47
- - x893   а для начала поставьте while(1) { } после ADC_In...   Nov 22 2015, 23:54
- - Reystlin   сделал вот так ADC_Cmd(ADC1, ENABLE); whil...   Nov 23 2015, 04:57
- - x893   Так это уже совсем просто. У вас только Timer2 и A...   Nov 23 2015, 21:37
- - Reystlin   вычислил, что проблема в строках data_adc1 = data_...   Nov 23 2015, 23:30
- - Genadi Zawidowski   Перед умножением коэффициент привели к целой едини...   Nov 24 2015, 00:40
- - Reystlin   Спасибо, Genadi Zawidowski а есть ли мысли из-за ч...   Nov 24 2015, 04:54
- - Genadi Zawidowski   В обработчике прерывания АЦП поищите... Выдайте в ...   Nov 24 2015, 08:04
- - Reystlin   строку в которой валится я нашел: data_adc1 = data...   Nov 24 2015, 12:16
- - Сергей Борщ   Что-то припоминается про выравнивание стека на 8 п...   Nov 24 2015, 13:11
- - Reystlin   а при чем тут стек? и поччему изначально такая кон...   Nov 25 2015, 06:46
- - Сергей Борщ   Цитата(Reystlin @ Nov 25 2015, 09:46) а п...   Nov 25 2015, 08:33


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016