Цитата(GetSmart @ Aug 18 2011, 08:03)

Общие правила работы с LPCxxxx.
1. Если на конкретный блок периферии не указано ограничение, то можно любое, до 100 мгц (LPC17xx).
Да, но в DS+UM все так разбросано, что хрен чего найдешь.
Вот для SPI указано:
Maximum SPI data bit rate of 12.5 Mbit/s
Maximum data bit rate of one eighth of the peripheral clock rate.
Тут понятно что периферийный клок может быть 100мгц (1/1), а вот для I2S написано:
The sampling frequency can range from 16 kHz to 96 kHz (16, 22.05, 32, 44.1, 48,96) kHz.
И тут уже непонятно что его граничивает на 96? Я пробовал, вроде работает и в 4 раза быстрее, но одно дело попробовать на столе, а другое дело - можно ли это использовать, не нарушение-ли спецификации?
Про SSP написано 50мбит/с в мастере и всего 8 в слейве - не очень понятно откуда такая разница? Сама логика (триггеры/гейты) ведь одна и та-же, и наверняка способна до 100мгц работать, почему слейв так ограничен? Это-же не программный опрос, все аппаратно делается!
Про DMA вообще не нашел указаний.
Цитата
2. Чем ниже клок, тем меньше потребление. Можно всегда выставлять 100, можно стараться экономить и ставить минимально необходимое, например делитель 1/8.
3. Чтобы работала вложенность прерываний, нужно их правильно настраивать в NVIC. Глобальный запрет/разрешение прерываний не имеет прямого отношения к вложенности. Эти команды запрещают или разрешают сразу все прерывания.
Я с NVIC только разбираюсь, непонятны некоторые ньюансы.
Например:
Код
/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */
BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */
UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */
SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */
DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */
PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */
SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */
/****** LPC17xx Specific Interrupt Numbers *******************************************************/
WDT_IRQn = 0, /*!< Watchdog Timer Interrupt */
TIMER0_IRQn = 1, /*!< Timer0 Interrupt */
TIMER1_IRQn = 2, /*!< Timer1 Interrupt */
TIMER2_IRQn = 3, /*!< Timer2 Interrupt */
TIMER3_IRQn = 4, /*!< Timer3 Interrupt */
UART0_IRQn = 5, /*!< UART0 Interrupt */
UART1_IRQn = 6, /*!< UART1 Interrupt */
UART2_IRQn = 7, /*!< UART2 Interrupt */
UART3_IRQn = 8, /*!< UART3 Interrupt */
PWM1_IRQn = 9, /*!< PWM1 Interrupt */
I2C0_IRQn = 10, /*!< I2C0 Interrupt */
I2C1_IRQn = 11, /*!< I2C1 Interrupt */
I2C2_IRQn = 12, /*!< I2C2 Interrupt */
SPI_IRQn = 13, /*!< SPI Interrupt */
SSP0_IRQn = 14, /*!< SSP0 Interrupt */
SSP1_IRQn = 15, /*!< SSP1 Interrupt */
PLL0_IRQn = 16, /*!< PLL0 Lock (Main PLL) Interrupt */
RTC_IRQn = 17, /*!< Real Time Clock Interrupt */
EINT0_IRQn = 18, /*!< External Interrupt 0 Interrupt */
EINT1_IRQn = 19, /*!< External Interrupt 1 Interrupt */
EINT2_IRQn = 20, /*!< External Interrupt 2 Interrupt */
EINT3_IRQn = 21, /*!< External Interrupt 3 Interrupt */
ADC_IRQn = 22, /*!< A/D Converter Interrupt */
BOD_IRQn = 23, /*!< Brown-Out Detect Interrupt */
USB_IRQn = 24, /*!< USB Interrupt */
CAN_IRQn = 25, /*!< CAN Interrupt */
DMA_IRQn = 26, /*!< General Purpose DMA Interrupt */
I2S_IRQn = 27, /*!< I2S Interrupt */
ENET_IRQn = 28, /*!< Ethernet Interrupt */
RIT_IRQn = 29, /*!< Repetitive Interrupt Timer Interrupt */
MCPWM_IRQn = 30, /*!< Motor Control PWM Interrupt */
QEI_IRQn = 31, /*!< Quadrature Encoder Interface Interrupt */
PLL1_IRQn = 32, /*!< PLL1 Lock (USB PLL) Interrupt */
} IRQn_Type;
Это значит, что приоритет SysTick выше чем WDT, а приоритет WDT выше приоритета PLL_IRQ, или наоборот?
Могу ли я поменять приоритеты? НАпример сделать SysTick самым низшим? Или для этого в качестве часов лучше
использовать RIT ?
Или вот мне бы хотелось чтобы DMA имел по вохзможности наивысший приоритет, а UARTу наоборот, можно и пониже.
Что жля этого надо изменить, номера в стартапе?
Попутно еще вопрос, вот такой код:
[code]
void I2S_IRQHandler (void){
LPC_GPIO2->FIOPIN |=0x02; // зажигаем светодиод
if ( LPC_I2S->I2SSTATE & 0x01 ) {
LPC_DAC->DACR = (LPC_I2S->I2SRXFIFO>>16);
}
LPC_GPIO2->FIOPIN &=~0x02; // гасим светодиод
return;
}
То есть махаю ножкой со светодиодом, осциллограф показывает что это (проврека условия и переписыание их одного регистра в другой) выполняется аж за 600нс. Я ожидал как-то намного меньше. Где тут собака зарыта?