Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32 iar прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Reystlin
добрый день, ув. форумчае
пытаюсь настроить ацп, посмотрел вот этот видео урок http://www.youtube.com/watch?v=l4YmGknezw4...jd37aVv0ic24jqV
сделал по примеру из него
в итоге ситуация такая, что прерывание по окончанию преобразования не срабатывает, хотя преобразование я запускаю. никак не могу понять в чем беда
по ссылке архив с проектом в IAR 7.2
https://www.dropbox.com/s/jw9kvfrg4tatht6/MIG_BU.7z?dl=0
Reystlin
настраиваю ацп вот так
Код
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_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_AHB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);
    
    ADC_Init_user.ADC_Resolution = ADC_Resolution_12b;
    ADC_Init_user.ADC_ScanConvMode = DISABLE;
    ADC_Init_user.ADC_ContinuousConvMode = DISABLE;
    ADC_Init_user.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_Init_user.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
    ADC_Init_user.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_Init_user.ADC_NbrOfConversion = 1;

    ADC_Init(ADC1, &ADC_Init_user);
    
    ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_56Cycles);
    
    NVIC_EnableIRQ(ADC_IRQn);
    __enable_irq();
    ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE);
    
    ADC_Cmd(ADC1, ENABLE);
}


запускаю преобразование командой ADC_SoftwareStartConv(ADC1);

вот так описано прерывание:
Код
extern "C" void ADC_IRQHandler(void)
{
  if(ADC_GetITStatus(ADC1, ADC_IT_EOC) == SET)
  {
    ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
      GPIO_SetBits(GPIOD, GPIO_Pin_14);
    data_adc = ADC_GetConversionValue(ADC1);
  }
}


когда пошагово выполняю программу проц выполняет команду ADC_SoftwareStartConv(ADC1); и дальше продолжает остальной код выполнять, но прерывание так и не вызывается
Tarbal
Есть два варианта. Либо АЦП не работает, либо с разрешением прерывания не все сделано правильно.

Вопросы на которые надо ответить:
1. Преобразование закончилось? Значение в регистрах соответствуют напряжению на входе АЦП?
2. К АЦП клок подключен?
3. Все ли сделано для нормальной работы АЦП?
4. Сколько мест где разрешается прерывание? Обычно общий флаг (либо уровень) и индивидуальный флаг.
Reystlin
1. как определить закончилось ли преобразование? значение в регистре всегда 0
2. клок подключаю вот этой командой RCC_AHB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);
3. делал по видео примеру, у автора все заработало, что я упустил не знаю, поэтому и пишу на форум
4. прерывания разрешаю вот тут: NVIC_EnableIRQ(ADC_IRQn);
__enable_irq();
ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE);
тут, как я понимаю и общий и индивидуальные флаги
Tarbal
Цитата(Reystlin @ Nov 5 2015, 00:41) *
1. как определить закончилось ли преобразование? значение в регистре всегда 0
2. клок подключаю вот этой командой RCC_AHB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);
3. делал по видео примеру, у автора все заработало, что я упустил не знаю, поэтому и пишу на форум
4. прерывания разрешаю вот тут: NVIC_EnableIRQ(ADC_IRQn);
__enable_irq();
ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE);
тут, как я понимаю и общий и индивидуальные флаги

Если вне зависимости от входного напряжения результат всегда ноль, то скорее всего АЦП не работает.

Чтобы убедиться, что прерывания разрешены, найдите адреса соответствующих регистров и проверьте значения в дампе памяти. Там можно даже вручную поменять значения.

Есть такой вариант. Установите графический генератор пакетов, описанный мной в другой теме и сконфигурируйте там АЦП для вашего проекта. Должно заработать. Потом сравните регистры конфигурации для АЦП в обоих проектах и найдите отличия.
Reystlin
пробовал юзать stm32 cubemx
генерирует код и при каждой генерации одного и того-же проекта разные ошибки выдает при комплияции, 10 раз создавал проект и каждый раз по разному.
а где вы расписывали работу с ним? не могли бы вы ссылку кинуть?
Tarbal
Цитата(Reystlin @ Nov 6 2015, 01:07) *
пробовал юзать stm32 cubemx
генерирует код и при каждой генерации одного и того-же проекта разные ошибки выдает при комплияции, 10 раз создавал проект и каждый раз по разному.
а где вы расписывали работу с ним? не могли бы вы ссылку кинуть?


Я нашел видео как переносить проект из куба в бесплатную среду разработки. Оно в этой теме:
http://electronix.ru/forum/index.php?showtopic=131535

У вас для IAR должно сразу заработать.

Говорить что я расписал как с ним работать было бы нескромно с моей стороны. Вы меня неверно поняли.

А нет ли у вас какого-нибудь примера с АЦП в той среде, что вы используете? Может у IAR что-то есть. Спросите в поддержке о примере.
Вы знаете от какого источника приходят тактовые импульсы на АЦП и какова их частота? Возможно поиск ответа на этот вопрос поможет вам найти проблему.
Какое опорное напряжение используется?
АЦП разрешен?

Все проверьте в регистрах, а не полагайтесь на библиотеки. Может не быть какого-то условия, а неправильное исполнение запроса вы не видите.
Reystlin
нашел ошибку
RCC_AHB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);
нужно было
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.