Reystlin 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 (изменено) · Жалоба Доброго времени суток, ув. форумчане Осваиваю по немногу искусство программирования 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 Изменено 23 ноября, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Galizin 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба http://infocenter.arm.com/help/index.jsp?t...a/CIHFDJCA.html Может поможет локализовать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reystlin 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба а как в IAR это узнать в дебаге? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба Гуглоком дает первой ссылкой http://blog.frankvh.com/2011/12/07/cortex-...-fault-handler/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reystlin 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба т.е. судя по этой статье нужно стратапр файл менять? или куда эти куски ассемблерного кода девать? з.ы. я с stm32 только начинаю освиваться и для меня пока ещё это все темный лес%) гугл листал перед тем как на форум писать, ответа не нашел Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба можно и в startup, можно и в файл .с, можно в отдельный .s кому как нравится. и кто чем пользуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reystlin 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба https://www.dropbox.com/s/g5dk0okn7r6x2k8/%....58.55.png?dl=0 вот что выдает похожий код Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба Смотрите что у вас находится по адресам 0x08004269 -> 0x080047DC -> HardFault Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reystlin 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба как это определить в IAR? где эти адреса смотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба например в окне диассемлера задать адрес и посмотреть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reystlin 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба https://www.dropbox.com/s/lrnptgci2m4hqqn/%....52.09.png?dl=0 https://www.dropbox.com/s/x0ul0hbjuq4189p/%....53.56.png?dl=0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба Поставьте точку останова и смотрите, что и как вызывается и параметры Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reystlin 0 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба на какой строке поставить точку останова? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 22 ноября, 2015 Опубликовано 22 ноября, 2015 · Жалоба а для начала поставьте while(1) { } после ADC_Ini(); и проверьте работу Timer2 и ADС Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reystlin 0 23 ноября, 2015 Опубликовано 23 ноября, 2015 · Жалоба сделал вот так ADC_Cmd(ADC1, ENABLE); while(1) { } и всеравно Hard_Fault вываливается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться