Поработал немножко в Keil'е с LPC1114, и вот что почерпнул интересного из багов инициализации АЦП в стандартных примерах от NXP:
Файл 'adc.c':
Рудименты от LPC2xxx в инициализации АЦП:
Код
LPC_ADC->CR = ( 0x01 << 0 ) | /* SEL=1,select channel 0~7 on ADC0 */
( ( SystemAHBFrequency / ADC_Clk - 1 ) << 8 ) | /* CLKDIV = Fpclk / 1000000 - 1 */
( 0 << 16 ) | /* BURST = 0, no BURST, software controlled */
( 0 << 17 ) | /* CLKS = 0, 11 clocks/10 bits */
( 1 << 21 ) | /* PDN = 1, normal operation */
( 0 << 22 ) | /* TEST1:0 = 00 */
( 0 << 24 ) | /* START = 0 A/D conversion stops */
( 0 << 27 ); /* EDGE = 0 (CAP/MAT singal falling,trigger A/D conversion) */
Как видно, в слове инициализации присутствует мифический бит PDN (Power Down), который существует в семействе LPC2xxx, но в семействе LPC1xxx перенесен из слова инициализации АЦП, в регистр управления PDRUNCFG. Т.е. в данном примере, в 1 устанавливается несуществующий бит, который трогать не надо.
Ошибка, связанная с неотключением подтягивающего резистора на Vdd:
Код
LPC_IOCON->PIO1_4 &= ~0x8F; /* Clear bit7, change to analog mode. */
LPC_IOCON->PIO1_4 |= 0x01; /* ADC IN5 */
Вот так в примере предлагается переключать порт микроконтроллера из цифрового состояния (по умолчанию при сбросе), в аналоговое. Как видно, первой командой включается ADMODE порта, очищается поле FUNC, а так же очищается только один младший бит поля MODE. Что отключит нам pull-down резистор, переключит режим repeater-mode в pull-up(!), и не тронет режим pull-up, если он был установлен. Второй командой в поле FUNC устанавливается режим ADC. Таким образом, если у вас был режим pull-up, или же repeater-mode, то он так и останется при переключении в режим АЦП! Проверял на практике, подтягивающий резистор к Vdd остается включенным. А ввиду того, pull-up режим - это режим, в который переходит порт при сбросе, можете быть уверены, что пользуясь стандартным примером от NXP, вы будете измерять сигнал с подтягивающем резистором. Проблема решается просто:
Код
LPC_IOCON->PIO1_4 = 0x01;