то ли лыжи не едут то ли...
Итак:
LPC1768
IAR 5.4
юзаю UART3
CODE
void init_clock(void)
{
FLASHCFG_bit.FLASHTIM = 6-1; // Èñïîëüçîâàòü àêñåëåðàòîðó ïàìÿòè 6 òàêòîâ ÿäðà
SCS_bit.OSCRANGE = 0; // ×àñòîòà êâàðöà îò 1 MHz äî 20 MHz
SCS_bit.OSCEN = 1; // Ðàçðåøàåì ðàáîòó ãëàâíîãî ãåíåðàòîðà
PLL0CON_bit.PLLC = 0; // Îòñîåäèíÿåì PLL0
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
PLL0CON_bit.PLLE = 0; // Çàïðåùàåì PLL0
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
CLKSRCSEL_bit.CLKSRC = 1; // Âûáèðàåì ãëàâíûé ãåíåðàòîð â êà÷åñòâå èñòî÷íèêà äëÿ PLL0
PCLKSEL1_bit.PCLK_UART3 = 1; // UART3 íà ÷àñòîòå ÿäðà
/*
Fcco = 275 MHz ... 550 MHz
Fin = 32 kHz ... 50 MHz
Fcco = (2*M*Fin)/N
Fin = 12 MHz
M = 25
N = 2
Fcco = 300 MHz
*/
PLL0CFG_bit.MSEL = 25-1; // M = 25
PLL0CFG_bit.NSEL = 2-1; // N = 2
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
PLL0CON_bit.PLLE = 1; // Ðàçðåøàåì PLL0
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
while(PLL0STAT_bit.PLOCK); // Æäåì, ïîêà PLL0 âîéäåâ â çàõâàò
CCLKCFG = 3-1; // ßäðî áóäåò ðàáîòàòü íà 1/3 ÷àñòîòû PLL0
PLL0CON_bit.PLLC = 1; // Ïîäñîåäèíÿåì PLL0
/*
Fcpu = 100 MHz
Fuart3 = 100 MHz
Fp = 25 MHz
*/
}
void init_peripheral(void)
{
// Ïèòàíèå ïåðèôåðèè
PCONP_bit.PCUART3 = 1; // Âêëþ÷àåì UART3
// Ôóíêöèè âûâîäîâ
PINSEL0_bit.P0_0 = 2; // P0[0] TXD3 DMX_OUT
PINSEL0_bit.P0_1 = 2; // P0[1] RXD3 DMX_IN
// Èíèöèàëèçàöèÿ ïåðèôåðèè
init_uart3();
init_wdt();
__enable_interrupt();
}
void init_uart3(void)
{
// Ñêîðîñòü
/*
F = Fp/(16*(DLM*256+DLL)*(1+DIV/MUL))
F = 250 kBod
Fp = 100 MHz
DLM = 0
DLL = 25
DIV = 0
MUL = 1
*/
U3LCR_bit.DLAB = 1;
U3DLL = 25;
U3DLM = 0;
U3LCR_bit.DLAB = 0;
// FIFO
U3FCR_bit.FCRFE = 1; // Âêëþ÷àåì FIFO
U3FCR_bit.RTLS = 2; // Ïîðîã ñðàáàòûâàíèÿ 8 ñèìâîëîâ
// Ôîðìàò
U3LCR_bit.WLS = 3; // 8 áèò
U3LCR_bit.SBS = 1; // 2 ñòîï-áèòà
// Ïðåûâàíèÿ
SETENA0_bit.SETENA8 = 1; // Ðàçðåøàåì â NVIC
U3IER_bit.RDAIE = 1; // Ðàçðåøàåì ïðåðûâàíèå ïî âõîäÿùèì äàííûì
U3IER_bit.RXLSIE = 1; // Ðàçðåøàåì ïðåðûâàíèå ïî ñòàòóñó ëèíèè
}
void init_wdt(void)
{
WDCLKSEL_bit.WDSEL = 1; // Èñòî÷íèê ÷àñòîòû Fp
WDCLKSEL_bit.WDLOCK = 1; // Ëî÷èì WDCLKSEL
/*
T = (WDTC*256*4)/Fp
T = 5 ñåê
Fp = 25 MHz
WDTC = 125000
*/
WDTC = 125000; // Ïåðèîä 5,12 ñåê
#ifndef DEBUG
WDMOD_bit.WDEN = 1; // Çàïóñêàåì WDT
WDMOD_bit.WDRESET = 1; // Ðàçðåøàåì WDT ñáðàñûâàòü êîíòðîëëåð
#endif /*DEBUG*/
}
void UART3_IRQHandler(void)
{
uiir = U3IIR;
ulsr = U3LSR;
urbr = U3RBR;
CLRPEND0_bit.CLRPEND8 = 1;
}
{
FLASHCFG_bit.FLASHTIM = 6-1; // Èñïîëüçîâàòü àêñåëåðàòîðó ïàìÿòè 6 òàêòîâ ÿäðà
SCS_bit.OSCRANGE = 0; // ×àñòîòà êâàðöà îò 1 MHz äî 20 MHz
SCS_bit.OSCEN = 1; // Ðàçðåøàåì ðàáîòó ãëàâíîãî ãåíåðàòîðà
PLL0CON_bit.PLLC = 0; // Îòñîåäèíÿåì PLL0
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
PLL0CON_bit.PLLE = 0; // Çàïðåùàåì PLL0
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
CLKSRCSEL_bit.CLKSRC = 1; // Âûáèðàåì ãëàâíûé ãåíåðàòîð â êà÷åñòâå èñòî÷íèêà äëÿ PLL0
PCLKSEL1_bit.PCLK_UART3 = 1; // UART3 íà ÷àñòîòå ÿäðà
/*
Fcco = 275 MHz ... 550 MHz
Fin = 32 kHz ... 50 MHz
Fcco = (2*M*Fin)/N
Fin = 12 MHz
M = 25
N = 2
Fcco = 300 MHz
*/
PLL0CFG_bit.MSEL = 25-1; // M = 25
PLL0CFG_bit.NSEL = 2-1; // N = 2
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
PLL0CON_bit.PLLE = 1; // Ðàçðåøàåì PLL0
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
while(PLL0STAT_bit.PLOCK); // Æäåì, ïîêà PLL0 âîéäåâ â çàõâàò
CCLKCFG = 3-1; // ßäðî áóäåò ðàáîòàòü íà 1/3 ÷àñòîòû PLL0
PLL0CON_bit.PLLC = 1; // Ïîäñîåäèíÿåì PLL0
/*
Fcpu = 100 MHz
Fuart3 = 100 MHz
Fp = 25 MHz
*/
}
void init_peripheral(void)
{
// Ïèòàíèå ïåðèôåðèè
PCONP_bit.PCUART3 = 1; // Âêëþ÷àåì UART3
// Ôóíêöèè âûâîäîâ
PINSEL0_bit.P0_0 = 2; // P0[0] TXD3 DMX_OUT
PINSEL0_bit.P0_1 = 2; // P0[1] RXD3 DMX_IN
// Èíèöèàëèçàöèÿ ïåðèôåðèè
init_uart3();
init_wdt();
__enable_interrupt();
}
void init_uart3(void)
{
// Ñêîðîñòü
/*
F = Fp/(16*(DLM*256+DLL)*(1+DIV/MUL))
F = 250 kBod
Fp = 100 MHz
DLM = 0
DLL = 25
DIV = 0
MUL = 1
*/
U3LCR_bit.DLAB = 1;
U3DLL = 25;
U3DLM = 0;
U3LCR_bit.DLAB = 0;
// FIFO
U3FCR_bit.FCRFE = 1; // Âêëþ÷àåì FIFO
U3FCR_bit.RTLS = 2; // Ïîðîã ñðàáàòûâàíèÿ 8 ñèìâîëîâ
// Ôîðìàò
U3LCR_bit.WLS = 3; // 8 áèò
U3LCR_bit.SBS = 1; // 2 ñòîï-áèòà
// Ïðåûâàíèÿ
SETENA0_bit.SETENA8 = 1; // Ðàçðåøàåì â NVIC
U3IER_bit.RDAIE = 1; // Ðàçðåøàåì ïðåðûâàíèå ïî âõîäÿùèì äàííûì
U3IER_bit.RXLSIE = 1; // Ðàçðåøàåì ïðåðûâàíèå ïî ñòàòóñó ëèíèè
}
void init_wdt(void)
{
WDCLKSEL_bit.WDSEL = 1; // Èñòî÷íèê ÷àñòîòû Fp
WDCLKSEL_bit.WDLOCK = 1; // Ëî÷èì WDCLKSEL
/*
T = (WDTC*256*4)/Fp
T = 5 ñåê
Fp = 25 MHz
WDTC = 125000
*/
WDTC = 125000; // Ïåðèîä 5,12 ñåê
#ifndef DEBUG
WDMOD_bit.WDEN = 1; // Çàïóñêàåì WDT
WDMOD_bit.WDRESET = 1; // Ðàçðåøàåì WDT ñáðàñûâàòü êîíòðîëëåð
#endif /*DEBUG*/
}
void UART3_IRQHandler(void)
{
uiir = U3IIR;
ulsr = U3LSR;
urbr = U3RBR;
CLRPEND0_bit.CLRPEND8 = 1;
}
проект в аттаче
на входе осциллограмма:

шлю 0x55, 8 бит, 2 стоповых, без четности. скорость 250 кбод.
уже не знаю, куда копать: в отладчике делаю Live Watch для переменных
uiir, ulsr, urbr. и получаю одну и ту же картину:
uiir = 0xcc
ulsr = 0x61
urbr = 0xff
т.е. CTI постоянно...
как быть? куда копать? ткните носом.
спасибо