внезапно обнаружил, что у меня на STM8S003 отказывается работать прерывание АЦП в SCAN режиме. в более другом проекте, откуда дергал код (в т.ч. работы с АЦП), все гладко и шелковисто, но компилировалось более старой версией sdcc несколько лет назад.
после долгих часов безуспешного дебага имеем следующее:
CSR = 0x24 при инициализации, потом становится 0x20; CR1 = 0x1; CR2 = 0x0A; CR3 = 0.
код инициализации:
Код:
GPIOD->DDR &= ~(1<<2 | 1<<3);
GPIOD->CR1 &= ~(1<<2 | 1<<3);
GPIOD->CR2 &= ~(1<<2 | 1<<3);
ADC1->CR1 = 0;
ADC1->CR2 = ADC1_CR2_ALIGN | ADC1_CR2_SCAN;
ADC1->TDRH = 0;
ADC1->TDRL = (1<<3) | (1<<4);
ADC1->CSR = ADC1_CSR_EOCIE | 4;
запуск по таймеру:
Код:
if (!calculate_started) {
ADC1->CSR = ADC1_CSR_EOCIE | 4;
ADC1->CR1 |= ADC1_CR1_ADON;
}
calculate_started = 1;
прерывание:
Код:
INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
{
calculate_started = 0;
//ADC1->CSR = ~(ADC1_CSR_EOC | ADC1_CSR_AWD);
ADC1->CSR = 0;
LED_PORT->ODR ^= LED_PIN;
}
запуск цикла преобразования отрабатывает, calculate_started - висит единица. прерывания - нет...
Добавлено after 1 hour 31 minute 3 seconds:таки да, протупил и невнимательно прочитал мануал, надо дважды в CR0 записать единичку...