Бьюсь об новые грабли...
По даташиту АЦП в LPC1111 может запускаться автоматом от таймера.
Таймер работает правильно (сигнал CT16B0_MAT0 вижу на ноге)
АЦП постоянно вызывает прерывания - то есть только закончилось предыдущее, сразу опять влетает в тот же обработчик. По идее, как я понимаю, бит прерывания должен сниматься при чтении регистра STAT. Не работает.
(Для отладки вывел на ногу многострадального светодиода и тыркаю осциллом).
Код инициализации и хэндлера:
- Код: Выделить всё • Развернуть
void ADCInit( void )
{
// Enable ADC
LPC_SYSCON->PDRUNCFG &= ~(0x1<<4); // Disable Power down bit to the ADC block.
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<13); // Enable AHB clock to the ADC. */
// ADC I/O config
LPC_IOCON->R_PIO1_1 &= ~0x8F;
LPC_IOCON->R_PIO1_1 |= 0x02; // ADC IN2 - SIGNAL INPUT
// ADC config
LPC_ADC->CR = ( 0x04 << 0 ) | // SEL=1,select channel 2 on ADC0 (SIGNAL)
( ( 11 - 1 ) << 8 ) | // CLKDIV = Fpclk / 1000000 - 1
( 0 << 16 ) | // BURST = 0, no BURST, hardware controlled
( 0 << 17 ) | // CLKS = 0, 11 clocks/10 bits
// ( 1 << 21 ) | // PDN = 1, normal operation
// ( 0 << 22 ) | // TEST1:0 = 00
( 6 << 24 ) | // START = 6 A/D conversion start on CT16B0_MAT0
( 1 << 27 ); // EDGE = 1 (CAP/MAT singal rising,trigger A/D conversion)
// Config Interrupt
NVIC_EnableIRQ(ADC_IRQn);
LPC_ADC->INTEN = 0x100; // Enable general interrupt
return;
}
#define LED_RED() { LPC_GPIO1->MASKED_ACCESS[0x0110] = 0x0100; }
#define LED_OFF() { LPC_GPIO1->MASKED_ACCESS[0x0110] = 0x0000; }
void ADC_IRQHandler (void)
{
volatile unsigned int temp;
temp = LPC_ADC->STAT; // Read ADC will clear the interrupt
temp = ( LPC_ADC->DR[2] >> 6 ) & 0x3FF; // Read ADC value
LED_RED();
for(temp=2;temp>0;temp--);
LED_OFF();
return;
}
Добавлено спустя 1 минуту 2 секунды:Re: LPC1111... Вопросы.Если что, использую Кейл
Добавлено спустя 16 минут 38 секунд:Re: LPC1111... Вопросы.Вопрос снят.
Нужно разрешать (оказывается) не глобальное прерывание от АЦП, а прерывание от нужного канала... Дока отвратительная.